2010-04-05 21 views

risposta

194

@ risposta di Chuck è corretto, e mi portano 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 ci sono anche 'setHour',' setMinute', 'setSecond', ecc. Per una granularità più fine. – devios1

8

vedere la documentazione per NSDate. È possibile utilizzare il metodo dateFromString: di NSDateFormatter o il metodo dateFromComponents: di NSCalendar.

+0

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

+0

NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init]; NSDate * capturedStartDate = [dateFormatter dateFromString: @ "2 gen 2001"]; NSLog (@ "% @", [descrizione capturedStartDate]); uscita: 2010-04-05 10: 49: 47,688 Calendar2 [21339: 207] 1969/12/31 16:00:00 -0800 – nickthedude

+0

Forse è necessario impostare alcuni parametri sulla data formattata invece di pianura 'init'? – zoul

16

Se si sta parlando di una specifica data di calendario, piuttosto che una data Unixy, probabilmente vuole NSCalendar di dateFromComponents:.

18

È possibile utilizzare questo

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

Spero che questo vi aiuterà fuori.

+0

Fai attenzione alla funzione "dateFromString" - ho scoperto che con alcune date perfettamente valide, fallirebbe miseramente. Vedere il mio post qui sotto per un metodo alternativo di analisi delle stringhe di data. –

+0

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

2

E 'ridicolo, non è vero?

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

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

Comunque, ecco la classe di supporto 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 

Utilizzando questo codice, è possibile impostare un valore di NSDate usando qualcosa come:

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

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

la mia soluzione avevano stato per utilizzare il seguente codice, ma ho trovato che a volte, semplicemente non si analizzerebbe e restituirebbe 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]; 

mi ricordo che fallì miseramente il "12 Ottobre 2012" ... che è il motivo per cui ho rinunciato e usato la più complicata funzione "parseDateString" mostrato sopra.

Il mio punto è ... attenzione.

Alcune delle funzioni molto-base NSDate semplicemente non funzionano correttamente ...

3

ho trovato questa discussione mentre alla ricerca di una risposta a questa domanda, ma poi ho trovato un buon esempio in una mia Big Nerd Ranch Manuale di programmazione Objective-C. Credito a loro, non a 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]; 
6

Esempi Swift

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

Ora

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 Apr 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) 

bisogno di più particolari ...?

Ci sono altri modi per creare le date. Se si desidera apprenderli, nonché su visualizzare una data, quindi see my fuller answer.