it-swarm.com.de

Datum zwischen Zeitzonen schnell umwandeln

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.

10
Alk

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")
15
Amloelxer

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
    }
}
9
quemeful

Einfachere Version:

extension Date {
    func convertToTimeZone(initTimeZone: TimeZone, timeZone: TimeZone) -> Date {
         let delta = TimeInterval(timeZone.secondsFromGMT() - initTimeZone.secondsFromGMT())
         return addingTimeInterval(delta)
    }
}
5
mukaissi

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.

3
David Berry

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)
    }    
}
0
Nikaaner

Ich schlage vor

  • sie setzen die GMT-Zeitzone in Ihrer dateFormatter, um ein NSDate direkt in UTC zurückzuholen (es ist eine gute Praxis, nur NSDates in UTC zu haben).
  • wenn Sie es anzeigen müssen, verwenden Sie ein anderes NSDateFormatter, auf dem die lokale Zeitzone festgelegt ist (standardmäßig).
  • wenn Sie ein Datum an Ihren Server senden müssen, verwenden Sie erneut dateFormatter, um eine Zeichenfolge zu generieren
0
PierreMB