Разница между временем посадки и текущим временем в UTC в iOS, Swift - PullRequest
0 голосов
/ 25 ноября 2018

Я получаю время посадки от службы (скажем, BT- время посадки) Мне нужно выяснить разницу между временем посадки и текущим временем , а затем выяснить разницу в часах, мин.

Условие состоит в том, что пользователь может проверить разницу между ними в любой стране мира.поэтому я использовал 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://stackoverflow.com/a/28608779/3400991 показывает точную проблему с этим результатом, любезно помогите

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Прежде всего, будьте очень осторожны с математикой даты / времени, это не прямолинейное преобразование, есть множество правил, которые обходят его и делают его ... сложным.

Первыйвам нужно рассчитать разницу между двумя значениями, к счастью для вас, это относительно просто ...

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

Это дает вам количество секунд между этими двумя значениями (положительное значение быловремя до, отрицательное значение было время после)

Далее, вам нужны часы / минуты в некоторой форме удобочитаемой нотации.Может показаться заманчивым просто начать с умножения и деления всего на 60, но это было бы ошибкой и привело бы вас к вредным привычкам (конечно, на небольшом расстоянии это неплохо, но вы должны быть очень осторожны)

Лучшим решением было бы использовать DateComponentsFormatter ...

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

formatter.string(from: difference)

, который позаботится обо всех «правилах» для вас, но также локализует результаты, всегда бонус.

В приведенном выше примере будет напечатано что-то вроде ...

10h 28m
0 голосов
/ 26 ноября 2018

Это намного проще, чем вы сделали:

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!)")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...