我已经使用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
我在这里遗漏了什么。
答案 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,但此字符串中没有任何内容可以告诉您(例如+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"];