В iOS нарушен переход на летнее время в NSTimeZone?

#ios #dst #nstimezone

#iOS #летнее время #nstimezone

Вопрос:

У меня есть две переменные:

 NSTimeZone *timeZoneMinus5 = [NSTimeZone timeZoneForSecondsFromGMT: -18000];
NSTimeZone *timeZoneEST = [NSTimeZone timeZoneWithName:@"EST"];
  

Протестировано как на устройстве, так и на симуляторе, оба возвращаются GMT-05:00 .

Когда я пишу это, время 2:55 am (GMT) . Я нахожусь в EST часовом поясе, поэтому мое время 10:55pm (GMT-05:00) , переход на летнее время осуществляется 15 апреля 2011 года.

Однако [timeZoneEST isDaylightSavingTime] возвращается NO и [timeZoneEST daylightSavingTimeOffset] возвращается 0 .

Если я использую timeZoneEST для получения текущего времени в виде строки:

 NSDate *gmtTime = [NSDate date];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"h:mm a (z)"];
[dateFormatter setTimeZone: timeZoneEST];
NSString *timeStr = [dateFormatter stringFromDate: gmtTime];
  

и симулятор, и устройство выдают меня 9:55 PM (GMT-05:00) .

В моем понимании я должен получать 10:55 PM (GMT-05:00) . Я ошибаюсь или я делаю это неправильно?

Ответ №1:

Вы очень смущены. Начнем с того, что переход на летнее время в восточном часовом поясе США равен -4, а не -5. 9: 55 вечера, безусловно, за 5 часов до 2: 55 утра; 10: 55 вечера было бы за 4 часа до.

Скорее всего, «EST» дает вам именно это: восточное стандартное время без учета перехода на летнее время. «EST5EDT» может указывать часовой пояс, который вы ожидаете, хотя (при условии, что устройство использует zoneinfo, как это делает симулятор) «America / New_York» было бы предпочтительнее.

Комментарии:

1. действительно, и теперь я также теперь, что меня смутило. Значение -18000 было отправлено в приложение моей серверной программой, которая выполняется на виртуальной машине, у которой было неправильное время. В любом случае спасибо.

Ответ №2:

Вы определяете свой NSTimeZone как EST, поэтому имеет смысл, что [timeZoneEST isDaylightSavingTime] возвращается NO . Вместо этого используйте [[NSTimeZone localTimeZone] daylightSavingTimeOffset]; , чтобы получить смещение перехода на летнее время для местного времени. Он должен вернуть 3600 секунды.