Ich habe ein Datum in meiner Online-Server-Datenbank gespeichert, das sich in GMT
befindet. Ich lade das Datum und konvertiere es mit folgendem Code in die Zeitzone des Benutzers:
if let messagedate = oneitem["timestamp"] as? String {
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
let date = dateFormatter.dateFromString(messagedate)
let source_timezone = NSTimeZone(abbreviation: "GMT")
let local_timezone = NSTimeZone.systemTimeZone()
let source_EDT_offset = source_timezone?.secondsFromGMTForDate(date!)
let destination_EDT_offset = local_timezone.secondsFromGMTForDate(date!)
let time_interval : NSTimeInterval = Double(destination_EDT_offset - source_EDT_offset!)
let final_date = NSDate(timeInterval: time_interval, sinceDate: date!)
curr_item.date = final_date
}
Jetzt muss ich das Datum zurück in GMT
konvertieren, um es an den Server zu übermitteln. Ich bin jedoch nicht sicher, wie ich es zurück in GMT
konvertieren kann.
Könnten Sie Ihr Datenformatierungsprogramm nicht erneut mit einer anderen Zeitzone verwenden und es konvertieren? Sowie
dateFormatter.timeZone = NSTimeZone(abbreviation: "GMT")
let gmtDate = dateFormatter.dateFromString(string: "your old date as string here")
etwa 50 mal effizienter
extension Date {
func convertToLocalTime(fromTimeZone timeZoneAbbreviation: String) -> Date? {
if let timeZone = TimeZone(abbreviation: timeZoneAbbreviation) {
let targetOffset = TimeInterval(timeZone.secondsFromGMT(for: self))
let localOffeset = TimeInterval(TimeZone.autoupdatingCurrent.secondsFromGMT(for: self))
return self.addingTimeInterval(targetOffset - localOffeset)
}
return nil
}
}
Einfachere Version:
extension Date {
func convertToTimeZone(initTimeZone: TimeZone, timeZone: TimeZone) -> Date {
let delta = TimeInterval(timeZone.secondsFromGMT() - initTimeZone.secondsFromGMT())
return addingTimeInterval(delta)
}
}
Da sich NSDate
immer in GMT/UTC befindet, wird die Zeitzone nur relevant, wenn sie dem Benutzer angezeigt oder vom Benutzer abgerufen wird. Nehmen Sie einfach immer an, dass es UTC intern ist, konvertieren Sie es für den Benutzer (durch Festlegen der Variable in NSDateFormatter
), und Sie müssen sich nicht mehr um das Problem kümmern.
Basierend auf mukaissis Antwort , aber die Reihenfolge des Selbstbehalts im Ausdruck wurde korrigiert.
extension Date {
func convert(from initTimeZone: TimeZone, to targetTimeZone: TimeZone) -> Date {
let delta = TimeInterval(initTimeZone.secondsFromGMT() - targetTimeZone.secondsFromGMT())
return addingTimeInterval(delta)
}
}
Ich schlage vor
dateFormatter
, um ein NSDate direkt in UTC zurückzuholen (es ist eine gute Praxis, nur NSDates in UTC zu haben).dateFormatter
, um eine Zeichenfolge zu generieren