2011-10-11 25 views
7

Ho un'app che mostra un orario di alcuni viaggi in traghetto.NSDate indipendente dal fuso orario?

Se viaggio in un altro fuso orario - diciamo 4 ore indietro, un viaggio in traghetto delle 10:00 ora si presenta alle 6:00?

So che questo ha a che fare con il modo in cui le date vengono gestite in base al loro fuso orario, ma non riesco a capire come modificare tale comportamento.

Al momento ecco come io sono sempre la data e la visualizzazione su un UILabel:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"HH:mm"]; 
[self.departureTime setText:[dateFormatter stringFromDate:[self.route objectForKey:@"departureTime"]]]; 
[self.arrivalTime setText:[dateFormatter stringFromDate:[self.route objectForKey:@"arrivalTime"]]]; 
[dateFormatter release]; 

Grazie in anticipo per il vostro aiuto.

+4

Capire che NSDate stessa è indipendente da fuso orario - rappresenta UTC (Greenwich) tempo. È necessario impostare il fuso orario di NSDateFormatter per produrre risultati per il fuso orario desiderato. –

+3

@DanielRHicks Una data ha * no * fuso orario.Non * rappresenta * UTC, perché UTC è un fuso orario e una data non ha un fuso orario. –

+0

L'offset di tempo in un NSDate è, per convenzione, lo scostamento temporale rispetto a UTC. E l'impostazione del fuso orario di NSDateFormatter sarà inutile se l'oggetto NSDate non è impostato rispetto a UTC. –

risposta

7

È necessario memorizzare il fuso orario che il viaggio in traghetto si svolge in e formattarlo per questo fuso orario.

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"HH:mm"]; 

NSDate *now = [NSDate date]; 
NSLog(@"now:%@", [dateFormatter stringFromDate:now]); 

NSTimeZone *timeZone = [NSTimeZone timeZoneForSecondsFromGMT:(-8 * 3600)];  
[dateFormatter setTimeZone:timeZone]; 
NSLog(@"adjusted for timezone: %@", [dateFormatter stringFromDate:now]); 

Uscite:

2011-10-10 20:42:23.781 Craplet[2926:707] now:20:42 
2011-10-10 20:42:23.782 Craplet[2926:707] adjusted for timezone: 16:42 
+0

potremmo dover gestire anche il risparmio orario –

0

Non confondere un valore NSDate con un output formattato come NSLog. NSDate è GMT, documentazione di Apple:

L'unico metodo primitivo di NSDate, timeIntervalSinceReferenceDate, fornisce la base per tutti gli altri metodi nell'interfaccia NSDate. Questo metodo restituisce un valore temporale relativo a una data di riferimento assoluto , il primo istante del 1 ° gennaio 2001, GMT.

NSTimeInterval referenceInterval = [[dateFormatter dateFromString:@"1 January 2001 GMT"] timeIntervalSinceReferenceDate]; 
NSLog(@"referenceInterval: %f", referenceInterval); 

NSTimeInterval estInterval = [[dateFormatter dateFromString:@"1 January 2001 EST"] timeIntervalSinceReferenceDate]; 
NSLog(@"estInterval:  %f", estInterval); 

uscita:

referenceInterval: 0.000000 
estInterval: 18000.000000 
+0

Quella citazione di documentazione non significa "NSDate è GMT "perché il 1 gennaio 2001 GMT può essere ugualmente espresso in qualsiasi fuso orario. –

+0

Sto solo cercando di capire cosa intendi per "NSDate è GMT", perché non riesco a vedere in alcun modo che un valore NSDate abbia una nozione interna di un fuso orario preferito rispetto a qualsiasi altro (incluso GMT). Fatta eccezione per il fatto che i documenti citano arbitrariamente la data di riferimento in GMT e forse che NSDate imposterà automaticamente il GMT quando accetta una stringa se non viene fornito esplicitamente un fuso orario. –

+0

Certo che possiamo - ad es. è 0.0 rispetto al 1 gen 2001 02:00 ora di Budapest. –

1

È possibile anche utilizzare la classe NSDateComponents come descritto con riferimento di Apple:

Se è necessario creare una data che è indipendente dal fuso orario, è possibile memorizza la data come oggetto NSDateComponents, a condizione che tu memorizzi qualche riferimento al calendario corrispondente.

In iOS, gli oggetti NSDateComponents possono contenere un calendario, un fuso orario e un oggetto data. È quindi possibile memorizzare il calendario insieme ai componenti. Se si utilizza il metodo data della classe NSDateComponents per accedere alla data, assicurarsi che il fuso orario associato sia aggiornato.

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/DatesAndTimes/Articles/dtTimeZones.html#//apple_ref/doc/uid/20000185-SW1

-1
 NSDate *currentDateTime = datePicker.date; 
     NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
     [dateFormatter setDateFormat:@"EEE,MM-dd-yyyy HH:mm:ss"]; 
     NSString *dateInStringFormated = [dateFormatter stringFromDate:currentDateTime]; 
     NSLog(@"%@", dateInStringFormated);