Как я могу получить правильное текущее время в iOS?

Я знаю, что это повторяющийся вопрос. Я просмотрел много ответов, но так и не нашел решения.

Мой вопрос: как я могу получить время устройства, если пользователь установил его вручную?

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

Я хочу получить правильное текущее время UTC. Таким образом, используя это, я могу определить разницу между временем устройства и временем UTC.

Если мы используем NSDate *currentDateAndTime = [NSDate date];, то он возвращает только время UTC в зависимости от устройства, а не текущее время UTC.

Есть ли простой способ узнать это решение?

Любая помощь будет оценена по достоинству.


person Meet Doshi    schedule 30.05.2016    source источник
comment
Вам нужен веб-сервис, если вы не доверяете времени устройства.   -  person Desdenova    schedule 30.05.2016
comment
... или сервер NTP, см., например. этот ответ: stackoverflow.com/questions/14964318/.   -  person Martin R    schedule 30.05.2016


Ответы (6)


В iOS нет надежного источника времени. Вы просто оперируете монотонным и немонотонным временем.

Монотонное время (или абсолютное время) представляет собой абсолютное прошедшее время настенных часов с некоторой произвольной фиксированной точки в прошлом. CACurrentMediaTime() или mach_absolute_time возвращают монотонное время.

Немонотонное время представляет собой наилучшее предположение машины относительно текущих настенных часов, времени суток. Он может прыгать вперед и назад при изменении часов системного времени. Вызов [NSDate date] возвращает его.

Как вариант, можно взять доверенные дату/время из заголовка ответа httpDate. Затем сохраните его и текущее монотонное время (CACurrentMediaTime()) в связке ключей. Вот способ получить текущее доверенное время:

last known online time + (CACurrentMediaTime() - saved monotonic time)

Другим решением было бы использование NTP-сервера.

person sgl0v    schedule 30.05.2016

Это может решить вашу проблему

NSDate * date = [NSDate date];
        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
        NSString *currentTime = [dateFormatter stringFromDate:date];
        NSLog(@"current time is:%@",currentTime);
person Sucharu Hasija    schedule 30.05.2016

используйте этот код, он поможет вам

NSDate * datee = [NSDate date];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"];
NSString *localDateString = [dateFormatter stringFromDate:currentDate];

NSLog(@"%@",localDateString);
person Community    schedule 30.05.2016
comment
Я хочу получить правильное текущее время. Он вернет текущее время устройства, а не текущее время UTC. - person Meet Doshi; 30.05.2016

Используйте 1_

Это даст вам абсолютную дату и время в эталонной зоне GMT.

person Nicolas Buquet    schedule 30.05.2016
comment
Это не работает, если вы устанавливаете время вручную без использования часового пояса. Он вернется по времени устройства с временем UTC. - person Meet Doshi; 30.05.2016
comment
Устройство всегда работает с использованием времени UTC. Точность часового пояса используется только для отображения времени, но только для отображения. - person Nicolas Buquet; 30.05.2016

Попробуй это:

быстрый:

let date = NSDate()
let dateFormatter = NSDateFormatter()
let timeZone = NSTimeZone(name: "UTC")

dateFormatter.timeZone = timeZone

println(dateFormatter.stringFromDate(date))

Объект-C:

NSDate *date = [NSDate date];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"UTC"];

[dateFormatter setTimeStyle:NSDateFormatterMediumStyle];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
[dateFormatter setTimeZone:timeZone];       
NSLog(@"%@", [dateFormatter stringFromDate:date]);
person AkBombe    schedule 30.05.2016

Вы можете использовать этот код для получения текущего времени: -

Свифт 3

let date = Date()
let formatter = DateFormatter()
formatter.timeZone = TimeZone(abbreviation: "GMT+0:00") //Current time zone
formatter.dateFormat = "HH:MM a"
let currentTime: String = formatter.stringFromDate(date)
print("My Current Time is \(currentTime)")

Result **
Output : - "My Current Time is 11:05 AM\n"
person Anand Nimje    schedule 31.05.2016