2011-09-16 2 views
3

Запустите следующий код:NSDate отключен 5 часов

NSDate * now = [NSDate date];

NSLog(@"now: %@", now); 

и получите:

2011-09-16 16: 14: 16.434 iSavemore [1229: 7907] Сейчас: 2011-09-16 21:14:16 +0000

Как вам может видеть, что я запускаю это в 16:14:16 (16:14), но NSDate возвращается 21:16:16 (9:14 pm!). Это проблема Xcode4 или проблема NSDate?

+0

Это на устройстве или в тренажере? – DarkDust

ответ

9

NSDate по умолчанию Всеобщую часовой пояс (GMT) ака.

Я предполагаю, что вы находитесь где-то на восточном побережье, на 5 часов позади UTC.

Попробуйте добавить это к вашей дате форматировщику ...

NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 

[dateFormatter setLocale:[NSLocale currentLocale]]; 

... и вы должны увидеть ваше местное время.

Если вы хотите использовать указанный язык, а не 'currentLocale', создайте NSLocale для соответствующего языкового стандарта.

NSLocale *usLoc = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]; 

[dateFormatter setLocale:usLoc]; 

... на самом деле это США (возможно, не центральный).

Более конкретная временная зона помощь можно найти здесь ...

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSDateFormatter_Class/Reference/Reference.html

Однако, если вы хотите, чтобы показать время окончания срока, не будет вы все еще хотите в currentLocale пользователя?

+0

Im в центральном часовом поясе, и мне нужно заставить NSDate оставаться в центральной причине. Мне нужно рассчитать дату истечения срока, и она будет основана на Далласе независимо от того, где находится пользователь. Как мне это сделать? –

+0

Я отредактировал свой ответ выше, чтобы помочь с этим. – Snips

-1

Просто дикая догадка здесь, но может быть, это что-то связано с часовыми поясами?

0

Попробуйте установить часовой пояс вашего NSDate на тот, который уместно ваши потребности, например [NSTimeZone localTimeZone]

5

Если вы посмотрите на выходе вы увидите, что журнал включает в себя часовой пояс:

2011-09-16 16:14:16.434 iSavemore[1229:7907] now: 2011-09-16 21:14:16 +0000 
                     ^^^^^^ 

Метка времени вашего журнала местное время. Предполагаете, у вас есть часовой пояс, что на 5 часов больше, чем в UTC.

A NSDate относится к конкретному моменту времени. Это зависит от вас, чтобы отобразить это, но вы хотите; обычно с NSDateFormatter.

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

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