【问题标题】:Time zone in Date object SwiftDate对象Swift中的时区
【发布时间】:2021-06-24 20:11:47
【问题描述】:

我正在尝试在太平洋标准时间午夜获取第二天的日期对象,但我正在努力寻找一种方法来确保时区正确。此代码将返回第二天午夜的日期对象,但不在 PST 中,我该如何解决这个问题?我不是在寻找格式化的字符串。

func getTomorrowMidnightPST() -> Date {
        let date = Calendar.current.date(byAdding: .day, value: 1, to: Date())!
        let cal = Calendar(identifier: .gregorian)
        return cal.startOfDay(for: date)
    }

【问题讨论】:

  • 日期没有时区,所以你不能这样做
  • 您认为它可以像这样工作的原因是,Apple 让Dates 在打印到控制台时转换为人类可读的格式。当打印日期时,它会使用DateFormatter 实例转换为字符串,其中timeZoneDateFormatter 是GMT。

标签: ios swift date


【解决方案1】:

Date 是与时区无关的时间瞬间。一个瞬间(相同的Date 实例)在不同时区的表示方式不同。

你想要的是

  1. 将日历设置为您想要的时区。
  2. 要求它计算该日历明天开始的那个时刻。

例子-

var calender = Calendar(identifier: .gregorian)
let tzPST = TimeZone(identifier: "America/Los_Angeles")! // Force cast tested for hard-coded value only
calender.timeZone = tzPST
if let tomorrow = calender.date(byAdding: .day, value: 1, to: Date()) {
    let tomorrowMidnightInPST = calender.startOfDay(for: tomorrow)
}

请记住,这个Date 瞬间本身仍然不包含任何时区值。只有日历知道时区信息。

【讨论】:

  • 您使用的是缩写“PST”而不是标识符。请注意,相同的缩写可能有不同的夏令时。您应该始终使用标识符。 stackoverflow.com/a/66714163/2303865
  • @LeoDabus 非常感谢您澄清这一点。我已经更新了使用标识符而不是缩写的答案。
猜你喜欢
  • 2018-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多