为什么时间在这里显示不正确?
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 中,但此字符串中没有任何内容可以告诉您(例如 +0000
或 Z
),那么您必须明确告诉 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"];
我已经使用 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 中,但此字符串中没有任何内容可以告诉您(例如 +0000
或 Z
),那么您必须明确告诉 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"];