#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
секунды.