【问题标题】:Unix time with NSDate reveals erroneous resultsNSDate 的 Unix 时间揭示了错误的结果
【发布时间】:2015-02-21 10:47:06
【问题描述】:

我住在丹麦 (UTC + 1),我正在使用一个 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 开始?这是一个错误还是它应该是这样? 我可以使用 let tz = NSTimeZone.defaultTimeZone() let seconds = tz.secondsFromGMTForDate(NSDate()) 然后从我的结果中减去秒数。但是,当我们进入夏季时会发生什么?

【问题讨论】:

    标签: ios swift nsdate unix-timestamp


    【解决方案1】:

    timeIntervalSince1970 总是以格林威治标准时间给出时间。您的 unixTimeTrainDeparture 可能是 GMT+1 的时间,这解释了 60 分钟的差异(或夏季时间的 120 分钟)。字符串转换也是如此 - 您输入一个 GMT 时间,它会在您配置的任何时区输出日期(我猜您的计算机的设置也是 GMT+1)。

    使用时区时,始终从 GMT/UTC 开始,在向用户显示日期之前不要进行任何时区转换。

    您对 Web API 有任何控制权吗?如果是这样 - 将其配置为发送 GMT。这应该完全避免时区和夏令时问题。

    如果您不能这样做,您将不得不自己实现一些函数来转换时间戳,考虑到未来时间戳可能位于不同时区(例如夏令时)的可能性。 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)
    

    【讨论】:

    • 我无法控制 webapi。我还假设 API 时间有 3600 秒太多,但是为什么这个错误没有出现在我制作 1970-1-1 00:00:00 + ApiTimeStamp 的电子表格中。在我看来,这应该给我相同的偏移量,但事实并非如此。
    • 我添加了一些示例代码,它假定您从 API 收到的时间始终处于丹麦时区。
    • 您好,谢谢。是的,这是有效的(我提交的第一个代码),但我担心的是当我们将时间更改为夏季时会发生什么。我的假设是,偏移量将增长到 7200。但非常感谢您的帮助!
    • 我想我弄错了,更新后的示例也应该处理 DST 偏移量!尝试使用不同的日期,您会看到偏移量相应发生变化。
    • @user1700737 如果您认为我的解决方案合适,请将我的回答标记为正确。
    猜你喜欢
    • 2013-09-12
    • 1970-01-01
    • 2017-02-17
    • 1970-01-01
    • 2019-07-04
    • 1970-01-01
    相关资源
    最近更新 更多