UTC日期到当地日期在swift
问题描述:
我想将UTC日期转换为本地日期而不是本地字符串。我试图从UTC日期转换到本地日期(在字符串)再次,然后我试图从本地日期(字符串)转换到本地日期。它仅返回UTC日期。我甚至尝试每次都给时区。什么都没有如果有人有想法,我哪里错了?UTC日期到当地日期在swift
let dateFormator = DateFormatter()
dateFormator.dateFormat = inputDateStringFormat
if fromUTC {
dateFormator.timeZone = TimeZone(abbreviation: "UTC")
} else {
dateFormator.timeZone = TimeZone.current
}
let resultDate = dateFormator.date(from: inputDateString)
dateFormator.dateFormat = reqDateStringFormat
if toUTC {
dateFormator.timeZone = TimeZone(abbreviation: "UTC")
} else {
dateFormator.timeZone = TimeZone.current
}
guard let dateToConvert = resultDate else { return nil }
let resultString = dateFormator.string(from: dateToConvert)
let finalDateFormater = DateFormatter()
finalDateFormater.dateFormat = reqDateStringFormat
if toUTC {
finalDateFormater.timeZone = TimeZone(abbreviation: "UTC")
} else {
finalDateFormater.timeZone = TimeZone.current
}
if let requiredDate = finalDateFormater.date(from: resultString) {
return requiredDate
} else {
return nil
}
FYC:
- toUTC值为false
- inputDateStringFormat为 “YYYY-MM-DD HH:MM:SS” 从UTC
- 为真
- inputDateString是“2017年-07-18 04:45:00“
- reqDateStringFormat is”yyyy-MM-dd HH:mm:ss“
答
由于三个问题的评论已经解释过,Date
没有时区。 A Date
是一个代表绝对时间点的数字(使用牛顿宇宙作为一个很好的近似值)。如果我的日期(在WET时区)是123.45
,那么在印度的日期也是123.45
,即使谷歌告诉我你比我早了5.5个小时。在我的时区问什么日期等于123.45
是没有意义的,因为答案是123.45
。
您应该始终在代码中内部使用Date
。相信我,它会让你的生活更轻松。话虽如此,如果你想向用户显示一个日期或从用户那里得到一个日期,你不想让他们在UTC工作,但在他们在(或特定)时区。因此,您在适当的时区使用DateFormatter
。
如果API或文件格式需要特定的时区格式,请使用日期格式化程序。
如果API需要Unix日期,则可以使用方法timeInterfalSince1970
获取Unix时间。
如果你需要获得一个ISO日期,使用ISO8601DateFormatter它允许你指定一个时区
FSCalendar
我刚刚有了一个快速浏览通过FSCalendar code在Github上,它看起来像它预计NSDate
s这是真的和斯威夫特Date
s一样的东西。只要您正确设置了时区,只要提供Date
即可。
'日期'是一个绝对时间点,没有时区。没有“UTC日期”或“本地日期”之类的东西。 –
我可以将resultString转换为所需的日期格式吗? – Antony
A * string *有格式,'Date'没有。 - 请使用您真正需要的信息更新问题。什么是给定的输入,什么是预期的输出? –