iOS NSDate 和 NSDateFormatter 行为
Posted
技术标签:
【中文标题】iOS NSDate 和 NSDateFormatter 行为【英文标题】:iOS NSDate and NSDateFormatter behavior 【发布时间】:2014-09-04 17:17:04 【问题描述】:所以,我有一个格式为 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
我检查了这个table 并且我的格式化程序似乎正确,我也尝试删除语言环境,但我仍然得到错误的日期。那么,是否有可能在正确的时间回来?
谢谢。
【问题讨论】:
当你记录一个 NSDate 对象时,你总是以那种格式得到它,时间以 GMT 显示。 你是对的。我将它转换回 NSString 并得到了原始字符串。问题是,我需要将其保存到数据库(SQLite)并且查询的时间错误。有什么建议吗? 澄清一下,我希望我的数据库这次可以使用:2014-09-04 12:34:21,而不是 2014-09-04 17:04:21 解析时间字符串时,您需要将日期格式化程序设置为字符串表示的时区。当您格式化日期时,您需要将日期格式化程序设置为您希望在其中表示结果字符串的时区。存储在 NSDate 对象中的时间应该始终为 UTC。 委内瑞拉的时区是GMT-04:30,也就是说你的时间是2014-09-04 12:34:21是 2014-09-04 17 :04:21 GMT,所以输出是正确的。 【参考方案1】:正如您问题的 cmets 中所指出的,您的 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 指出的那样)。
从您的 cmets 看来,您需要将该日期以 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
中存储并计算您的日期,然后仅在向用户显示时将其转换为当地时间。如果您所在时区以外的人访问您的数据、您的时区规则发生变化(比您想象的更频繁)、您需要将日期传递给某些外部服务/应用程序等,这将为您节省很多痛苦。
【讨论】:
永远不要以当地时间存储时间。一开始似乎是个好主意,但会适得其反。或者,至少,确保存储的日期包含时区标识符。 @HotLicks 非常正确。我在答案中添加了一条注释。以上是关于iOS NSDate 和 NSDateFormatter 行为的主要内容,如果未能解决你的问题,请参考以下文章
如何在 iOS 上将“MongoDB 日期时间(ISO 日期)”解析为 NSDate(swift 和 Objective-c)