¿Cómo obtener NSDate día, mes y año en formato entero?

95

Quiero obtener los componentes de día, mes y año NSDateen forma de número entero, es decir, si la fecha es 1/2/1988, entonces debería obtener 1, 2 y 1988 por separado como un número entero. ¿Cómo puedo hacer esto en iOS? Encontré una pregunta similar, pero el método descriptionWithCalendarFormat: da una advertencia y parece estar obsoleto a estas alturas.

Yogui
fuente
Consulte Convertir NSDate en un entero si solo se necesita un entero para NSDate.
Suragch

Respuestas:

223

Aquí estás,

NSDate *currentDate = [NSDate date];
NSCalendar* calendar = [NSCalendar currentCalendar];
NSDateComponents* components = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:currentDate]; // Get necessary date components

 [components month]; //gives you month
 [components day]; //gives you day
 [components year]; // gives you year

Puede usar NSDateComponents para eso como se indicó anteriormente.

Visite esta página para obtener más detalles.

Espero eso ayude.

Janak Nirmal
fuente
1
+1 por proporcionar el código de la respuesta correcta. Pero debe mencionar que la información proviene de NSDateComponents, no de NSDateFormatter.
Black Frog
@Black Disculpe por eso. Actualicé mi respuesta.
Janak Nirmal
1
@ Janak Nirmal Write sea un punto específico que no pudo explicar cómo obtener el formato de cadena para el día, mes, año, un usuario no pudo entender.
annu
1
@JanakNirmal deberías explicar cómo obtener el valor exacto.
annu
3
Para evitar advertencias de obsolescencia: NSDateComponents * components = [componentes de calendario: NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate: currentDate];
Rodrigo Pinto
17

Sí, mediante el uso de NSCalendar, creo que esto hará que funcione.

NSDateComponents *components = [[NSCalendar currentCalendar] components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:[NSDate date]];
NSInteger day = [components day];    
NSInteger month = [components month];
NSInteger year = [components year];
usuario755278
fuente
13

Rápido

let components = NSCalendar.currentCalendar().components([.Day, .Month, .Year], fromDate: self)
let day = components.day
let month = components.month
let year = components.year

Para mayor comodidad, puede poner esto en una NSDateextensión y hacer que devuelva una tupla:

extension NSDate: Comparable {

    var dayMonthYear: (Int, Int, Int) {
        let components = NSCalendar.currentCalendar().components([.Day, .Month, .Year], fromDate: self)
        return (components.day, components.month, components.year)
    }
}

Ahora solo tienes que escribir:

let (day, month, year) = date.dayMonthYear

Si desea, por ejemplo, obtener solo el año, puede escribir:

let (_, _, year) = date.dayMonthYear
Ixx
fuente
2
Me gusta tu enfoque. Una sugerencia, aunque es cambiar la denominación parámetro para (day: Int, month: Int, year: Int), de esa manera se puede utilizar el resultado mediante el uso de date.dayMonthYear.day, date.dayMonthYear.month, date.dayMonthYear.year.
Paul Peelen
9

Puede usar NSDateComponents para obtener esto,

NSCalendar *calendar = [NSCalendar autoupdatingCurrentCalendar];
NSDate *currDate = [NSDate date];
NSDateComponents *dComp = [calendar components:( NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit ) 
                                      fromDate:currDate];

int day = [dComp day];
int month = [dComp month];
int year = [dComp year];
Desarrollador móvil iOS Android
fuente
8

Ponlo en una extensión y vive tu vida 🍸🏖

extension Date{
    var day:Int {return Calendar.current.component(.day, from:self)}
    var month:Int {return Calendar.current.component(.month, from:self)}
    var year:Int {return Calendar.current.component(.year, from:self)}
}
Date().day//22
Date().month//4
Date().year//2017

Swift 3.0 (es una iteración de respuestas anteriores, pero lo resuelve para todos sus proyectos de aplicaciones futuros)

eonista
fuente
7

Para aquellos que simplemente copian y pegan directamente desde la web, como yo, esta es una pequeña actualización para iOS 8

NSCalendar* calendar = [NSCalendar currentCalendar];
NSDateComponents* components = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:[NSDate date]];
[components day]; //Day
[components month];//Month
[components year];//Year

La diferencia NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay NSMonthCalendarUnit | NSDayCalendarUnit | NSYearCalendarUnit | NSWeekdayCalendarUnitha quedado obsoleta

Jansen
fuente
2

Puedes probar esto .......

Mycal = [NSCalendar currentCalendar];
today = [NSDate date];
compA =[Mycal components:(NSMonthCalendarUnit | NSDayCalendarUnit | NSYearCalendarUnit | NSWeekdayCalendarUnit) fromDate:today];     
FirstDateofMonth=[today dateByAddingTimeInterval:([compA day]-1)*(-24*60*60)];

compA =[Mycal components:(NSMonthCalendarUnit | NSDayCalendarUnit | NSYearCalendarUnit | NSWeekdayCalendarUnit) fromDate:FirstDateofMonth];
today = FirstDateofMonth;
compA = [Mycal components:(NSMonthCalendarUnit | NSDayCalendarUnit | NSYearCalendarUnit | NSWeekdayCalendarUnit) fromDate:today];
[compA setMonth:([compA month])];
[self DrawMonthInPortraitView];
[compA retain];
Dinesh_
fuente
1
NSDate *currentDate = [NSDate date];
NSCalendar* calendar = [NSCalendar currentCalendar];
NSDateComponents* components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:currentDate]; // Get necessary date components

[components month]; //gives you month
[components day]; //gives you day
[components year]; // gives you year

NSString *temp=[NSString stringWithFormat:@"Months:%d Day:%d Year:%d",[components month],  [components day],[components year]];
NSLog(@"%@",temp);
annu
fuente
1
let date = Date()
let calendar = Calendar.current

let year = calendar.component(.year, from: date)
let month = calendar.component(.month, from: date)
let day = calendar.component(.day, from: date)
print("hours = \(year):\(month):\(day)")
oscarr
fuente
1
Si bien este código puede responder la pregunta, proporcionar un contexto adicional sobre por qué y / o cómo este código responde a la pregunta mejora su valor a largo plazo.
Donald Duck