Получение разницы в часе на дату
Ниже приведен код, который я пишу для преобразования времени 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 во всем этом, как вы сделали.