2010-11-11 12 views
15

¿Cómo puedo crear un NSDate del día, mes y año? No parece haber ningún método para hacer esto y han eliminado el método de clase dateWithString (¿por qué harían eso ?!).¿Cómo crear un objeto de fecha NSDate?

+2

dateWithString: se ha ido porque en el pasado se definió para aplicar la heurística de adivinar qué fecha una cadena significaba para describir. Tales conjeturas no siempre fueron particularmente precisas, y definitivamente no era una buena manera de abogar por que las personas escriban sus aplicaciones. Las respuestas a continuación son correctas: filosóficamente, necesitas saber qué calendario estás usando para una fecha que no sea ambigua, por lo que las clases de Cocoa están organizadas en torno a eso. – Tommy

Respuesta

36

Se podría escribir una categoría para esto. Lo hice, así es como el código es:

// NSDateCategory.h 

#import <Foundation/Foundation.h> 

@interface NSDate (MBDateCat) 

+ (NSDate *)dateWithYear:(NSInteger)year month:(NSInteger)month day:(NSInteger)day; 

@end 



// NSDateCategory.m 

#import "NSDateCategory.h" 

@implementation NSDate (MBDateCat) 

+ (NSDate *)dateWithYear:(NSInteger)year month:(NSInteger)month day:(NSInteger)day { 
    NSCalendar *calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease]; 
    NSDateComponents *components = [[[NSDateComponents alloc] init] autorelease]; 
    [components setYear:year]; 
    [components setMonth:month]; 
    [components setDay:day]; 
    return [calendar dateFromComponents:components]; 
} 

@end 

utilizar de esta manera: Respuesta NSDate *aDate = [NSDate dateWithYear:2010 month:5 day:12];

+10

Me hace pensar en la cantidad de código que se necesitará escribir solo para crear una fecha en el objetivo C. – TheLearner

+2

El argumento de defensa sería que un NSDate identifica de forma única un momento en la historia de la Tierra. Hay muchas maneras de escribir una fecha (de uso común en la actualidad, al menos los calendarios gregoriano, hebreo e islámico), por lo que es una cuestión lógica por separado. En Cocoa usas un objeto NSCalendar para eliminar la ambigüedad. Y el costo es que lo que puede querer ser una línea de código termina siendo seis, lo cual, como en la respuesta de fluchtpunkt, es bastante fácil de descifrar en el código de la biblioteca. – Tommy

12

Puede utilizar NSDateComponents:

NSDateComponents *comps = [[NSDateComponents alloc] init]; 
[comps setDay:6]; 
[comps setMonth:5]; 
[comps setYear:2004]; 
NSCalendar *gregorian = [[NSCalendar alloc] 
    initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; 
NSDate *date = [gregorian dateFromComponents:comps]; 
[comps release]; 
+3

Esta debería ser la respuesta aceptada – Woodstock

5

un poco diferente a los ya publicado; si tiene un formato de cadena fijo que le gustaría utilizar para crear las fechas a continuación, puede utilizar algo como:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 

dateFormatter.locale = [NSLocale localeWithIdentifier:@"en_US_POSIX"]; 
    // see QA1480; NSDateFormatter otherwise reserves the right slightly to 
    // modify any date string passed to it, according to user settings, per 
    // it's other use, for UI work 

dateFormatter.dateFormat = @"dd MMM yyyy"; 
    // or whatever you want; per the unicode standards 

NSDate *dateFromString = [dateFormatter dateFromString:stringContainingDate]; 
Cuestiones relacionadas