使用Calendar.date时,时区错误

时间:2017-09-16 15:41:16

标签: swift date swift3

我想在没有时间的情况下获得今天的日期,所以我可以使用它与我从API获得的其他Date对象进行比较。

这是我的代码:

var today = Date()
let gregorian = Calendar(identifier: .gregorian)
var components = gregorian.dateComponents([.timeZone, .year, .month, .day, .hour, .minute,.second], from: today)

components.hour = 0
components.minute = 0
components.second = 0

today = gregorian.date(from: components)!

但我对时区有一个奇怪的问题。今天是例如 16/09/17 ,但今天结束时将等于

  

2017-09-15 23:00:00 UTC

修复它的唯一方法实际上是将我的时区指定为GMT。

components.timeZone = NSTimeZone(name: "GMT")! as TimeZone

然后结果是正确的。

  

2017-09-16 00:00:00 UTC

为什么你需要指定时区,因为它应该由dateComponents设置或我做错了。
在设置我自己的时区之前,它等于 NSTimeZone“Europe / London”

1 个答案:

答案 0 :(得分:0)

时区"欧洲/伦敦"对应于" BST"目前,这是英国夏令时,即格林威治标准时间+1,因此你看到了这个问题。

使用DateFormatter并将timeStyle设置为.full时,您可以看到这一点。

let df = DateFormatter()
df.timeZone = TimeZone(identifier: "Europe/London")
df.dateStyle = .medium
df.timeStyle = .full
print(df.string(from: Date())) // "Sep 16, 2017, 4:56:55 PM British Summer Time"
df.timeZone = TimeZone.current //I am actually in London, so this will be the same as explicitly setting it to Europe/London
print(df.string(from: Date())) // "Sep 16, 2017, 4:56:55 PM British Summer Time"
df.timeZone = TimeZone(abbreviation: "UTC")
print(df.string(from: Date())) // "Sep 16, 2017, 3:56:55 PM GMT"