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: Я забыл добавить часовой пояс! Без него форматер будет использовать системный часовой пояс.
Вы можете конвертировать в NSDate используя NSDateFormatter, а также: http://stackoverflow.com/questions/1578577/nsdateformatter-datefromstring-will-not-parse-a-particular-date-string/1586083#1586083 –
@ Эпсилон Прайм: ну да, но он специально задавал вопрос о том, чтобы работать с датами и часовыми поясами, а не обязательно. Я выбрал этот пример, потому что это общая причина, по которой люди хотят конвертировать из локального часового пояса в другую (например, GMT). –