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
以及它如何打印到控制台。
Date
s 代表时间时刻。将它们视为代表自参考日期以来经过的时间量的整数。它不是人类可读的字符串。要将日期转换为人类可读的字符串,您需要使用 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)")
我在时区上挣扎,因为我试图将时间设置为午夜到 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
以及它如何打印到控制台。
Date
s 代表时间时刻。将它们视为代表自参考日期以来经过的时间量的整数。它不是人类可读的字符串。要将日期转换为人类可读的字符串,您需要使用 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)")