Objective-c NSDateFormatter时区恢复为GMT
我正在玩一些时区计算,我注意到一个相当恼人的错误,这给我带来了问题 如果我创建一个日期,使用NSDateformatter将其转换为某个时区,检索该字符串,然后使用dateformatter将该字符串转换回日期对象,它会一直还原为我的本地GMT时间 范例Objective-c NSDateFormatter时区恢复为GMT,objective-c,xcode,Objective C,Xcode,我正在玩一些时区计算,我注意到一个相当恼人的错误,这给我带来了问题 如果我创建一个日期,使用NSDateformatter将其转换为某个时区,检索该字符串,然后使用dateformatter将该字符串转换回日期对象,它会一直还原为我的本地GMT时间 范例 NSDate *date = [NSDate date]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateForm
NSDate *date = [NSDate date];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss zzz"];
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"COT"]];
NSString *str = [dateFormatter stringFromDate:date];
NSLog(@"%@", str);
//prints 2015-02-04 10:33:45 GMT-5
NSDate *newDate = [dateFormatter dateFromString:str];
NSLog(@"%@", newDate);
//Prints 2015-02-04 15:33:45 +0000
为什么它总是回到格林尼治时间?我需要date对象准确地反映我为某些测试目的将dateformatter设置为的时区,因此这是一个非常令人沮丧的问题
任何帮助都将不胜感激我认为问题在于
NSDate
本身(即,您在末尾记录的值)没有时区-它只是一个瞬间。使用stringFromDate*格式化值时指定时区*,而将值*解析*回
NSDate时仍然使用时区*。。。但是
NSDate`值本身不记得时区
举一个不同的例子,假设您有一个用于NSInteger
的IntegerFormatter
,它可以让您说您是想用十六进制还是十进制格式化和解析。您可以将十进制值16格式化为0x10,然后将该值解析回。。。但是NSInteger
不会“记住”它是从hex解析的。这里完全一样-时区在解析中起作用(至少当值本身没有指定时区时),但它本身不是结果的一部分
我需要date对象准确反映时区
然后您需要将时区与
NSDate
分开,基本上。。。(查看文档,听起来像是NSCalendarDate
做了您想做的事情,但这是不推荐的。)一个NSDate
对象没有时区。当您将其转换为文本时,应使用带有指定时区的NSDateFormatter
。我已在dateformatter中指定了时区。读我的密码对不起。我以为你在问有关NSLog(@“%@”,newDate)的问题代码>。NSDate的后缀包含GMT偏移量,当我使用dateformatter并将其设置为新时区时,我需要该后缀来准确反映我设置的时区to@AdamM:否,您的意思是“将NSDate转换为字符串的结果包含GMT偏移量”。这与NSDate本身拥有这些信息不是一回事。啊,这是不幸的。可惜他们不赞成NSCalenderdate,这对我来说是完美的。那我就得修改我的代码了。标记为正确。谢谢你的信息!