【问题标题】:TimeZone Issue swift3时区问题 swift3
【发布时间】:2023-03-31 03:24:01
【问题描述】:

我在快速使用TimeZone 时遇到了一些麻烦。

 func date(hour: Int, minute: Int, timeZone: TimeZone) -> Date {
    let components = DateComponents(calendar: Calendar.current, timeZone: timeZone, era: nil, year: nil, month: nil, day: nil, hour: hour, minute: minute, second: 0, nanosecond: 0, weekday: nil, weekdayOrdinal: nil, quarter: nil, weekOfMonth: nil, weekOfYear: nil, yearForWeekOfYear: nil)
    return components.date!
}

var startDate_TimeZone = TimeZone.init(identifier:"Asia/Seoul")
var endDate_TimeZone = TimeZone.current

let startDate = date(hour: 13, minute: 00, timeZone: startDate_TimeZone!)
// Returns "Jan 1, 1, 7:02 AM"

let endDate = date(hour: 13, minute: 00, timeZone: endDate_TimeZone)
// Returns "Jan 1, 1, 1:00 PM"

为什么我初始化时区时返回的时间加了2分钟?如何避免这种情况?

不同时区也会发生这种情况。 &我在文档中没有找到任何关于此的内容。

提前感谢您!

【问题讨论】:

  • 计算的目的是什么?为什么要计算 0001 年的日期?

标签: swift timezone


【解决方案1】:

这是一个 2 分钟的偏移量,因为如您所见,您使用的是第 1 年的日期。在 iOS(与大多数计算平台一样)上,时区由 IANA time zone database 定义。第 1 年没有时区,但 Asia/Seoul 的条目包含以下内容:

# Zone  NAME            GMTOFF  RULES   FORMAT  [UNTIL]
Zone    Asia/Seoul      8:27:52 -       LMT     1908 Apr  1

也就是说,在 1908 年 4 月 1 日之前,GMT 偏移量是 8:27:52,这与您所看到的相符。 (我不熟悉历史,所以我不知道为什么这是偏移量——我猜测是基于首尔在前时区世界中的经度)。

您得到的是第 1 年而不是当前年份,因为您的日期没有指定年份:

let startDate = date(hour: 13, minute: 00, timeZone: startDate_TimeZone!)

如果你想要的是今年今天 13:00,请执行以下操作:

let now = Date()
let now1pm = Calendar.current.date(bySettingHour: 13, minute: 0, second: 0, of: now)

如果这不是您想要的,请进一步解释或查看Calendar 以了解其他有用的方法。

【讨论】:

    【解决方案2】:

    正如 Martin 在 cmets 中指出的那样,您正在计算 0001 年左右的时区。到目前为止还没有时区数据,因为甚至没有时区之类的东西。

    没有有效日期参考的时区是没有意义的。即使在现代,由于夏令时等原因,您也可以在一年中的不同时间获得不同的结果。

    在您的转换中指定一个有效日期,它应该可以正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-16
      相关资源
      最近更新 更多