Wenn es hilft, denken Sie an Temperaturen. Sie können in Fahrenheit, Celsius oder Kelvin ausgedrückt werden. Die ausgedrückte Information (die durchschnittliche Bewegung der Moleküle) hat jedoch keine intrinsische Einheit, obwohl sie für uns nur dann von Bedeutung ist, wenn sie in einer Einheit ausgedrückt wird.
Software entwickelt
7
@ DaveDeLong NSDate hat eine Zeitzone. Aus der NSDate-Klassenreferenz: "Diese Methode gibt einen Zeitwert relativ zu einem absoluten Referenzdatum zurück - dem ersten Zeitpunkt des 1. Januar 2001, GMT." Beachten Sie den klaren und spezifischen Verweis auf GMT.
Murray Sagal
3
Ich bin nicht einverstanden. NSDate hat KEINE Zeitzone. Um die Zeitzone für das NSDate anzugeben, verwenden Sie ein NSCalendar-Objekt oder ein NSDateFormatter-Objekt. Wenn Sie ein NSDate aus einer Zeichenfolge erstellen, für die keine Zeitzone angegeben ist, geht das NSDate davon aus, dass sich die Zeichenfolge in GMT-Zeit befindet.
Rickster
1
@MurraySagal Nur weil diese eine bestimmte Methode einen Zeitwert relativ zu einem Datum in einer bestimmten Zeitzone zurückgibt, bedeutet dies nicht, dass NSDate ein Datum als relativ zu einer Zeitzone modelliert.
Eremzeit
Antworten:
139
NSTimeInterval seconds;// assume this existsNSDate* ts_utc =[NSDate dateWithTimeIntervalSince1970:seconds];NSDateFormatter* df_utc =[[[NSDateFormatter alloc] init] autorelease];[df_utc setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];[df_utc setDateFormat:@"yyyy.MM.dd G 'at' HH:mm:ss zzz"];NSDateFormatter* df_local =[[[NSDateFormatter alloc] init] autorelease];[df_local setTimeZone:[NSTimeZone timeZoneWithName:@"EST"]];[df_local setDateFormat:@"yyyy.MM.dd G 'at' HH:mm:ss zzz"];NSString* ts_utc_string =[df_utc stringFromDate:ts_utc];NSString* ts_local_string =[df_local stringFromDate:ts_utc];// you can also use NSDateFormatter dateFromString to go the opposite way
Erwähnenswert ist wahrscheinlich, dass Sie den Formatierer verwenden können, um auch Daten aus Zeichenfolgen
einzulesen
34
@ DaveDeLong das ist alles schön und gut, wenn Sie nur das Datum als Zeichenfolge anzeigen. Es gibt jedoch durchaus gültige Gründe für die Durchführung von Zeitzonenumrechnungen an einem Datum. Wenn Sie beispielsweise das Datum in einem UIDatePicker mit setDate: als Standard festlegen möchten. Von Webdiensten zurückgegebene Daten sind häufig UTC-Daten, stellen jedoch ein Ereignis in der lokalen Zeitzone des Benutzers dar, z. B. eine TV-Liste. Wenn Sie ein nicht konvertiertes Datum eingeben, wird die falsche Uhrzeit in der Auswahl angezeigt.
Christopher Pickslay
5
@GlennMaynard Ich bin anderer Meinung. Das Wesentliche dieser Antwort ist, dass keine Konvertierung zum NSDateObjekt erforderlich ist, was korrekt ist. Die Konvertierung in eine Zeitzone erfolgt, wenn das Datum formatiert und nicht erstellt wird, da Datumsangaben keine Zeitzonen haben.
Dave DeLong
1
@GlennMaynard ... außer das NSCalendarDateist veraltet.
BEARBEITEN Als ich dies schrieb, wusste ich nicht, dass ich einen Datumsformatierer verwenden sollte, was wahrscheinlich ein besserer Ansatz istslf Antwort an.
Ich habe einen Webservice, der Daten in UTC zurückgibt. ich benutzetoLocalTime , um es in Ortszeit umzuwandeln undtoGlobalTime konvertiere es bei Bedarf zurück.
Tu das nicht. NSDates sind immer in UTC. Dies verwirrt das Problem nur.
JeremyP
13
Dies kann für den oben genannten Fall "Webservice" sehr nützlich sein. Angenommen, Sie haben einen Server, auf dem Ereignisse in UTC gespeichert werden, und der Client möchte nach allen Ereignissen fragen, die heute aufgetreten sind. Dazu muss der Client das aktuelle Datum (UTC / GMT) abrufen und es dann um seinen Zeitzonenversatz verschieben, bevor er es an den Server sendet.
Taylor Lafrinere
@JeremyP Es wäre genauer zu sagen, dass NSDates immer in GMT sind. Aus der NSDate-Klassenreferenz: "Diese Methode gibt einen Zeitwert relativ zu einem absoluten Referenzdatum zurück - dem ersten Zeitpunkt des 1. Januar 2001, GMT." Beachten Sie den klaren und spezifischen Verweis auf GMT. Es gibt einen technischen Unterschied zwischen GMT und UTC, der jedoch für die Lösungen, nach denen die meisten Menschen suchen, größtenteils irrelevant ist.
Diese Antwort fühlt sich tragbarer an. Bei der folgenden Antwort wird davon ausgegangen, dass die Zeitzone zur Laufzeit festgelegt ist, während bei der obigen Antwort die Zeitzone von der Plattform abgeleitet wird.
bleeckerj
9
Sehr hilfreich. Ein Zusatz secondsFromGMTForDatesollte verwendet werden, wenn Sie die Sommerzeit berücksichtigen möchten. Siehe Apple Docs
Sergey Markelov
1
Dies berücksichtigt keine Sommerzeitänderungen.
lkraider
36
Swift 3+ : UTC zu Local und Local zu UTC
extension Date{// Convert UTC (or GMT) to local time
func toLocalTime()->Date{let timezone =TimeZone.current
let seconds =TimeInterval(timezone.secondsFromGMT(for:self))returnDate(timeInterval: seconds, since:self)}// Convert local time to UTC (or GMT)
func toGlobalTime()->Date{let timezone =TimeZone.current
let seconds =-TimeInterval(timezone.secondsFromGMT(for:self))returnDate(timeInterval: seconds, since:self)}}
Gute Antwort! Dadurch wird das aktuelle Datum erfasst. Eine Anpassung dieser , die ein Datum Zeichenfolge verwendet wäre zu ersetzen [NSDate date]mit [NSDate dateWithNaturalLanguageString:sMyDateString].
Volomike
7
Konvertieren Sie Ihr UTC-Datum in ein lokales Datum
Nicht für mich arbeiten, meine Ortszeit ist +3 und dieser Code gibt +2 zurück
Fadi Abuzant
6
Hier ist die Eingabe eine Zeichenfolge currentUTCTime (im Format 30.08.2012 11:11), die die Eingabezeit in GMT in die vom System eingestellte Zonenzeit konvertiert
//This is basic way to get time of any GMT time.NSDateFormatter*formatter =[[NSDateFormatter alloc] init];[formatter setDateFormat:@"hh:mm a"];// 09:30 AM[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:1]];// For GMT+1NSString*time =[formatter stringFromDate:[NSDate date]];// Current time
Da niemand zu verwenden schien NSDateComponents, dachte ich, ich würde einen in ... In dieser Version wird no NSDateFormatterverwendet, daher kein String-Parsing, und NSDatewird nicht verwendet, um die Zeit außerhalb von GMT (UTC) darzustellen. Das Original NSDatebefindet sich in der Variablen i_date.
NSCalendar*anotherCalendar =[[NSCalendar alloc] initWithCalendarIdentifier:i_anotherCalendar];
anotherCalendar.timeZone =[NSTimeZone timeZoneWithName:i_anotherTimeZone];NSDateComponents*anotherComponents =[anotherCalendar components:(NSCalendarUnitEra|NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitSecond|NSCalendarUnitNanosecond) fromDate:i_date];// The following is just for checking
anotherComponents.calendar = anotherCalendar;// anotherComponents.date is nil without thisNSDate*anotherDate = anotherComponents.date;
i_anotherCalendarkönnte NSCalendarIdentifierGregorianoder irgendein anderer Kalender sein. Das NSStringZulässige i_anotherTimeZonekann mit erworben werden [NSTimeZone knownTimeZoneNames], anotherCalendar.timeZonekönnte aber [NSTimeZone defaultTimeZone]oder [NSTimeZone localTimeZone]oder sein[NSTimeZone systemTimeZone] insgesamt sein.
Es hält tatsächlich anotherComponentsdie Zeit in der neuen Zeitzone. Sie werden feststellen , dass es anotherDategleich ist i_date, weil es Zeit in GMT (UTC) hält.
Antworten:
Tabelle der Formatierungszeichenfolgenparameter:
https://waracle.com/iphone-nsdateformatter-date-formatting-table/
Wenn Leistung Priorität hat, sollten Sie die Verwendung in Betracht ziehen
strftime
https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man3/strftime.3.htmlquelle
NSDate
Objekt erforderlich ist, was korrekt ist. Die Konvertierung in eine Zeitzone erfolgt, wenn das Datum formatiert und nicht erstellt wird, da Datumsangaben keine Zeitzonen haben.NSCalendarDate
ist veraltet.BEARBEITEN Als ich dies schrieb, wusste ich nicht, dass ich einen Datumsformatierer verwenden sollte, was wahrscheinlich ein besserer Ansatz ist
slf
Antwort an.Ich habe einen Webservice, der Daten in UTC zurückgibt. ich benutze
toLocalTime
, um es in Ortszeit umzuwandeln undtoGlobalTime
konvertiere es bei Bedarf zurück.Hier habe ich meine Antwort bekommen von:
https://agilewarrior.wordpress.com/2012/06/27/how-to-convert-nsdate-to-different-time-zones/
quelle
Die einfachste Methode, die ich gefunden habe, ist folgende:
quelle
secondsFromGMTForDate
sollte verwendet werden, wenn Sie die Sommerzeit berücksichtigen möchten. Siehe Apple DocsSwift 3+ : UTC zu Local und Local zu UTC
quelle
Wenn Sie lokales Datum und Uhrzeit möchten. Versuchen Sie diesen Code: -
quelle
[NSDate date]
mit[NSDate dateWithNaturalLanguageString:sMyDateString]
.Konvertieren Sie Ihr UTC-Datum in ein lokales Datum
Verwenden Sie so
quelle
Hier ist die Eingabe eine Zeichenfolge currentUTCTime (im Format 30.08.2012 11:11), die die Eingabezeit in GMT in die vom System eingestellte Zonenzeit konvertiert
quelle
quelle
Konvertieren Sie das Datum aus dem UTC-Kalender in ein Datum mit der entsprechenden lokalen NSTimeZone .
quelle
Ich schreibe diese Methode, um Datum und Uhrzeit in unsere LocalTimeZone umzuwandeln
-Hier (NSString *) TimeZone-Parameter ist eine Server-Zeitzone
quelle
Da niemand zu verwenden schien
NSDateComponents
, dachte ich, ich würde einen in ... In dieser Version wird noNSDateFormatter
verwendet, daher kein String-Parsing, undNSDate
wird nicht verwendet, um die Zeit außerhalb von GMT (UTC) darzustellen. Das OriginalNSDate
befindet sich in der Variableni_date
.i_anotherCalendar
könnteNSCalendarIdentifierGregorian
oder irgendein anderer Kalender sein. DasNSString
Zulässigei_anotherTimeZone
kann mit erworben werden[NSTimeZone knownTimeZoneNames]
,anotherCalendar.timeZone
könnte aber[NSTimeZone defaultTimeZone]
oder[NSTimeZone localTimeZone]
oder sein[NSTimeZone systemTimeZone]
insgesamt sein.Es hält tatsächlich
anotherComponents
die Zeit in der neuen Zeitzone. Sie werden feststellen , dass esanotherDate
gleich isti_date
, weil es Zeit in GMT (UTC) hält.quelle
Sie können dieses versuchen:
quelle
Konvertieren Sie die UTC-Zeit in die aktuelle Zeitzone.
Funktion aufrufen
Funktion
quelle