2016-11-29 2 views
1

Мне нужно найти разницу между текущим временем (в секундах) и будущим временем запуска (полученным из моей веб-службы в секундах). я закодирован следующим образом:Разница между двумя датами в секундах варьируется в зависимости от разных часовых поясов - Swift 3

let currentTime = Int64(Date().timeIntervalSince1970) 
    var time = Int64(timeArr[indexPath.row]) 

    print("\(currentTime) vs \(time)") 
    time = time - currentTime 
    print("difference in time : \(time)") 

    let seconds = time % 60 
    let minutes = (time/60) % 60 
    let hours = (time/3600) 

Моей консоль показывает мне этот выход:

1480400929 vs 1480552620 
difference in time : 151691 

Проблема заключается в том, что мое текущее время Tue Nov 29 2016 11:58:49 и время начала 2016-11-30 17:37:00 поэтому разница в часах должна прийти примерно в 30 часов, тогда как время в разных часовых поясах занимает около 42 часов. Как это исправить? У меня много вопросов для того же, но ничего не работает. Любая помощь будет оценена по достоинству.

+0

NSDATE - это абсолютный момент времени, без информации о часовом поясе. 1480400929 - «29 ноября 2016 года 06:28:49 GMT» и 1480552620 - «1 декабря 2016 года 00:37:00 по Гринвичу». Разница между этими временами составляет около 42 часов. - Пожалуйста, объясните, какой результат вы ожидаете и почему. * –

+0

Я хочу разницу между моим текущим временем, которое было в ноябре 29 2016 11:58:49, и время начала 2016-11-30 17:37:00, которое я получаю с сервера – Mamta

+0

Получаете ли вы время сервера как строку? Как преобразовать эту строку в NSDate? Каков часовой пояс серверов? Каков ваш часовой пояс? –

ответ

0

Если вы хотите разницу между двумя даты в Hours, Minutes и seconds вы можете использовать DateComponent как это.

let component = Calendar.current.dateComponents([.hour, .minute, .second], from: Date(), to: startDate) 
let hours = component.hour ?? 0 
let minutes = component.minute ?? 0 
let seconds = component.second ?? 0 

Edit: Чтобы получить дату из милисекунд использовать Date(timeIntervalSince1970:) как это.

let startDate = Date(timeIntervalSince1970: miliSeconds/1000) 

Также вы можете преобразовать строку в Date, используя DateFormatter вот так.

let stringDate = "2016-11-30 17:37:00" 
let dateFormatter = DateFormatter() 
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss" 
dateFormatter.timeZone = TimeZone(abbreviation: "GMT") 
if let startDate = dateFormatter.date(from: stringDate) { 
    print(startDate) 
} 
+0

Я получаю свой startDate в виде миллисекунд, так что эта работа в этом случае? – Mamta

+0

@Dia В этом случае вы можете получить дату начала, например, 'let startDate = Date (timeIntervalSince1970: miliSeconds/1000)' также проверить отредактированный ответ. –

+0

let startDate = Date (timeIntervalSince1970: TimeInterval (timeArr [indexPath.row])) let component = Calendar.current.dateComponents ([. Hour, .minute, .second], from: Date(), to: startDate) let hours = component.hour ?? 0 let minutes = component.minute ?? 0 let seconds = component.second ?? 0 Я пробовал это.Он по-прежнему показывает 42 часа – Mamta

Смежные вопросы