为什么时间在这里显示不正确?

Why time is showing incorrectly here?

我已经使用 NSDateFormatter 将 dateFromString 设置如下

NSString *string = @"Tuesday, February 3, 2015 10:54:39 PM";
NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
[formatter setDateFormat:@"EEEE, MMMM d, y hh:mm:ss a"];
NSDate *myDate = [formatter dateFromString:string];
NSLog(@"myDate is: %@", [myDate description]);

输出为: myDate 为:2015-02-03 17:24:39 +0000

我是不是遗漏了什么。

您的输出日期转换为 UTC 格式,您是否必须添加 GMT 时间与 UTC 时间之间的时间差异,如下所示

NSString *string = @"Tuesday, February 3, 2015 10:54:39 PM";
NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
[formatter setDateFormat:@"EEEE, MMMM d, y hh:mm:ss a"];
NSTimeZone* currentTimeZone = [NSTimeZone localTimeZone];
NSInteger currentGMTOffset = [currentTimeZone secondsFromGMT];
NSDate *myDate = [formatter dateFromString:string];
myDate = [NSDate dateWithTimeInterval:currentGMTOffset sinceDate:myDate] ;
NSLog(@"myDate is: %@", [myDate description]);

当您 NSLog 一个 NSDate 时,它会显示 GMT/UTC 时间的日期(因此 +0000)。这是因为 NSDate 对象本身不会捕获时区,只有 NSDate 对象的字符串表示才可以。所以假设这个输入字符串在你当地的时区,你的格式化程序是正确的。

如果此输入字符串确实在 GMT/UTC 中,但此字符串中没有任何内容可以告诉您(例如 +0000Z ),那么您必须明确告诉 NSDateFormatter 您知道它不一定是本地时区,而是您知道原始字符串在特定时区,例如:

NSString *string = @"Tuesday, February 3, 2015 10:54:39 PM";
NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
formatter.dateFormat = @"EEEE, MMMM d, y hh:mm:ss a";
formatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
NSDate *myDate = [formatter dateFromString:string];

请记住,无论何时您 NSLog 一个 NSDate,它都会在 GMT/UTC 中显示给您。如果要在本地时区显示 NSDate,请使用 NSDateFormatter 方法 stringFromDate:(不指定格式化程序的 timeZone 属性,从而默认到你当地的时区)。

顺便说一句,有关从 Web 服务解析时区时的其他注意事项,请参阅 Apple Technical Q&A 1480。值得注意的是,在解析您知道的公历日期时,无论用户使用的是哪种日历格式,您可能还需要明确指定格式化程序的 locale

formatter.locale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"];