在 UI 中显示日期(少显示 1 天)在 Objective C 中时出现时区问题

Timezone issue when date display in UI(show 1 day lesser) in Objective C

我遇到了一个问题,这与不同的时区有关。

在 UI 中,我将日期设置为 3/11/18

离开结束日期 -> 3/11/18

在服务中我得到了结果。

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

但是当我在 UI 中显示日期时,它显示 "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;
    }
  1. 第三种方法

    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];
    

有什么帮助吗?

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上操作