iPhone OS: come si crea un NSDate per una data specifica?


Risposte:


211

@ La risposta di Chuck è corretta e conducimi al seguente codice. Ho pensato di condividere:

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

7
Nota c'è anche setHour, setMinute, setSecond, ecc per più fine granularità.
devios1

19

Puoi usarlo

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

Spero che questo ti possa aiutare.


Fai attenzione quando usi la funzione "dateFromString": ho scoperto che con alcune date perfettamente valide, fallirebbe miseramente. Vedi il mio post qui sotto per un modo alternativo di analizzare le stringhe di data.
Mike Gledhill

Il modo in cui Oded Ben menziona è anche un altro modo migliore ..... NSDateComponents * comps = [[NSDateComponents alloc] init]; [comps setDay: 10]; [comps setMonth: 10]; [comps setYear: 2010]; NSDate * date = [[NSCalendar currentCalendar] dateFromComponents: comps];
Kamleshwar

16

Se stai parlando di una data di calendario specifica piuttosto che di una data UNIXy, probabilmente vorrai NSCalendar dateFromComponents:.


9

Esempi rapidi

Gli esempi sono spesso il modo più semplice per imparare. Ecco alcuni esempi.

Adesso

Questo è il più semplice.

let currentDateTime = Date()

20 febbraio 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 aprile 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)

Hai bisogno di maggiori dettagli ...?

Esistono anche altri modi per creare le date. Se vuoi imparare quelli e come visualizzare una data, vedi la mia risposta più completa .


8

Consulta la documentazione per NSDate . È possibile utilizzare il dateFromString:metodo NSDateFormattero il dateFromComponents:metodo di NSCalendar.


Continuo a ricevere questa data: "1969-12-31 16:00:00" -0800 quando si utilizza la data dalla stringa
nickthedude

NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init]; NSDate * captureStartDate = [dateFormatter dateFromString: @ "Jan 2, 2001"]; NSLog (@ "% @", [captureStartDate descrizione]); output: 2010-04-05 10: 49: 47.688 Calendar2 [21339: 207] 1969-12-31 16:00:00 -0800
nickthedude

Forse hai bisogno di impostare alcuni parametri sulla data formattata invece che semplice init?
Zoul

3

Ho trovato questo thread mentre cercavo una risposta a questa domanda, ma poi ho trovato un buon esempio in un mio libro di programmazione Objective-C di Big Nerd Ranch. Ringraziamo loro, non me.

  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];

2

È ridicolo, no?

Metà del 2013 e Apple ancora non ha fornito un modo semplice per impostare un valore NSDate.

Durante il mio attuale progetto sull'iPad, non potevo credere di dover interrompere la produttività per un po 'per scrivere la mia classe di supporto per ottenere il valore dell'anno da un NSDate. Voglio dire, dai, questa è roba di base.

Ad ogni modo, ecco la classe helper che ho usato nel mio progetto, per convertire una stringa in un valore 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

Usando questo codice, puoi impostare un valore NSDate usando qualcosa come:

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

Nota: questa funzione era basata sul codice preso da qui: https://stackoverflow.com/a/3968411/391605

La mia soluzione era stata quella di utilizzare il codice seguente, ma ho scoperto che a volte non veniva analizzato e restituiva zero .

//  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];

Ricordo che è fallito miseramente il "12 ottobre 2012" ... motivo per cui ho rinunciato e ho usato la funzione più complicata "parseDateString" mostrata sopra.

Il mio punto è ... stai attento.

Alcune delle funzioni NSDate di base semplicemente non funzionano correttamente ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.