iOS NSDate和NSDateFormatter行为
所以,我有一个格式为YYMMDDHHMMSS的字符串,我试图(很难)从它得到一个合适的NSDate对象。
这是我的代码:
NSDateFormatter *format = [[NSDateFormatter alloc] init];
[format setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]];
[format setDateFormat:@"yyMMddHHmmss"];
NSDate *date = [format dateFromString:@"140904123421"];
NSLog(@“DATE:%@”,日期);
而我越来越奇怪的时代是这样的:
DATE: 2014-09-04 17:04:21 +0000
我检查过这个表格,我的格式化程序看起来是正确的,我也尝试删除区域设置,但我仍然错误的日期。 那么,是否有可能恢复正确的时间?
谢谢。
正如您对问题的评论所指出的,您的NSDate
是正确的; NSDate
始终以GMT
NSDate
保存它的时间。 默认情况下,当NSDateFormatter
分析你的日期将其转换它从你的本地时区GMT
,这样存储的内容中所产生NSDate
对象是一致的(它实际上比这更微妙的,但你能想到这样的说法)。 由于您的时区为GMT-04:30
,这意味着它将为您的时间增加4小时30分钟,因此2014-09-04 12:34:21 GMT-4:30
= 2014-09-04 17:04:21 GMT
(正如@MartinR指出的那样)。
根据您的意见,这听起来像您需要在yyyy-MM-dd HH:mm:ss
格式的本地时间内将此日期存储在您的数据库中。 最简单的方法是简单地使用第二个NSDateFormatter
:
NSDateFormatter *formatOut = [[NSDateFormatter alloc] init];
[formatOut setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSString *dateString = [formatOut stringFromDate: date];
由于默认情况下NSDateFormatter
会使用您的本地时区,因此应该将date
从GMT
转换回GMT-4:30
,并将dateString
设置为2014-09-04 12:32:21
。
所有这一切说, 在当地时区存储日期几乎总是一个坏主意 。 时区是棘手的事情,因此最好始终以GMT
/ UTC
存储和计算日期,然后在将其显示给用户时将其转换为本地时间。 如果有人时区之外的访问你的数据,你的时区规则变化(往往比你想象的情况),这会为你节省很多的痛苦,你需要你的约会对象传递给一些外部的服务/应用程序等。