所以,我有一个格式为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并且我的格式化程序看似正确,我也尝试删除语言环境,但我的日期仍然错误。那么,是否有可能回到正确的时间?
感谢。
答案 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
默认使用您的本地时区,因此应将date
从GMT
“转换回GMT-4:30
并将dateString
设置为{ {1}}。
所有这一切,在当地时区存储日期几乎总是一个坏主意。时区是棘手的事情,因此最好始终在2014-09-04 12:32:21
/ GMT
存储日期并对其进行任何计算,然后只在将其显示给用户时将其转换为当地时间。如果您所在时区以外的人访问您的数据,您的时区规则发生变化(比您想象的更频繁),您需要将日期传递给某些外部服务/应用程序等,这将为您节省很多痛苦。