代码之家  ›  专栏  ›  技术社区  ›  Sweeper

我如何“组合”未分区日期和时区?

  •  2
  • Sweeper  · 技术社区  · 8 年前

    我的问题与 Get "time with time zone" from "time without time zone" and the time zone name

    func combine(_ date: Date, with timeZone: TimeZone) -> Date?
    

    nil .

    为了避免成为XY问题,这里有一个屏幕截图:

    enter image description here

    我要求用户提供日期和时区,我想将这两者结合在一起 Date

    timeIntervalFrom1970 使其尽可能清楚。

    我就是这样尝试实现的:

    return date.addingTimeInterval(-timeZone.secondsFromGMT(for: date))
    

    这似乎在大多数情况下有效,但并非所有情况下都有效。然而,如果DST参与进来,整个事情变得一团糟,我认为它不会返回正确的结果。这也让人感觉“数学化”。我更喜欢没有数学的方法,只使用基础API方法。

    所以 如何实现此方法?

    1 回复  |  直到 8 年前
        1
  •  1
  •   Martin R    8 年前

    在您的示例中,API为您提供了一个 Date ,但你想解释 eureka forms UI元素使用当前日历的时区 对于显示,您可以将日期转换为 DateComponents ,然后返回 到a 时区不同。

    func combine(_ date: Date, with timeZone: TimeZone) -> Date? {
        var cal = Calendar.current
        let comp = cal.dateComponents([.era, .year, .month, .day, .hour, .minute, .second], from: date)
        cal.timeZone = timeZone
        return cal.date(from: comp)
    }
    

    nil 在另一个时区。

    推荐文章