Проблема с часовым поясом, когда отображение даты в пользовательском интерфейсе (показывать на 1 день меньше) в задаче C - PullRequest
0 голосов
/ 28 декабря 2018

Я столкнулся с одной проблемой, которая связана с другим часовым поясом.

В пользовательском интерфейсе я установил дату с 3/11/18

оставьтеEndDate -> 3/11/ 18

в процессе обслуживания я получаю результат.

LeaveEndDate = "2018-03-11T06: 00: 00Z";

Нокогда я отображаю дату в пользовательском интерфейсе, она показывает "3/10/18" , но фактический результат должен быть "3/11/18"

Отображается 1день меньше в приложении.

Я изменил часовой пояс -> Вашингтон, округ Колумбия - США, и он должен работать для всех часовых поясов.

  1. Подход

    // Отрегулируйте даты.

            NSDate* originalDateValue = [self valueForKey:actualKey];
    
            NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
            dateFormatter.dateFormat = @"yyyy-MM-dd HH:mm:ss Z"; // tried formatter-> @"yyyy-MM-dd'T'HH:mm:ss'Z'"; // yyyy-MM-dd'T'HH:mm:ss.SSSSSSZ
            dateFormatter.timeZone = [NSTimeZone timeZoneWithName:@"UTC"];
            NSString *dateString = [dateFormatter stringFromDate:originalDateValue];
    
            dateFormatter.timeZone = [NSTimeZone localTimeZone];
    
            NSDate * actualDate = [dateFormatter dateFromString:dateString];
    
            [self setValue:actualDate forKey:actualKey];
    
  2. Другой подход, который я использовал:

// Отрегулируйте даты.

NSDate* originalDateValue = [self valueForKey:actualKey];
NSDate* adjustedDateValue = [self.class adjustDate:originalDateValue forTimezone:[self timeZoneName]];

    +(NSDate*)adjustDate:(NSDate*)originalDateValue forTimezone:(NSString*)timezoneName
    {

    if([originalDateValue isEqual:[NSNull null]]) return nil;

    NSTimeInterval timeInterval = ([[NSTimeZone timeZoneWithName:timezoneName] secondsFromGMTForDate:originalDateValue] - [[NSTimeZone localTimeZone] secondsFromGMTForDate:originalDateValue]);

    NSDate* adjustedDateValue = [originalDateValue initWithTimeInterval:timeInterval sinceDate:originalDateValue]; //[originalDateValue dateByAddingTimeInterval:timeInterval];

    return adjustedDateValue;
    }

Третий подход

NSDate* originalDateValue = [self valueForKey:actualKey];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss.SSSZ";
[dateFormatter setLocale:[NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"]];
NSString *dateString = [dateFormatter stringFromDate:originalDateValue];
NSDate* adjustedDateValue = [dateFormatter dateFromString:dateString];

Любая помощь?

1 Ответ

0 голосов
/ 28 декабря 2018

originalDateValue всегда устанавливается на время UTC для даты, которую вы ему даете.NSDate работает по времени UTC, так как вы не указываете часовой пояс.dateFormatter преобразует вводимые вами данные в местное время, которое отстает на несколько часов.Поскольку вы не указываете время, оно устанавливает время на 00:00:00 в полночь, поэтому при преобразовании UTC в Вашингтон, округ Колумбия, вы настраиваете часовой пояс на несколько часов позже.

Вы должны настроитьисходная дата в соответствии со смещением от UTC до localTimeZone:

NSInteger sourceUTCOffset = [sourceTimeZone secondsFromGMTForDate:originalDateValue];
NSInteger destinationUTCOffset = [localTimeZone secondsFromGMTForDate:originalDateValue];
NSTimeInterval interval = destinationUTCOffset - sourceUTCOffset;

NSDate destinationDate = [initWithTimeInterval:interval sinceDate:originalDateValue];

Затем оперируйте destinationDate так, как вы уже указали.

...