【问题标题】:UTC Date to local Date in swiftUTC日期快速转换为本地日期
【发布时间】:2017-07-17 12:41:52
【问题描述】:

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

财年:

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

【问题讨论】:

  • A Date 是一个绝对时间点,没有时区。没有“UTC 日期”或“本地日期”之类的东西。
  • string 有格式,Date 没有。 – 请用您真正需要的信息更新问题。给定的输入是什么,预期的输出是什么?
  • 正如 Martin R 已经提到的,Date 是一个绝对时间点,它没有与之关联的时区。您只能有相对时间点的字符串表示形式(特定时区中的日期)。告诉我们您真正想要实现的目标,然后我们可以提供更多帮助,但从提供的信息中不清楚您为什么需要时间表示以及 Date 字符串是否足以满足您的需求。
  • 返回第 1 步:Date 是一个绝对时间点,没有时区(并且打印 Date 始终使用 UTC)。
  • 我厌倦了听到“日期没有时区......它是 UTC”。 UTC 是一个时区。我想知道“今天”是什么。如果是在美国东部标准时间 1 月 1 日晚上 8 点之后,我希望“今天”是 1 月 1 日。我不只是想显示今天是 1 月 1 日。我今天调用的 API 需要在 1 月 1 日进行。 Date 类的一个限制是,这样做的唯一方法是转换为 String,然后再转换回 Date。

标签: swift


【解决方案1】:

正如问题中的三位 cmets 已经解释的那样,Date 没有时区。 Date 只是一个代表绝对时间点的数字(使用牛顿宇宙作为一个很好的近似值)。如果我的日期(在 WET 时区)是 123.45,那么你在印度的日期也是 123.45,即使 Google 告诉我你比我早 5.5 小时。你在我的时区问什么日期等于123.45是没有意义的,因为答案是123.45

您应该始终在代码内部使用Dates。相信我,它会让你的生活更轻松。话虽如此,如果您想向用户显示日期或从用户那里获取日期,您不想让它们在 UTC 中工作,而是在它们所在(或指定)的时区中工作。因此,您可以使用 DateFormatter 和适当的时区。

如果 API 或文件格式需要带有时区的特定格式,请也为此使用日期格式化程序。

如果 API 需要 Unix 日期,您可以使用方法 timeInterfalSince1970 获取 Unix 时间。

如果您需要获取 ISO 日期,请使用ISO8601DateFormatter,它允许您指定时区

FSCalendar

我刚刚快速浏览了 Github 上的 FSCalendar code,看起来它期望 NSDates 与 Swift Dates 完全一样。只要您已正确设置其时区,您只需向其提供 Dates 就可以了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 2018-09-21
    相关资源
    最近更新 更多