In Cocoa, come posso utilizzare NSTimeZone per ottenere l'offset del fuso orario del sistema come stringa?
-
20-08-2019 - |
Domanda
Per PDT, vorrei " -0700 " ;.
Ricevo una data in passato per determinare da quanto tempo è successo qualcosa.
NSDate *then = [NSDate dateWithString:@"1976-04-01 12:34:56 -0700"]; // Note the hard-coded time zone at the end
Costruirò la stringa di date altrove ma non so come accedere al fuso orario locale.
Ho letto gli argomenti di programmazione di date e orari di Apple per Cocoa, nonché i riferimenti alle classi NSTimeZone e NSDate, ma è troppo difficile per me mettere insieme le informazioni. Potrei davvero usare alcune righe di codice solo per mostrare come viene utilizzato.
Aggiorna : mentre ero alle prese con questo, stavo scrivendo codice usando un modello da riga di comando in modo da poter provare rapidamente le cose. Ho appena provato il mio codice precedente su iPhone e sto ricevendo NSDate potrebbe non rispondere a '+ dateWithString:' Scusate se questo ha aggiunto alla confusione, chi sapeva che Apple avrebbe cambiato una classe di base.
Soluzione
L'offset del fuso orario dipende dalla data in gran parte del mondo & # 8212; quelle parti di esso che usano l'ora legale / ora legale.
L'unico modo corretto è generare l'intera stringa da data e fuso orario insieme. Usa NSDateFormatter per questo.
Altri suggerimenti
Usa NSDateFormatter
per costruire NSDate da una stringa:
NSDateFormatter *inputFormatter = [[NSDateFormatter alloc] init];
[inputFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss Z"];
NSDate *formatterDate;
formatterDate = [inputFormatter dateFromString:@"1976-04-01 12:34:56 -0700"];
NSString *dateString = [inputFormatter stringFromDate:formatterDate];
NSLog(@"date:%@", dateString);
In questo modo si ottiene l'ora locale dalla stringa, ad esempio la data specificata dalla stringa:
" 1976-04-01 12:34:56 -0700 "
è nel fuso orario - 0700
, (sono nel fuso orario GMT +1000) quindi ottengo:
17/11/2009 22: 13: 46.480 cmdline [10593: 903] data: 1976-04-02 05:34:56 +1000
Il modo migliore è probabilmente usare un semplice formattatore di calendario
NSCalendarDate * date = [NSCalendarDate calendarDate];
[date setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"PDT"]];
NSLog([date descriptionWithCalendarFormat:@"%z"]);
che produrrà '-0700'
o tralascia la seconda riga se desideri il fuso orario corrente del sistema (non sei sicuro di quale stavi chiedendo)