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. Используйте средства форматирования даты и объекты календаря, чтобы преобразовать их в более значимые вещи, когда вы представляете их пользователю или если вам необходимо выполнить вычисления календаря (например, отображая предупреждение о том, что ваша подписка истекает завтра).
РЕДАКТИРОВАТЬ: я забыл добавить часовой пояс! Без него программа форматирования будет использовать системный часовой пояс.