2010-04-05 4 views
3

У меня есть следующий код в приложении производства, которая вычисляет дату GMT с момента пользователь входит:NSDate - GMT на iPhone

NSDate *localDate = pickedDate; 
    NSTimeInterval timeZoneOffset = [[NSTimeZone defaultTimeZone] secondsFromGMT]; // You could also use the systemTimeZone method 
    NSTimeInterval gmtTimeInterval = [localDate timeIntervalSinceReferenceDate] - timeZoneOffset; 
    NSDate *gmtDate = [NSDate dateWithTimeIntervalSinceReferenceDate:gmtTimeInterval]; 

код работает нормально, до тех пор, Страшное летнее время не пришло в силы в Великобритании на прошлой неделе.

Как я могу конвертировать дату в GMT с учетом летнего сбережения?

ответ

6

NSDate использует смещение от абсолютного значения для представления временных интервалов. Основа заключается в GMT и все временные интервалы в GMT, поэтому вы видите разницу. Если вам требуется строковое представление вашей даты (например, для хранения в базе данных или что-то еще), используйте NSDateFormatter, чтобы создать его в любом конкретном часовом поясе, в котором вы нуждаетесь.

Таким образом, это всегда даст вам строковое представление (например, для хранения в MySQL) на дату по Гринвичу (с Daylights экономии времени приходилось):

NSDateFormatter* formatter = [[[NSDateFormatter alloc] init] autorelease]; 
[formatter setDateFormat:@"YYYY-MM-dd HH:mm:ss"]; // e.g., set for mysql date strings 
[formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]]; 
NSString* mysqlGMTString = [formatter stringFromDate:[NSDate date]]; 

Это даст вам правильную строку даты в GMT, независимо от местного часового пояса. Кроме того, имейте в виду, что все относительные измерения, которые вы делаете с NSDate и временными интервалами, имеют свою основу в GMT. Используйте форматирование даты и объекты календаря, чтобы преобразовать их в более значимые вещи, когда вы представляете их пользователю, или если вам нужно выполнить календарные вычисления (например, отображать предупреждение о том, что срок действия вашей подписки истекает завтра).

EDIT: Я забыл добавить часовой пояс! Без него форматер будет использовать системный часовой пояс.

+1

Вы можете конвертировать в NSDate используя NSDateFormatter, а также: http://stackoverflow.com/questions/1578577/nsdateformatter-datefromstring-will-not-parse-a-particular-date-string/1586083#1586083 –

+0

@ Эпсилон Прайм: ну да, но он специально задавал вопрос о том, чтобы работать с датами и часовыми поясами, а не обязательно. Я выбрал этот пример, потому что это общая причина, по которой люди хотят конвертировать из локального часового пояса в другую (например, GMT). –

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