我住在丹麦 (UTC + 1),我正在使用一个 webapi,该 webapi 从 1970-1-1 00:00:00 开始向我的应用发送 unix 时间戳。时间在未来(火车出发) 如果我在 Numbers 或 Excel 中检查时间戳,它会给出正确的时间
要计算火车发车前的分钟数,我这样做:
let unixTimeTrainDeparture = 1419327780 //(or some time in the future)
let unixRightNow = NSDate().timeIntervalSince1970
let minutesToDeparture = (Int(unixTimeTrainDeparture) - Int(unixRightNow))/60
但是这给了 60 分钟太多了吗?
如果我做一个
let dateTest = NSDate(string: "1970-01-01 00:00:00 +0000")!
会给我 1 jan 1970 :01:00:00 +0000
这对我来说没有意义。这就像 timeIntervalSince1970 给我的 3600 秒太少了,因为它从 1970-1-1 01:00 而不是 00:00 开始?这是一个错误还是它应该是这样的? 我可以使用 让 tz = NSTimeZone.defaultTimeZone() 让秒 = tz.secondsFromGMTForDate(NSDate()) 然后从我的结果中减去秒数。但是,当我们进入夏令时会发生什么?
请您参考如下方法:
timeIntervalSince1970 总是给出 GMT 时间。您的 unixTimeTrainDeparture 可能是 GMT+1 的时间,这解释了 60 分钟的时差(或夏令时的 120 分钟)。字符串转换也是如此 - 您输入 GMT 时间,它会以您配置的任何时区输出日期(我猜您的计算机设置也是 GMT+1)。
使用时区时,始终以 GMT/UTC 开始,并且在向用户显示日期之前不要进行任何时区转换。
您对 Web API 有任何控制权吗?如果是这样 - 将其配置为发送 GMT。这应该完全避免时区和夏令时问题。
如果你不能这样做,你将不得不实现一些函数来自己转换时间戳,考虑到 future 时间戳可能处于不同时区的可能性(例如夏令时)。 NSTimeZone 可能对此非常有用!
希望我已经正确理解了您的问题!
编辑,添加应该处理 DST 的示例:
// Date far in the future in DST, replace this
let unixTimeTrainDeparture = NSDate(timeIntervalSince1970: 1436447418)
let now = NSDate()
// Assume unixTimeTrainDeparture is in the Copenhagen timezone
let tz = NSTimeZone(name: "Europe/Copenhagen")
// This is 3600 in non-DST, otherwise 7200
let offset = tz!.secondsFromGMTForDate(unixTimeTrainDeparture)
let realUnixTimeTrainDeparture = Int(unixTimeTrainDeparture.timeIntervalSince1970) - offset
let timeToDeparture = realUnixTimeTrainDeparture - Int(now.timeIntervalSince1970)
