Вопрос

У меня есть следующий код в производственном приложении, который рассчитывает дату 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 и объекты календаря, чтобы преобразовать их в более значимые вещи, когда вы представляете их пользователю, или если вам нужно сделать расчеты календаря (например, отображение предупреждения о том, что ваша подписка истекает завтра).

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top