web-dev-qa-db-fra.com

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

Cela semble être une chose simple, mais je n'arrive pas à trouver un moyen de le faire.

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

93
nickthedude

@ La réponse de Chuck est correcte et conduisez-moi au code suivant. Je pensais partager:

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

Vous pouvez utiliser ceci

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

Espérons que cela va vous aider.

19
Kamleshwar

Si vous parlez d'une date de calendrier spécifique plutôt que d'une date UNIXy, vous voulez probablement le dateFromComponents: De NSCalendar.

16
Chuck

Exemples rapides

Les exemples sont souvent le moyen le plus simple d'apprendre. Voici quelques exemples.

À présent

Celui-ci est le plus simple.

let currentDateTime = Date()

20 février 2017

// Specify date components
var dateComponents = DateComponents()
dateComponents.year = 2017
dateComponents.month = 2
dateComponents.day = 20

// Create date from components
let userCalendar = Calendar.current // user calendar
let dateThisPostWasUpdated = userCalendar.date(from: dateComponents)

1 avril 1976

// Specify date components
var dateComponents = DateComponents()
dateComponents.year = 1976
dateComponents.month = 4
dateComponents.day = 1

// Create date from components
let userCalendar = Calendar.current // user calendar
let appleFoundedDate = userCalendar.date(from: dateComponents)

Besoin de plus de détails ...?

Il existe également d'autres façons de créer des dates. Si vous voulez les apprendre, ainsi que comment afficher une date, alors voir ma réponse plus complète .

9
Suragch

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

8
zoul

J'ai trouvé ce fil en cherchant une réponse à cette question, mais j'ai trouvé un bon exemple dans un de mes livres de programmation Objective-C Big Nerd Ranch. C'est à eux, pas à moi.

  NSDateComponents *myBDay  =[[NSDateComponents alloc] init];
    [myBDay setDay:22];
    [myBDay setMonth: 04];
    [myBDay setYear: 1984];
    [myBDay setHour:9];
    [myBDay setMinute:25];
    [myBDay setSecond:35];

    NSCalendar *g = [[ NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
    NSDate *dateOfBirth = [g dateFromComponents:myBDay];
3
Lev Chlumov

C'est ridicule, non?

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

Au cours de mon projet iPad actuel, je ne pouvais pas croire que je devais arrêter la productivité pendant un certain temps pour écrire ma propre classe d'aide pour obtenir la valeur Year d'un NSDate. Je veux dire, allez, c'est des trucs de base.

Quoi qu'il en soit, voici la classe d'assistance que j'ai utilisée dans mon projet, pour convertir une chaîne en 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 pouvez définir une valeur NSDate en utilisant quelque chose comme:

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

Remarque: cette fonction était basée sur le code extrait d'ici: https://stackoverflow.com/a/3968411/391605

Ma solution avait été d'utiliser le code suivant, mais j'ai trouvé que parfois , il ne serait pas analysé et renverrait nil .

//  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'il a lamentablement échoué le "12 octobre 2012" ... c'est pourquoi j'ai abandonné et utilisé la fonction "parseDateString" plus compliquée montrée ci-dessus.

Mon point est ... soyez prudent.

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

2
Mike Gledhill