我想将UTC日期转换为本地日期而不是本地字符串。我试图再次从UTC日期转换为本地日期(在字符串中)然后我尝试从本地日期(在字符串中)转换为本地日期。它仅返回UTC日期。我甚至尝试过每次都给出时区。什么都行不通。如果有人有想法,我错在哪里?
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:
答案 0 :(得分:2)
由于有关该问题的三条评论已经解释过,Date
没有时区。 Date
是一个表示绝对时间点的数字(使用牛顿宇宙作为一个很好的近似值)。如果我的日期(在WET时区)是123.45
,那么您在印度的日期也是123.45
,即使Google告诉我您比我早5.5小时。您在我的时区询问哪个日期相当于123.45
是没有意义的,因为答案是123.45
。
您应始终在代码内部使用Date
。相信我,它会让你的生活更轻松。话虽如此,如果您想向用户显示日期或从用户那里获取日期,您不希望它们在UTC中工作,但在它们处于(或指定)的时区中。因此,您可以使用DateFormatter
来获得具有适当时区的内容。
如果API或文件格式要求具有时区的特定格式,请同时使用日期格式化程序。
如果API需要Unix日期,您可以使用方法timeInterfalSince1970
来获取Unix时间。
如果您需要获得ISO日期,请使用允许您指定时区的ISO8601DateFormatter
<强> FSCalendar 强>
我刚刚快速浏览了Github上的FSCalendar code,看起来它期望NSDate
与Swift Date
完全相同。如果你已经正确设置了它的时区,你应该没问题Date
。