2014-09-04 58 views
0

所以,我有一个格式为YYMMDDHHMMSS的字符串,我试图(很难)从它得到一个合适的NSDate对象。iOS的NSDate和NSDateFormatter行为

这是我的代码:

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和我格式化似乎是正确的,我也试图消除语言环境,但我仍然有错误的日期。那么,是否有可能恢复正确的时间?

谢谢。

+3

当您记录一个NSDate对象时,您始终以格式显示它,时间显示为GMT。 – rdelmar 2014-09-04 17:21:29

+0

你是对的。我将它转换回NSString并获得原始字符串。问题是,我需要将其保存到数据库(SQLite)并且查询正在错误的时间进行。有什么建议么? – ilbesculpi 2014-09-04 17:29:26

+0

只是为了澄清,我期待我的数据库与这个时间一起工作:2014-09-04 12:34:21,而不是2014-09-04 17:04:21 – ilbesculpi 2014-09-04 17:30:14

回答

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将默认使用当地时区,应该从GMT“转换” dateGMT-4:30并设置dateString2014-09-04 12:32:21


之所以这么说,存储在您的本地时区的日期是几乎总是一个坏主意。时区是棘手的事情,所以最好始终在GMT/UTC的日期存储和做任何计算,然后只在将它显示给用户时将其转换为本地时间。如果你的时区以外的人访问你的数据,你的时区规则改变(比你想象的更频繁发生),你需要将你的日期传递给一些外部服务/应用程序等,这将为你节省很多痛苦。

+0

切勿在当地时间储存时间。从开始看似乎是一个好主意,但会适得其反。或者,至少要确保存储的日期包含时区标识符。 – 2014-09-04 19:27:14

+0

@HotLicks非常真实。我添加了一个注释来解释这个问题。 – 2014-09-04 19:41:09