2013-09-06 7 views
9

ho uno strano problema con quelle righe di codice:rendimenti Data formattatore nullo per giugno

NSDateFormatter * df = [[NSDateFormatter alloc] init]; 
[df setDateFormat:@"MMyyyy"]; 
NSDate * date = [df dateFromString:@"062008"]; 
NSLog(@"Date %@", date); 

Il risultato è:

Date (null) 

Ma quando cambio del mese in questo modo:

NSDateFormatter * df = [[NSDateFormatter alloc] init]; 
[df setDateFormat:@"MMyyyy"]; 
NSDate * date = [df dateFromString:@"072008"]; 
NSLog(@"Date %@", date); 

Il risultato è:

Date 2008-06-30 23:00:00 +0000 

Per il solo mese di giugno (06), la conversione della data da stringa non riesce!

Penso, è qualcosa legato al fuso orario, a qualsiasi idea.

Grazie

risolto:

[df setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]]; 

Come pensavo, è relative a fuso orario.

+3

Scrivi la tua risposta e fai clic sulla risposta: ti farà ottenere punti e renderà più chiaro per gli altri che seguono. –

+0

E nella tua risposta, potresti spiegare più dettagliatamente: in che modo è correlato al fuso orario? OK, cambiando il fuso orario in GMT lo "riparavamo", ma l'ha fatto * davvero * risolto? Qual'era il problema? Se questa è veramente una correzione e non solo una benda, come risolve il problema? –

+0

A proposito: in che fuso orario * sei *? Quando eseguo quel codice, e apparentemente quando hussain Shabbir (dalle risposte) lo esegue, entrambi riceviamo una data per '@" 062008 "'. Non lo fai, quindi che fuso orario e calendario utilizza il tuo formattatore? Se lo hai lasciato alle impostazioni predefinite, a che fuso orario e calendario è impostato il tuo sistema? –

risposta

1

risolto: Come ho pensato, è correlato al fuso orario.

[df setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]]; 
1

sì! hai assolutamente ragione. Sono anche affrontato lo stesso problema come il mio pensiero anche, è legato alla timezone.Not sicuro se questa è la soluzione ideale per la tua domanda

NSString *[email protected]"06-2008"; 
NSDateFormatter * df = [[NSDateFormatter alloc] init]; 
[df setDateFormat:@"MM-yyyy"]; 
[df setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]]; 
NSDate * date = [df dateFromString:strDate]; 
NSLog(@"Date %@", date); 
+0

Cambiare il formato in cui sono scritte le date non è sempre un'opzione e non rivela nulla su ciò che ha causato NSDateFormatter restituire 'nil' per quella data in quel formato. –

11

Congratulazioni, hai trovato più stranezze di fuso orario! Hai ragione sul fatto che la modifica del fuso orario risolverà il problema. Andiamo speleologi e vediamo se riusciamo a capire perché!

In primo luogo, cercheremo e troveremo ogni fuso orario in cui questo accade stranezza:

NSArray *tzs = [NSTimeZone knownTimeZoneNames]; 
NSDateFormatter *f = [[NSDateFormatter alloc] init]; 
f.dateFormat = @"MMyyyy"; 
for (NSString *name in tzs) { 
    f.timeZone = [NSTimeZone timeZoneWithName:name]; 
    NSDate *date = [f dateFromString:@"062008"]; 
    if (date == nil) { 
     NSLog(@"%@", name); 
    } 
} 

questo sta andando a ciclo attraverso tutti i fusi orari conosciuti e cerchiamo di analizzare "062.008" in quel fuso orario. Se corriamo questo, troviamo che registra:

Africa/Casablanca 
Asia/Karachi 

quindi immagino che si vive in uno Casablanca o Karachi (perché per impostazione predefinita, il tuo NSDateFormatter viene inizializzato con vostro fuso orario, che è il motivo per cui si stiamo vedendo questo problema, probabilmente Casablanca, visto che sembra essere 1 ora avanti rispetto al GMT).

Vediamo se siamo in grado di capire cosa c'è di strano con quei fusi orari:

$ zdump -v Africa/Casablanca 
... snip ... 
Africa/Casablanca Sun Jun 1 00:00:00 2008 UTC = Sun Jun 1 01:00:00 2008 WEST isdst=1 
... snip ... 

$ zdump -v Asia/Karachi 
... snip ... 
Asia/Karachi Sat May 31 19:00:00 2008 UTC = Sun Jun 1 01:00:00 2008 PKST isdst=1 
... snip ... 

abbastanza sicuro, sembra che sia Casablanca e Karachi saltato la mezzanotte il 1 ° giugno del 2008. In tal modo, si è essenzialmente dandogli una data impareggiabile, e sta restituendo nil. In poche parole.

In questo caso, la risposta corretta è di cambiare il fuso orario (GMT è probabilmente una grande scelta), perché è probabile che questa stringa si sta analisi non viene da input dell'utente (dato il suo formato strano), e quindi dovrebbe essere analizzato secondo un fuso orario standard. E anche se sono sicuro che Casablanca e Karachi siano davvero dei posti puliti, i loro fusi orari non sono esattamente comuni ...

TL; DR:

ora legale dovrebbe essere abolita.

Problemi correlati