iOS NSDate和NSDateFormatter行为

时间:2014-09-04 17:17:05

标签: ios objective-c nsdate nsdateformatter

所以,我有一个格式为YYMMDDHHMMSS的String,我正在努力(很难)从中获取一个正确的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

我已经检查了这个table并且我的格式化程序看似正确,我也尝试删除语言环境,但我的日期仍然错误。那么,是否有可能回到正确的时间?

感谢。

1 个答案:

答案 0 :(得分:2)

正如您对问题的评论所指出的那样,NSDate是正确的; NSDate始终将时间存储在GMT中。默认情况下,当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默认使用您的本地时区,因此应将dateGMT“转换回GMT-4:30并将dateString设置为{ {1}}。


所有这一切,在当地时区存储日期几乎总是一个坏主意。时区是棘手的事情,因此最好始终在2014-09-04 12:32:21 / GMT存储日期并对其进行任何计算,然后只在将其显示给用户时将其转换为当地时间。如果您所在时区以外的人访问您的数据,您的时区规则发生变化(比您想象的更频繁),您需要将日期传递给某些外部服务/应用程序等,这将为您节省很多痛苦。