UTC日期在swift中的本地日期

时间:2017-07-17 12:41:52

标签: swift

我想将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:

  1. toUTC值为false
  2. inputDateStringFormat是" yyyy-MM-dd HH:mm:ss"
  3. 来自UTC的
  4. 是真的
  5. inputDateString是" 2017-07-18 04:45:00"
  6. reqDateStringFormat是" yyyy-MM-dd HH:mm:ss"

1 个答案:

答案 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