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

Réponses:

211

La réponse de @ Chuck est correcte et m'amène au code suivant. Je pensais que je partagerais:

NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setDay:10];
[comps setMonth:10];
[comps setYear:2010];
NSDate *date = [[NSCalendar currentCalendar] dateFromComponents:comps];
Oded Ben Dov
la source
7
Remarque il y a aussi setHour, setMinute, setSecond, etc. pour une granularité plus fine.
devios1
19

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.

Kamleshwar
la source
Soyez prudent en utilisant la fonction "dateFromString" - j'ai trouvé qu'avec des dates parfaitement valides, cela échouerait lamentablement. Voir mon article ci-dessous pour une autre façon d'analyser les chaînes de date.
Mike Gledhill
La façon dont Oded Ben mentionne est également une autre meilleure façon ..... NSDateComponents * comps = [[NSDateComponents alloc] init]; [comps setDay: 10]; [comps setMonth: 10]; [comps setYear: 2010]; NSDate * date = [[NSCalendar currentCalendar] dateFromComponents: comps];
Kamleshwar
16

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

Mandrin
la source
9

Exemples Swift

Les exemples sont souvent la manière la plus simple d'apprendre. Voici quelques exemples.

Maintenant

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 en savoir plus, ainsi que comment afficher une date, consultez ma réponse plus complète .

Suragch
la source
8

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

zoul
la source
Je continue à recevoir cette date: "1969-12-31 16:00:00" -0800 lors de l'utilisation de la date de la chaîne
nickthedude
NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init]; NSDate * capturéStartDate = [dateFormatter dateFromString: @ "2 janvier 2001"]; NSLog (@ "% @", [description de la captureStartDate]); sortie: 2010-04-05 10: 49: 47.688 Calendar2 [21339: 207] 1969-12-31 16:00:00 -0800
nickthedude
Peut-être avez-vous besoin de définir certains paramètres sur la date formatée au lieu de simple init?
zoul
3

J'ai trouvé ce fil en cherchant une réponse à cette question, mais j'ai trouvé un bon exemple dans un de mon livre de programmation Objective-C Big Nerd Ranch. Merci à 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];
Lev Chlumov
la source
2

C'est ridicule, non?

Mi-2013 et Apple n'a toujours pas fourni de 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 afin d'obtenir la valeur de l'année d'un NSDate. Je veux dire, allez, ce sont des trucs basiques.

Quoi qu'il en soit, voici la classe d'assistance que j'ai utilisée dans mon projet, pour convertir une chaîne 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 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 du code tiré d'ici: https://stackoverflow.com/a/3968411/391605

Ma solution avait été d'utiliser le code suivant, mais j'ai trouvé que parfois , il n'analysait tout simplement pas et renvoyait 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 plus compliquée "parseDateString" montrée ci-dessus.

Mon point est ... soyez prudent.

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

Mike Gledhill
la source