Метод даты 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

viewWillLayoutSubviews вызывается после уведомления applicationDidEnterBackground

Как мне связать объекты Core Data для использования с RestKit?

Pods-resources.sh Разрешение отклонено в проекте iOS

iOS. Невозможно добавить событие календаря в календарь Gmail с помощью EventKit.

Как нажимать новый контроллер просмотра при прослушивании ячейки таблицы?

ShareKit – размещение связанного изображения на стене facebook

iOS 7 webview и постоянство локального хранилища

Несколько NSManagedObjectContexts или один контекст и -performBlock

phoneGap – iOS – изображения ОК с Wi-Fi, но не загруженные с использованием 3G (отлично работают с использованием сафари)

Ошибка iOS при настройке элементов навигации

Вставить PDF Viewer для приложения PhoneGap

Сбой в свойствах расширения в категории NSString

Отправка и получение файлов cookie на / из сервера в Swift

Кордова iOS не может отключить просмотр с клавиатуры

Как избежать зависания пользовательского интерфейса при сохранении управляемого объекта?

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