Swift 4 个错误的日期和时间

Swift 4 wrong date and time

我在时区上挣扎,因为我试图将时间设置为午夜到 23:00:00,但是,结果显示从早上 6 点开始到第二天早上 5 点。我试图将时区设置为当前,结果仍然相同。这是我的代码

let day1num = Int(todaynumber.string(from: Date()))! + 1
let day1start = Calendar.current.date(bySetting: .day, value: day1num, of: Date())
let day1end = Calendar.current.date(bySetting: .hour, value: 23, of: day1start!)
print("\(day1start!) to \(day1end!)")

我得到了结果 2020-04-22 06:00:00 +0000 至 2020-04-23 05:00:00 +0000

我不想要第二天早上 6 点到凌晨 5 点,我想要结果: 2020-04-22 00:00:00 +0000 至 2020-04-22 23:00:00 +0000

我该如何解决? 谢谢!

您的问题是您误解了 Date 以及它如何打印到控制台。

Dates 代表时间时刻。将它们视为代表自参考日期以来经过的时间量的整数。它不是人类可读的字符串。要将日期转换为人类可读的字符串,您需要使用 DateFormatter 并确保将日期格式化程序的 timeZone 设置为您希望字符串具有代表性的时区的(它将默认为系统的当前时区)。 timeZone 将影响结果字符串的内容。例如,如果您有一个时区为太平洋时间的日期格式化程序,它可能 return 一个类似于 April 22, 2020 6:00 PM 的值,但是如果您将时区更改为山区时间并从日期,它将 return April 22, 2020 7:00 PM.

当您将 Date 实例打印到控制台时,系统会将其格式化为 UTC 时区中的人类可读字符串。如果我的计算正确,那么你正处于山区时间,这就是为什么你看到的记录值比你期望的值提前 6 小时。

如果您希望以用户看到的方式查看记录到控制台的日期,您应该使用 DateFormatter 实例。它将默认使用用户的系统时区,然后使用您计算的 Date 值来获取该日期的 String 表示,然后将 String 记录到控制台,而不是日期本身。

let formatter = DateFormatter()
formatter.dateStyle = .medium // Customize as needed
formatter.timeStyle = .medium // Customize as needed
// formatter.timeZone = ... something else if you don't want to use the system time zone
let day1StartAsString = formatter.string(from: day1start!)
let day1EndAsString = formatter.string(from: day1end!)
print("\(day1StartAsString) to \(day1EndAsString)")