Ошибка смещения часового пояса при переходе на летнее время в iOS - PullRequest
1 голос
/ 22 марта 2012

друзей, я получаю дату на основе вычислений, которые я сделал ниже

      NSCalendar *gregorian          = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

        NSDate *expectedDate           = [gregorian dateByAddingComponents:components toDate:startDate options:0];
        NSTimeInterval timeZoneOffset  = -[[NSTimeZone systemTimeZone] secondsFromGMTForDate:expectedDate];
        NSDate *localDate              = [expectedDate dateByAddingTimeInterval:(timeZoneOffset)];

         NSString *date  = [dateFormatter stringFromDate:localDate];

Но дата работает неправильно, когда действует дневное , а также изменяется timeZoneOffsetкогда действует летнее время, но я хочу одну и ту же дату независимо от того, действует ли летнее время или нет ..

Итак, друзья, как мне справиться с этой ситуацией, пожалуйста, помогите.

С уважением, Ранджит

Ответы [ 2 ]

3 голосов
/ 17 ноября 2012

Вам не нужно заботиться о переходе на летнее время самостоятельно, «dateFormatter» сделает это автоматически для вас.Обычно вам нужен только объект NSDate во времени UTC (GMT + 0), а «dateFormatter», который также имеет часовой пояс, будет отображать это время в своем часовом поясе.

NSCalendar и NSDateFormatter имеют настройки часового пояса,NSDate - это просто момент времени относительно GMT + 0.

Пример: «Ожидаемая дата» - 1 января, 4:00 (GMT + 0). «DateFormatter» имеет часовой пояс GMT + 2 (например, Европа / Берлин),затем он будет выводить «1 января 6 утра» из-за своего собственного часового пояса при преобразовании «Ожидаемая дата» в строку.

Так что в основном вам просто нужно убедиться, что «startDate» правильно и что «григорианские» и «dateFormatter "использовать правильный часовой пояс.По умолчанию они используют системный часовой пояс, который, кажется, тот, который вы хотите использовать.Поэтому вам нужны только эти строки (и startDate должна быть правильной):

    NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDate *expectedDate = [gregorian dateByAddingComponents:components toDate:startDate options:0];
    NSString *date  = [dateFormatter stringFromDate:expectedDate];

Если это не сработает, пожалуйста, опубликуйте больше кода о том, как генерируются startDate и dateFormatter.

0 голосов
/ 17 сентября 2012

Джеймс, попробуйте это

//To Fix DaylightSaving, 1 hr added to startDate.

        NSTimeInterval secondsInOneHour = 1 * 60 * 60;
        NSDate *expectedDST       = [startDate dateByAddingTimeInterval:secondsInOneHour];        
        NSDate *expectedDate      = [gregorian dateByAddingComponents:components toDate:expectedDST options:0];

        NSTimeInterval timeZoneOffset  = -[[NSTimeZone systemTimeZone] secondsFromGMTForDate:expectedDate];

        NSDate *localDate              = [expectedDate dateByAddingTimeInterval:timeZoneOffset]; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...