2013-02-28 9 views
48

Qual è la differenza esatta tra "AAAA" e "aaaa". Ho letto in this link, si afferma cheDifferenza tra "AAAA" e "aaaa" in NSDateFormatter

Un errore comune è quello di utilizzare YYYY. yyyy specifica l'anno solare mentre YYYY specifica l'anno (di "Settimana dell'anno"), utilizzato nel calendario ISO di anno settimana. Nella maggior parte dei casi, yyyy e YYYY restituiscono lo stesso numero , tuttavia potrebbero essere diversi. In genere, è necessario utilizzare l'anno solare .

Ma quando provo ad usare

NSString *stringDate = @"Feb 28, 2013 05:30pm"; 
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"MMM dd, yyyy hh:mma"]; 
NSDate *date=[dateFormatter dateFromString:stringDate]; 
NSLog(@"Date 1 : %@",date); //2013-02-28 12:00:00 +0000 

NSString *stringDatee = @"Feb 28, 2013 05:30pm"; 
NSDateFormatter *dateFormatterr = [[NSDateFormatter alloc] init]; 
[dateFormatterr setDateFormat:@"MMM dd, YYYY hh:mma"]; 
NSDate *datee=[dateFormatterr dateFromString:stringDatee]; 
NSLog(@"Date 2 : %@",datee); //2013-01-05 12:00:00 +0000 

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
[dateFormat setDateFormat:@"MMM dd, YYYY hh:mma"]; 
NSString *dateString = [dateFormat stringFromDate:datee]; 
NSLog(@"date 3 : %@", dateString); //Jan 05, 2013 05:30PM 

Come qui, portare a date e datee diverso, che ho capito, ma perché frutto di data 2 e la data 3 sono diversi? Mentre sto creando la data da una stringa e invertendo di nuovo la stessa stringa, ma i disallineamenti di output?

Qualcuno conosce la ragione? Sebbene specifichi la settimana dell'anno, dovrei comunque ottenere lo stesso risultato.

Thanks ..

EDIT: -

Se il codice ho

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
[dateFormat setDateFormat:@"MMM dd, YYYY hh:mma"]; 
NSString *dateString = [dateFormatterr stringFromDate:[NSDate date]]; 
NSLog(@"date: %@", dateString); //Feb 28, 2013 04:37PM 

Se i risultati risultato corretto, ma lo stesso che mi passa come stringa fino ad oggi ho 2013-01-05 12:00:00 +0000, controllare la data 2 di NSLog, strano risultato, perché?

+1

Uno dovrebbe guardare il WWDC 2011 video chiamato "Session 117 - Esecuzione Calendario calcoli", 59:11, 142.2 MB (HD)" per ottenere illuminato sulla realtà virtuale, una là StarTrek Nope? Voglio dire calcoli basati su calendario e cosa no ... Se non hai visto questo video per favore guardalo, è molto interessante se ti piace cose del genere –

+0

@DigiMonk Grazie, lo guarderò .. –

+0

[ISO week date] (http://en.wikipedia.org/wiki/ISO_week_date) –

risposta

40

Anche quando si utilizza una stringa di formato data utilizzando il formato corretto è importante.

@ "YYYY" è l'anno solare settimanale.

@ "aaaa" è l'anno civile ordinario.

Si può passare attraverso l'intero blog, è una buona persona che invia un aspetto

http://realmacsoftware.com/blog/working-with-date-and-time

+0

Grazie per la risposta, hai controllato il mio NSLog della data 2 e della data 3? Perché sono diversi? Sto passando lo stesso formato e la stessa cosa .. –

+0

Differenza tra yyyy e YYYY, lo so già, controllo completamente la mia domanda .. –

+1

Spero sia perché stai convertendo un oggetto data in una stringa, questo è il motivo per cui sta dando 2 diversi risultati. –

16

Un errore comune è quello di utilizzare AAAA. yyyy specifica l'anno solare mentre YYYY specifica l'anno (di "Settimana dell'anno"), utilizzato nel calendario ISO anno-settimana. Nella maggior parte dei casi , yyyy e YYYY restituiscono lo stesso numero, tuttavia potrebbero essere diversi. In genere dovresti usare l'anno solare.

da Apple Docs

+2

La stessa cosa che hai incollato dalla mia domanda .. :) Voglio rispondere .. –

+0

Mi dispiace, mio ​​male. Ci sono 52 settimane in un anno. Questo valore deve essere restituito in quale settimana dell'anno è la data. Questo sarebbe utile per il calcolo di voci finanziarie o eventi ricorrenti del calendario. –

+1

Concordo sul fatto che questo identificatore sia confuso e non sia stato ben selezionato. Esistono motivi standard per i quali deve esistere: https://en.wikipedia.org/wiki/ISO_week_date –

2
dd/MMM/YYYY - e.g.:1 01/Jan/2000; answer : 19/dec/1999 
       (see weekly calendar December month last Monday 
       suppose leaf year + 1 day) 
dd/MMM/yyyy - eg: ordinary - no problem. 
+0

Puoi descrivere di più la tua risposta? –

+0

vedere il calendario settimanale solo il mese di dicembre e vedere la data di lunedì. –

0

Tutte le risposte differenziare yyyy e YYYY sono risposte giuste per un'altra domanda. La domanda stessa si riferisce ad un'altra cosa.

Perché questi due valori sono diversi?(estratto dalla domanda)

NSLog(@"Date 2 : %@",datee); //2013-01-05 12:00:00 +0000 
NSLog(@"Date 3 : %@", dateString); //Jan 05, 2013 05:30PM 

La risposta qui @ P.J è che non hanno un valore molto diverso. Quando si registra un NSDate (che è la Data 2) si ottiene la descrizione completa dell'oggetto che si trova in UTC Timezone. Questa logica non si verifica quando si registra la data 3 perché è già stata convertita in una stringa e applicato il fuso orario.

Per la stampa Data 3 lo 'stesso modo' come si stanno ottenendo Data 2. È necessario specificare UTC fuso orario per Data 3. Qualcosa di simile a questo:

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
[dateFormat setDateFormat:@"MMM dd, YYYY hh:mma"]; 
[dateFormat setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; 
NSString *dateString = [dateFormat stringFromDate:datee]; 
NSLog(@"date 3 : %@", dateString); 

Spero che questo aiuti.

tl; dr il fuso orario

Problemi correlati