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

时间:2015-12-25 07:48:15

标签: objective-c nsdate

我已经使用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

我在这里遗漏了什么。

2 个答案:

答案 0 :(得分:0)

您的输出日期转换为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]);

答案 1 :(得分:0)

当您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"];