objective c - NSDate obtener año/mes/día
objective-c nsdatecomponents (17)
Nuevo en iOS 8
ObjC
NSDate *date = [NSDate date];
NSInteger era, year, month, day;
[[NSCalendar currentCalendar] getEra:&era year:&year month:&month day:&day fromDate:date];
Rápido
let date = NSDate.init()
var era = 0, year = 0, month = 0, day = 0
NSCalendar.currentCalendar().getEra(&era, year:&year, month:&month, day:&day, fromDate: date)
¿Cómo puedo obtener el año / mes / día de un objeto NSDate
no NSDate
otra información? Me doy cuenta de que probablemente podría hacer esto con algo similar a esto:
NSCalendar *cal = [[NSCalendar alloc] init];
NSDateComponents *components = [cal components:0 fromDate:date];
int year = [components year];
int month = [components month];
int day = [components day];
Pero eso parece ser un gran problema para algo tan simple como obtener un año / mes / día de NSDate
. hay alguna otra solucion?
A partir de iOS 8.0 (y OS X 10), puede utilizar el método de componentes para simplificar la obtención de un componente de fecha única, como por ejemplo:
int year = [[NSCalendar currentCalendar] component:NSCalendarUnitYear fromDate:[NSDate date]];
Debería simplificar las cosas y ojalá esto se implemente de manera eficiente.
Aquí está la solución en Swift:
let todayDate = NSDate()
let calendar = NSCalendar(identifier: NSCalendarIdentifierGregorian)!
// Use a mask to extract the required components. Extract only the required components, since it''ll be expensive to compute all available values.
let components = calendar.components(.CalendarUnitYear | .CalendarUnitMonth | .CalendarUnitDay, fromDate: todayDate)
var (year, month, date) = (components.year, components.month, components.day)
Como aparentemente esta es mi respuesta más popular, intentaré editarla para que contenga un poco más de información.
A pesar de su nombre, NSDate
simplemente marca un punto en el tiempo de la máquina, no una fecha. No hay correlación entre el punto en el tiempo especificado por un NSDate
y un año, mes o día. Para eso, tienes que referirte a un calendario. Cualquier punto en el tiempo devolverá información de fecha diferente según el calendario que esté viendo (las fechas no son las mismas en los calendarios gregoriano y judío, por ejemplo), y mientras que el calendario gregoriano es el calendario más utilizado en el calendario. mundo - NSDate
- estamos un poco sesgados en que NSDate
siempre debería usarlo. NSDate
, por suerte, es mucho más bipartidista.
Obtener fecha y hora tendrá que pasar por NSCalendar
, como mencionaste, pero hay una forma más sencilla de hacerlo:
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]];
Eso genera un objeto NSDateComponents
que contiene el día, mes y año del calendario actual del sistema para el día actual. ( Nota: este no es necesariamente el calendario actual especificado por el usuario , solo el predeterminado del sistema).
Por supuesto, si está utilizando un calendario o fecha diferente, puede cambiarlo fácilmente. Puede encontrar una lista de calendarios y unidades de calendario disponibles en la Referencia de la clase NSCalendar
. Puede encontrar más información sobre NSDateComponents
en la Referencia de clase de NSDateComponents
.
Para referencia, acceder a componentes individuales desde NSDateComponents
es bastante fácil:
NSInteger day = [components day];
NSInteger month = [components month];
NSInteger year = [components year];
Solo debe tener en cuenta: NSDateComponents
no contendrá información válida para los campos que solicite a menos que los haya generado con esa información válida (es decir, solicite a NSCalendar
que proporcione esa información con NSCalendarUnit
). NSDateComponents
no contiene información de referencia en sí mismos, solo son estructuras simples que contienen números a los que puede acceder. Si también desea obtener una era, por ejemplo, de NSDateComponents
, tendrá que alimentar el método generador de NSCalendar
con la bandera NSCalendarUnitEra
.
En Swift 2.0:
let date = NSDate()
let calendar = NSCalendar(identifier: NSCalendarIdentifierGregorian)!
let components = calendar.components([.Month, .Day], fromDate: date)
let (month, day) = (components.month, components.day)
Estoy escribiendo esta respuesta porque es el único enfoque que no te devuelve las NSDateComponent
variables NSDateComponent
y / o forza el desenvolvimiento de esas variables (también para Swift 3).
Swift 3
let date = Date()
let cal = Calendar.current
let year = cal.component(.year, from: date)
let month = cal.component(.month, from: date)
let day = cal.component(.day, from: date)
Swift 2
let date = NSDate()
let cal = NSCalendar.currentCalendar()
let year = cal.component(.Year, fromDate: date)
let month = cal.component(.Month, fromDate: date)
let day = cal.component(.Day, fromDate: date)
Bonus Swift 3 fun version
let date = Date()
let component = { (unit) in return Calendar.current().component(unit, from: date) }
let year = component(.year)
let month = component(.month)
let day = component(.day)
Intenta lo siguiente:
NSString *birthday = @"06/15/1977";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"MM/dd/yyyy"];
NSDate *date = [formatter dateFromString:birthday];
if(date!=nil) {
NSInteger age = [date timeIntervalSinceNow]/31556926;
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:date];
NSInteger day = [components day];
NSInteger month = [components month];
NSInteger year = [components year];
NSLog(@"Day:%d Month:%d Year:%d Age:%d",day,month,year,age);
}
[formatter release];
Para obtener una cadena humana legible (día, mes, año), puede hacer:
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
NSString *string = [dateFormatter stringFromDate:dateEndDate];
Prueba esto . . .
Fragmento de código:
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]];
int year = [components year];
int month = [components month];
int day = [components day];
Da el año actual, mes, fecha
Puede obtener un componente separado de un NSDate usando NSDateFormatter:
NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"dd"];
myDayString = [df stringFromDate:[NSDate date]];
[df setDateFormat:@"MMM"];
myMonthString = [df stringFromDate:[NSDate date]];
[df setDateFormat:@"yy"];
myYearString = [df stringFromDate:[NSDate date]];
Si desea obtener el número del mes en lugar de la abreviatura, use "MM". Si desea obtener números enteros, use [myDayString intValue];
Si desea obtener los NSDateComponents individuales de NSDate, definitivamente necesitará la solución sugerida por Itai Ferber. Pero si desea pasar de NSDate directamente a una NSString, puede usar NSDateFormatter .
Si está apuntando a iOS 8+, puede usar los nuevos métodos de conveniencia de NSCalendar
para lograr esto en un formato más conciso.
Primero cree un NSCalendar
y use cualquier NSDate
requerido.
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *date = [NSDate date];
Podría extraer componentes individualmente a través de component:fromDate:
NSInteger year = [calendar component:NSCalendarUnitYear fromDate:date];
NSInteger month = [calendar component:NSCalendarUnitMonth fromDate:date];
NSInteger day = [calendar component:NSCalendarUnitDay fromDate:date];
O, aún más sucintamente, use los punteros NSInteger
través de getEra:year:month:day:fromDate:
NSInteger year, month, day;
[calendar getEra:nil year:&year month:&month day:&day fromDate:date];
Para obtener más información y ejemplos, consulte NSDate Manipulation Made Easy en iOS 8 . Descargo de responsabilidad, escribí el post.
Solo para volver a redactar el excelente código de Itai (¡y en funcionamiento!), Esto es el aspecto que tendría una clase de ayudante de muestra, para devolver el valor anual de una variable NSDate determinada.
Como puede ver, es bastante fácil modificar este código para obtener el mes o el día.
+(int)getYear:(NSDate*)date
{
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:date];
int year = [components year];
int month = [components month];
int day = [components day];
return year;
}
(No puedo creer que tengamos que escribir nuestras propias funciones básicas de fecha de iOS como esta, en 2013 ...)
Otra cosa: nunca uses <y> para comparar dos valores de NSDate.
XCode aceptará felizmente dicho código (sin errores ni advertencias), pero sus resultados son una lotería. Debes usar la función "comparar" para comparar NSDates:
if ([date1 compare:date2] == NSOrderedDescending) {
// date1 is greater than date2
}
Swift 2.x
extension NSDate {
func currentDateInDayMonthYear() -> String {
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "d LLLL yyyy"
return dateFormatter.stringFromDate(self)
}
}
Puedes usarlo como
NSDate().currentDateInDayMonthYear()
Salida
6 March 2016
lo hago de esta manera ....
NSDate * mydate = [NSDate date];
NSCalendar * mycalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSCalendarUnit units = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay;
NSDateComponents * myComponents = [mycalendar components:units fromDate:mydate];
NSLog(@"%d-%d-%d",myComponents.day,myComponents.month,myComponents.year);
Rápido
Una forma más fácil de obtener cualquier elemento de fecha como una Cadena opcional.
extension Date {
// Year
var currentYear: String? {
return getDateComponent(dateFormat: "yy")
//return getDateComponent(dateFormat: "yyyy")
}
// Month
var currentMonth: String? {
return getDateComponent(dateFormat: "M")
//return getDateComponent(dateFormat: "MM")
//return getDateComponent(dateFormat: "MMM")
//return getDateComponent(dateFormat: "MMMM")
}
// Day
var currentDay: String? {
return getDateComponent(dateFormat: "dd")
//return getDateComponent(dateFormat: "d")
}
func getDateComponent(dateFormat: String) -> String? {
let format = DateFormatter()
format.dateFormat = dateFormat
return format.string(from: self)
}
}
let today = Date()
print("Current Year - /(today.currentYear)") // result Current Year - Optional("2017")
print("Current Month - /(today.currentMonth)") // result Current Month - Optional("7")
print("Current Day - /(today.currentDay)") // result Current Day - Optional("10")
NSDate *currDate = [NSDate date];
NSCalendar* calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents* components = [calendar components:NSDayCalendarUnit|NSMonthCalendarUnit|NSYearCalendarUnit fromDate:currDate];
NSInteger day = [components day];
NSInteger month = [components month];
NSInteger year = [components year];
NSLog(@"%d/%d/%d", day, month, year);