95 votes

iPhone OS : Comment créer une NSDate pour une date spécifique ?

Cela semble simple, mais je n'arrive pas à trouver le moyen de le faire.

Ce serait bien de voir quelques méthodes différentes.

206voto

Oded Ben Dov Points 4465

La réponse de @Chuck est correcte, et m'a conduit au code suivant. J'ai pensé que je devais le partager :

NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setDay:10];
[comps setMonth:10];
[comps setYear:2010];
NSDate *date = [[NSCalendar currentCalendar] dateFromComponents:comps];

19voto

kamleshwar Points 1319

Vous pouvez utiliser ce

NSString *dateString = @"03-Sep-11";
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"dd-MMM-yy";
NSDate *date = [dateFormatter dateFromString:dateString];

J'espère que cela vous aidera.

16voto

Chuck Points 138930

Si vous parlez d'une date de calendrier spécifique plutôt que d'une date UNIX, vous voudrez probablement utiliser la fonction de NSCalendar dateFromComponents: .

8voto

zoul Points 51637

Voir la documentation de NSDate . Vous pouvez utiliser le dateFromString: méthode de NSDateFormatter ou le dateFromComponents: méthode de NSCalendar .

2voto

Mike Gledhill Points 2105

C'est ridicule, n'est-ce pas ?

Mi-2013 et Apple toujours n'a pas fourni un moyen simple de définir une valeur NSDate.

Dans le cadre de mon projet iPad actuel, je n'en revenais pas d'avoir dû interrompre ma productivité pendant un moment pour écrire ma propre classe d'aide pour obtenir la valeur Year d'un NSDate. Je veux dire, allez, c'est un truc de base.

Quoi qu'il en soit, voici la classe d'aide que j'ai utilisée dans mon projet, pour convertir une chaîne de caractères en une valeur NSDate :

@implementation DateHelper

+(NSDate*)parseDateString:(NSString *)dateString
{
    NSDateFormatter *rfc3339TimestampFormatterWithTimeZone = [[NSDateFormatter alloc] init];
    [rfc3339TimestampFormatterWithTimeZone setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]];
    [rfc3339TimestampFormatterWithTimeZone setDateFormat:@"MMM dd, yyyy"];

    NSDate *theDate = nil;
    NSError *error = nil;
    if (![rfc3339TimestampFormatterWithTimeZone getObjectValue:&theDate forString:dateString range:nil error:&error]) {
        NSLog(@"Date '%@' could not be parsed: %@", dateString, error);
    }

    return theDate;
}

@end

En utilisant ce code, vous pourriez définir une valeur NSDate en utilisant quelque chose comme :

NSDate* date = [DateHelper parseDateString:@"Jul 16, 2013"];

Note : cette fonction est basée sur un code tiré d'ici : https://stackoverflow.com/a/3968411/391605

Ma solution avait été d'utiliser le code suivant, mais j'ai découvert que parfois il n'a pas été analysé, et a retourné néant .

//  Take a date string in the format "Oct 23, 2013", and convert it into a NSDate value
//  THIS DOESN'T WORK !  DON'T TRUST THIS CODE !!
NSDateFormatter* formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"MMM dd, yyyy"];
[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];

NSDate* date = [formatter dateFromString:dateString];

Je me souviens qu'elle a échoué lamentablement sur "Oct 12, 2012"... c'est pourquoi j'ai abandonné et utilisé la fonction plus compliquée "parseDateString" présentée ci-dessus.

Ce que je veux dire, c'est... soyez prudent.

Certaines des fonctions très basiques de NSDate ne fonctionnent pas correctement...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X