webentwicklung-frage-antwort-db.com.de

Swift 3.0: Konvertieren Sie die UTC-Zeit des Servers in die Ortszeit und umgekehrt

Ich möchte Server-UTC-Zeit in Ortszeit und umgekehrt umwandeln.

var isTimeFromServer = true
var time:String!
var period:String!
let timeString = "6:59 AM" //Current UTC time

if isTimeFromServer {

    let index = timeString.index(timeString.startIndex, offsetBy: 5)
    let twelve = timeString.substring(to: index)

    var dateString:String!

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "H:mm"
    let date12 = dateFormatter.date(from: twelve)!

    dateFormatter.dateFormat = "h:mm a"
    let date22 = dateFormatter.string(from: date12)

    //print(date22)
    dateString = date22
    //print("dateString=\(dateString)")

    time = dateString.components(separatedBy: " ")[0]
    period = dateString.components(separatedBy: " ")[1]

}
else {
    time = timeString.components(separatedBy: " ")[0]
    period = timeString.components(separatedBy: " ")[1]
}

var hour = Int(time.components(separatedBy: ":")[0])

hour = period == "AM" ? hour : hour! + 12
let minute = Int(time.components(separatedBy: ":")[1])
let calender = NSCalendar.current
var datecomponent = DateComponents()
datecomponent.calendar = calender
datecomponent.hour = hour
datecomponent.minute = minute

if !isTimeFromServer {
    // local to UTC
    datecomponent.timeZone = TimeZone.current
}
else {
    datecomponent.timeZone = TimeZone(abbreviation: "UTC")
}

let date = datecomponent.date
let dateFormatter = DateFormatter()

if !isTimeFromServer {
    dateFormatter.dateFormat = "H:mm"
    dateFormatter.timeZone = TimeZone(abbreviation: "UTC")
    dateFormatter.string(from: date!)
}
else {
    //UTC to local
    dateFormatter.dateFormat = "h:mm a"
    dateFormatter.timeZone = TimeZone.current
    dateFormatter.string(from: date!)
}

Ich bekomme die Ortszeit 

o/p: "12:52 PM"

Die tatsächliche Ortszeit und die Ausgangszeitdifferenz betragen jedoch 23 Minuten.

22
NiravS

Ich weiß nicht, was mit Ihrem Code falsch ist.
Aber es sieht zu unnötig aus, als würden Sie den Kalender einstellen, indem Sie einige Elemente von String abrufen ... Hier ist meine kleine Version der Funktionen UTCToLocal und localToUTC. 
Dafür müssen Sie jedoch die Zeichenfolge in einem bestimmten Format übergeben. Ursache Ich habe zwangsweise Datumsobjekte ausgepackt. Sie können jedoch einige Überwachungsbedingungen verwenden, um einen Absturz der App zu verhindern.

func localToUTC(date:String) -> String {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "h:mm a"
    dateFormatter.calendar = NSCalendar.current
    dateFormatter.timeZone = TimeZone.current

    let dt = dateFormatter.date(from: date)
    dateFormatter.timeZone = TimeZone(abbreviation: "UTC")
    dateFormatter.dateFormat = "H:mm:ss"

    return dateFormatter.string(from: dt!)
}

func UTCToLocal(date:String) -> String {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "H:mm:ss"
    dateFormatter.timeZone = TimeZone(abbreviation: "UTC")

    let dt = dateFormatter.date(from: date)
    dateFormatter.timeZone = TimeZone.current
    dateFormatter.dateFormat = "h:mm a"

    return dateFormatter.string(from: dt!)
}

und rufen Sie diese Funktion wie folgt auf.

print(UTCToLocal(date: "13:07:00"))
print(localToUTC(date: "06:40 PM"))

Hoffe, das wird dir helfen.
Viel Spaß beim Codieren !!

57
Mrugesh Tank

Die Antwort von Mrugesh ist perfekt, aber wenn jemand sein eigenes Format oder ein anderes Format verwenden muss, habe ich es verallgemeinert, sodass Sie in beiden Parametern ein anderes Format angeben können.

func localToUTC(date:String, fromFormat: String, toFormat: String) -> String {

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = fromFormat
    dateFormatter.calendar = NSCalendar.current
    dateFormatter.timeZone = TimeZone.current
    dateFormatter.date
    let dt = dateFormatter.date(from: date)
    dateFormatter.timeZone = TimeZone(abbreviation: "UTC")
    dateFormatter.dateFormat = toFormat

    return dateFormatter.string(from: dt!)
}

func UTCToLocal(date:String, fromFormat: String, toFormat: String) -> String {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = fromFormat
    dateFormatter.timeZone = TimeZone(abbreviation: "UTC")

    let dt = dateFormatter.date(from: date)
    dateFormatter.timeZone = TimeZone.current
    dateFormatter.dateFormat = toFormat

return dateFormatter.string(from: dt!)
}

let localDateAsString = UTCToLocal(date: dateAsString!, fromFormat: "hh:mm a, dd MMM yyyy", toFormat: "hh:mm a, dd MMM yyyy")

Sie können es wie oben verwenden. Ich hoffe es hilft.

15
Hardik

Mit Hilfe von Mrugesh Tank Answer 

Ich habe seine Antwort aktualisiert und die Erweiterungen für das Datum erstellt. So können Sie von überall aus auf die Funktionen zugreifen, entweder von ViewController oder von der Zellklasse aus.

extension String {

  //MARK:- Convert UTC To Local Date by passing date formats value
  func UTCToLocal(incomingFormat: String, outGoingFormat: String) -> String {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = incomingFormat
    dateFormatter.timeZone = TimeZone(abbreviation: "UTC")

    let dt = dateFormatter.date(from: self)
    dateFormatter.timeZone = TimeZone.current
    dateFormatter.dateFormat = outGoingFormat

    return dateFormatter.string(from: dt ?? Date())
  }

  //MARK:- Convert Local To UTC Date by passing date formats value
  func localToUTC(incomingFormat: String, outGoingFormat: String) -> String {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = incomingFormat
    dateFormatter.calendar = NSCalendar.current
    dateFormatter.timeZone = TimeZone.current

    let dt = dateFormatter.date(from: self)
    dateFormatter.timeZone = TimeZone(abbreviation: "UTC")
    dateFormatter.dateFormat = outGoingFormat

    return dateFormatter.string(from: dt ?? Date())
  }
}

Beispiel zur Verwendung: -

Note:- eventStartDate is the string which you have to converted in your format like this:- "2018-07-11T16:22:00.000Z" 

let finalDate = eventStartDate.UTCToLocal(incomingFormat: "yyyy-MM-dd'T'HH:mm:ss.SSSZ", outGoingFormat: "MMM d, yyyy h:mm a")
5
Mandeep Singh

Versuch es bitte:

func convertUTCToLocal(timeString: String) -> String? {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "h:mm a"

    dateFormatter.timeZone = TimeZone.init(abbreviation: "UTC")
    let timeUTC = dateFormatter.date(from: timeString)

    if timeUTC != nil {
        dateFormatter.timeZone = NSTimeZone.local

        let localTime = dateFormatter.string(from: timeUTC!)
        return localTime
    }

    return nil
}



func convertLocalToUTC(localTime: String) -> String? {

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "h:mm a"
    dateFormatter.timeZone = NSTimeZone.local
    let timeLocal = dateFormatter.date(from: localTime)

    if timeLocal != nil {
        dateFormatter.timeZone = TimeZone.init(abbreviation: "UTC")

        let timeUTC = dateFormatter.string(from: timeLocal!)
        return timeUTC
    }
    return nil
}


    var isTimeFromServer = true
    var time:String!
    var period:String!
    let timeString = "6:59 AM" //Current UTC time


    if isTimeFromServer {
        print(convertUTCToLocal(timeString: timeString))
    } else {
        print(convertLocalToUTC(localTime: timeString))
    }
1
javimuu

Für alle, die TimeZone-Objekte verwenden. Ich würde Ihnen raten, Ihre TimeZone aus einer Kennung anstatt einer Abkürzung zu erstellen, wenn Sie die Möglichkeit dazu haben.

Dies verhindert Fehler, die durch die Sommerzeit verursacht werden.

Um meinen Standpunkt zu veranschaulichen, nehmen wir ein Beispiel. Sie können wie folgt instanziieren let timeZone = TimeZone(identifier: "Europe/Paris") oder wie folgt let timeZone = TimeZone(abbreviation: "CEST") oder "UTC +2: 00"

Aber dies ist die Zeitzone für den Sommer CEST Bedeutet Mitteleuropäische Sommerzeit Wir haben CET bedeutet Mitteleuropäische Zeit für den Winter "UTC +1: 00"

Mit Date.isDaylightSavingsTime können Sie die Sommerzeit selbst verwalten. Dies bedeutet jedoch mehr Code und Sie haben keine Kontrolle darüber, woher Ihre Sommerzeit stammt. "Gibt an, ob der Empfänger derzeit die Sommerzeit verwendet."

Alles ist, das heißt, zugunsten von TimeZone (Bezeichner: ...)

1