iOS,Swift中UTC登机时间与当前时间之间的差异

Posted

技术标签:

【中文标题】iOS,Swift中UTC登机时间与当前时间之间的差异【英文标题】:Difference between boarding time and current time in UTC in iOS , Swift 【发布时间】:2018-11-25 20:50:35 【问题描述】:

我正在从服务中获取登机时间(比如说 BT-登机时间) 我需要找出登机时间和当前时间之间的差异,然后找出 Hour, Min. 的差异。

条件是用户可以检查世界上任何国家/地区之间的差异。所以我使用 UTC 来计算,但它给出了正确的结果,请帮助我。

 func dayStringFromTime() -> String 
        let currentTimeUnix = Date().timeIntervalSince1970
        let date = NSDate(timeIntervalSince1970: currentTimeUnix)
        let dateFormatter = DateFormatter()
        //  dateFormatter.dateFormat = "HH:mm:ss"
        return date.description
    

let CT  = dayStringFromTime() //time1
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-mm-dd HH:mm:ss"
let CTDate = formatter.date(from: CT)
let time1 = boardingDateTime//timeformatter.date(from: CT)
let time2 = CT_Date//timeformatter.date(from: ETD)
//You can directly use from here if you have two dates
let interval = time1.timeIntervalSince(time2! as Date)
let hour = (interval ) / 3600;
let minute = interval.truncatingRemainder(dividingBy: 3600) / 60
let intervalInt = Int(interval)
print("\(intervalInt < 0 ? "-" : "+") \(Int(hour)) Hours \(Int(Int(minute))) Minutes")
let minText = Int(minute) > 0 && Int(minute) != 0 ? " \(Int(minute)) min" : (Int(minute) < 0 ? " \(Int(abs(minute))) min" : "")
let hrText  = Int(hour) > 0 && Int(hour) != 0 ? " \(Int(hour)) hr" : (Int(hour) < 0 ? " \(Int(abs(hour))) hr" : "") 

这个 url https://***.com/a/28608779/3400991 显示了这个结果的确切问题,请帮助

【问题讨论】:

您使用的是哪个版本的 Swift? 我正在使用 Swift 4 看看DateComponentsFormatter 摆脱奇怪的日期数学。 @DanielT. 的回答将为您提供正确的结果如果您已正确设置登机时间。你能提供你格式化它的代码吗?您是否为其提供了正确的时区? @fguchelaar 没有格式化 Date 对象。只要他正确地创建它(大概来自网络响应?)我的答案就会奏效。我喜欢@MadProgrammer 对DateComponentsFormatter 的引用。 【参考方案1】:

这比你做的更容易:

let boardingTime = Date().addingTimeInterval(3200) // the `addingTimeInterval` is for demonstration purposes only.
let now = Date()
let difference = Calendar.current.dateComponents([.hour, .minute, .second], from: now, to: boardingTime)
print("Boarding will be in: \(difference.hour!):\(difference.minute!):\(difference.second!)")

【讨论】:

【参考方案2】:

首先,对日期/时间数学要非常小心,这不是直线的线性转换,有很多规则绕开它,使它变得...复杂。

首先你需要计算两次之间的差值,幸运的是,这比较容易......

var boardingTime = Date()
boardingTime = bordingTime.addingTimeInterval(Double.random(in: 0.0..<86400.0))
let now = Date()
let difference = boardingTime.timeIntervalSince(now)

这为您提供这两个值之间的秒数(正值是时间,负值是时间之后)

接下来,您需要采用某种人类可读的符号形式的小时/分钟。将所有内容都乘以 60 并除以 60 似乎很诱人,但那将是一个错误并导致你养成坏习惯(当然在短期内它还不错,但你需要非常小心)

更好的解决方案是使用DateComponentsFormatter...

let formatter = DateComponentsFormatter()
formatter.allowedUnits = [.hour, .minute]
formatter.unitsStyle = .abbreviated

formatter.string(from: difference)

这将为您处理所有“规则”,但是,它还将本地化结果,始终是一个奖励。

上面的例子会打印出类似...

10h 28m

【讨论】:

以上是关于iOS,Swift中UTC登机时间与当前时间之间的差异的主要内容,如果未能解决你的问题,请参考以下文章

如何获取 UTC 中特定时间和当前时间之间的差异

Swift - iOS UTC 日期和时间设置为带有偏移的设备日期和时间格式

Swift 3 - UTC 到时间前标签,考虑 12 小时 / 24 小时设备时间变化

iOS 本地时间UTC时间时间戳等操作

华为交换机配置当前时区日期和时间等参数

IOS将UTC转换为本地时间不准确