NSDate - GMT на iPhone - PullRequest
       48

NSDate - GMT на iPhone

3 голосов
/ 06 апреля 2010

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

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, учитывая летнее время?

1 Ответ

6 голосов
/ 06 апреля 2010

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

Таким образом, это всегда даст вам строковое представление (например, для хранения в mysql) даты в GMT (с учетом летнего времени):

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]];

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

РЕДАКТИРОВАТЬ: я забыл добавить часовой пояс! Без него программа форматирования будет использовать системный часовой пояс.

...