Получение разницы в часе на дату

Ниже приведен код, который я пишу для преобразования времени UTC в местное время:

NSDateFormatter *dateFormatter1 = [[NSDateFormatter alloc] init];
    [dateFormatter1 setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss"];
    NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
    [dateFormatter1 setLocale:locale];
    NSDate *date = [dateFormatter1 dateFromString:dateString];

    dateString = [date descriptionWithLocale:[NSLocale systemLocale]];

    NSTimeZone *currentTimeZone = [NSTimeZone localTimeZone];
    NSTimeZone *utcTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"];

    NSInteger currentGMTOffset = [currentTimeZone secondsFromGMTForDate:date];
    NSInteger gmtOffset = [utcTimeZone secondsFromGMTForDate:date];
    NSTimeInterval gmtInterval = currentGMTOffset - gmtOffset;

    NSDate *destinationDate = [[NSDate alloc] initWithTimeInterval:gmtInterval sinceDate:date];

    NSDateFormatter *dateFormatters = [[NSDateFormatter alloc] init];
    [dateFormatters setDateFormat:@"HH:mm"];
    [dateFormatters setTimeZone:[NSTimeZone systemTimeZone]];
    dateString = [dateFormatters stringFromDate: destinationDate];  

Но таким образом я получаю разницу в 1 час. то есть, если в веб-приложении отображается дата 12:30, в приложении она отображается как 13:30. Почему это так?

2 ответа

Попробуйте с этим кодом:

- (NSDate *) UTCTimeToLocalTime
{
    NSTimeZone *tz = [NSTimeZone defaultTimeZone];
    NSInteger seconds = [tz secondsFromGMTForDate: yourDate];
    return [NSDate dateWithTimeInterval: seconds sinceDate: yourDate];
}

- (NSDate *) LocalTimeToUTCTime
{
    NSTimeZone *tz = [NSTimeZone defaultTimeZone];
    NSInteger seconds = -[tz secondsFromGMTForDate: yourDate];
    return [NSDate dateWithTimeInterval: seconds sinceDate: yourDate];
}

Вы должны изучить и принять принципы обработки времени и даты.

NSDate представляет моменты времени, независимые от любого часового пояса. Если мы говорим по телефону, и наши компьютеры вычисляют [дату NSDate], они получают точно такую ​​же дату, даже если наши часы показывают абсолютно разное время.

Календари с информацией о часовых поясах преобразуются между NSDate и тем, что ожидает пользователь в одной конкретной части мира. Таким образом, та же самая NSDate преобразуется в строку, чтобы соответствовать отображению ваших часов или отображению моих часов, которое будет другим. Там не должно быть необходимости изменять NSDate во всем этом, как вы сделали.

Другие вопросы по тегам