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.
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 !!
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.
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")
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))
}
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: ...)