NSDate - GMT на iPhone
Вопрос
У меня есть следующий код в производственном приложении, который рассчитывает дату GMT со дня, когда пользователь входит:
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, принимая во внимание летнее время?
Решение
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]];
Это даст вам правильную строку даты в GMT время независимо от местного часового пояса. Кроме того, имейте в виду, что все относительные измерения, которые вы делаете с NSDate и промежутками времени, имеют свою основу в GMT. Используйте Date FormattSters и объекты календаря, чтобы преобразовать их в более значимые вещи, когда вы представляете их пользователю, или если вам нужно сделать расчеты календаря (например, отображение предупреждения о том, что ваша подписка истекает завтра).
Редактировать: Я забыл добавить часовой пояс! Без этого форматер будет использовать системный часовой пояс.