Метод даты NSDate возвращает неверный результат

Я знаю, что есть много вопросов такого типа, но я не нашел решения для своего дела; Мне нужно получить текущий и правильный объект NSDate , а не NSString ! Этот код возвращает неправильное время (+3 часа), потому что я из Украины.

 NSDate *currentDate = [NSDate date]; 

Как получить текущий объект NSDateFormatter из NSDateFormatter ? Я знаю только, как получить NSString , но мне это не нужно.

EDIT: Я использую этот код для сравнения 2 NSDates с использованием объекта NSCalendar , вот код:

 NSCalendar *calendar = [NSCalendar currentCalendar]; NSUInteger unitFlags = NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit; NSDateComponents *components = [calendar components:unitFlags fromDate:nowDate toDate:endDate options:0]; 

и components.hour показывает мне разницу в 3 часа

3 Solutions collect form web for “Метод даты NSDate возвращает неверный результат”

NSDates всегда хранятся в UTC, фактически сами даты не знают ничего о часовых поясах или неделях, месяце, годах. Это всего лишь момент времени.

Чтобы увидеть правильное время для вашей позиции на поверхности земли, вам нужно взять NSCalendar, который представляет вашу модель времени в учетной записи. Вы можете использовать его напрямую и возиться со своими датами или создать NSDateFormatter, который оставит даты нетронутыми, но приспосабливает их появление к вашим потребностям.

 NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setDateStyle:NSDateFormatterFullStyle]; [formatter setTimeStyle:NSDateFormatterFullStyle]; NSLog(@"%@", [formatter stringFromDate: date1]); 

приводит к

 Thursday, July 12, 2012, 4:36:07 PM Central European Summer Time 

в ответ на комментарий:

попробуйте этот код в качестве теста

 NSDate *now = [NSDate date]; NSDate *startOfToday = nil; NSDate *startOfThisWeek = nil; NSDate *startOfThisMonth = nil; NSDate *startOfThisYear = nil; [[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit startDate:&startOfToday interval:NULL forDate:now]; [[NSCalendar currentCalendar] rangeOfUnit:NSWeekCalendarUnit startDate:&startOfThisWeek interval:NULL forDate:now]; [[NSCalendar currentCalendar] rangeOfUnit:NSMonthCalendarUnit startDate:&startOfThisMonth interval:NULL forDate:now]; [[NSCalendar currentCalendar] rangeOfUnit:NSYearCalendarUnit startDate:&startOfThisYear interval:NULL forDate:now]; NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setDateStyle:NSDateFormatterFullStyle]; [formatter setTimeStyle:NSDateFormatterFullStyle]; NSLog(@"%@", now); NSLog(@"%@", [formatter stringFromDate:now]); NSLog(@"%@", startOfToday); NSLog(@"%@", [formatter stringFromDate:startOfToday]); NSLog(@"%@", startOfThisWeek); NSLog(@"%@", [formatter stringFromDate:startOfThisWeek]); NSLog(@"%@", startOfThisMonth); NSLog(@"%@", [formatter stringFromDate:startOfThisMonth]); NSLog(@"%@", startOfThisYear); NSLog(@"%@", [formatter stringFromDate:startOfThisYear]); 

вы поймете, что начало дня, недели, месяца и года будет скорректировано к вашему местному времени, так как первая из каждой пары NSLog даст вам дату в формате UTC и вторую в вашем локальном часовом поясе.


в чате вы разместили этот код

 NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; [dateFormat setDateFormat:@"yyyy-MM-dd HH:mm"]; [dateFormat setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; NSDate *date = [dateFormat dateFromString:dateString]; [dateFormat release]; 

поэтому проблема заключается в том, что datestring на самом деле не от GMT, а EET (Восточноевропейское время)

пытаться

 [dateFormat setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"EET"]]; 

но самым изящным решением было бы получить datestring со смещением к UTC, аналогично 2012-07-12 12:23:00 +0300 если возможно, насколько возможно.
В таком случае вы можете проанализировать его с помощью
[dateFormat setDateFormat:@"yyyy-mm-dd HH:mm:ss Z"]; и не нуждаются в дальнейшей обработке часовых поясов, так как форматер знает смещение через Z спецификатор.
Также обратите внимание, что если вы не устанавливаете часовой пояс, следует использовать ток устройства. Если пользователь всегда находится в том же часовом поясе, что и время от строки даты, это тоже должно работать. Но если пользователь покидает эту зону, или вы хотите, чтобы она работала по всему миру, вы должны использовать одно из решений, которые я вам дал. Второй (с указанием часового пояса с-в datestring) является предпочтительным.

Дата, вероятно, имеет правильное значение; возможно, вы считаете, что это неправильно, потому что это неправильно, когда вы его регистрируете? Это связано с тем, что когда вы регистрируете его, он показывает дату в формате UTC. Вы можете получить строку в своем локальном часовом поясе, используя NSDateFormatter .

Ответ правильный, если вторая дата указана в формате UTC. На данный момент Украина на 3 часа больше, чем в UTC, а в 21:00 UTC – в 21:00. 21:00 – 18:00 – 3 часа. Поэтому проверьте, как вы получаете вторую дату. Возможно, для него определен неверный часовой пояс.

Если первая дата действительно была создана в 18:00 по Украине через

 nowDate = [NSDate date]; 

то вторая дата на самом деле составляет 21:00 по Украине, что соответствует полуночи UTC. Поскольку вы утверждаете, что это полночь, вы должны использовать UTC, чтобы создать его из строки – либо неявно, либо явно. Покажите нам, как вы его создали.

** РЕДАКТИРОВАТЬ **

Код, который вы мне дали в чате, таков:

 NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; [dateFormat setDateFormat:@"yyyy-MM-dd HH:mm"]; [dateFormat setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; NSDate *date = [dateFormat dateFromString:dateString]; [dateFormat release]; 

Третья строка устанавливает часовой пояс GMT, который идентичен UTC для всех целей и целей. Ваш формат даты, вероятно, инициализирован правильной локалью для устройства, и, возможно, вы можете просто оставить эту строку.

Interesting Posts

Выравнивание по OpenGL

Нельзя использовать один текстовый вход для другого

iOS 6: как принудительно изменить ориентацию при нажатии контроллера просмотра в стек навигационного контроллера

MobileVLCKit Audio работает, видео не работает

Как остановить звук после окончания цикла в iOS

iOS песочница / тестовая учетная запись продолжает просить войти в систему после выхода приложения

Вызов функции executeSeguewIdentifier не вызывает ifperformseguewithIdentifier

Как контролировать изменение файла на платформе iOS?

UITableViewHeaderFooterView удаляет прозрачность

Преобразование массива настраиваемого объекта в AnyObject в Swift

Внедрение пропусков AFNetworking

Создание горизонтальной панели бесконечного прокрутки в iOS

Разархивируйте файлы в swift

Swift целочисленный тип, преобразованный в перечисление

ios 7 dequeueReusableCellWithIdentifier: forIndexPath метод – нужен ли метод registerClass

PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.