gpt4 book ai didi

ios - 带有 NSDate 的 Unix 时间显示错误的结果

转载 作者:搜寻专家 更新时间:2023-11-01 06:48:06 24 4
gpt4 key购买 nike

我住在丹麦 (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)

关于ios - 带有 NSDate 的 Unix 时间显示错误的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27617886/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com