在“GMT”时区在sqlite数据库中保存date
我正在使用Core-Data
来存储date时间对象。
例如。 2015-07-28T07:16:52+0000
这是GMT
时区ISO格式的date。
但是当我在数据库中保存这个date
NSString* dateString=@"2015-07-28T07:16:52+0000"; NSDateFormatter* dateTimeformatter=[[NSDateFormatter alloc] init]; [dateTimeformatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"]; [dateTimeformatter dateFromString:dateString];
我在数据库中看到的结果date是2015-07-28 12:46:52
根据我的设备的时区在IST
我试图在dateFormatter中设置时区,但同样的响应
NSString* dateString=@"2015-07-28T07:16:52+0000"; NSDateFormatter* dateTimeformatter=[[NSDateFormatter alloc] init]; [dateTimeformatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"]; [dateTimeformatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]]; [dateTimeformatter dateFromString:dateString];
即使将[NSDate date]
直接保存在数据库中,它也会根据设备的时区保存转换的date。
为什么Core-data不考虑NSDateFormatter的时区? 任何人都可以告诉我如何可以将数据库中的dateGMT
保存在数据库中,而不pipe我的设备的时区?
我认为你看到的行为是第三方软件将其转换为你的时区显示。 除了显示目的以外(或者如果需要在它们之间进行转换以进行计算,时间区域可能并不重要)。 而且, NSDate
自己并不真正对应任何特定的时区,尽pipe它们在内部被表示为GMT。 该文件说:
NSDate的唯一基本方法timeIntervalSinceReferenceDate为NSDate接口中的所有其他方法提供了基础。 此方法返回一个相对于绝对参考date的时间值 – 即2001年1月1日GMT的第一个瞬间。
如果你看看这个值是如何存储的(你可以使用sqlite3命令行工具),你可以看到核心数据存储为自1/1/01以来的秒数; 没有涉及时区。 我有一个应用程序 ,它做了大量的date操作,并将date存储在核心数据存储中。 它看起来像这样:
zach$ sqlite3 TaskLog.sqlite sqlite> select ZSTARTTIME from ZTASK; 459924925.598104 459925327.3355 459925356.467429 ...
我设法通过做一些研究和使用zpasternack的答案来解决我所面临的问题 。我提到了任何可能遇到与时区有关的问题的人的一些发现。
发现:
-
database
保存的date(最初在任何时区)将保存在'GMT/UTC'
时区。 -
在数据库中直接看到
local timezone
的date是因为用来查看数据库中数据的third party tool
。 -
当date从
database
取出时,也是在'GMT/UTC'
时区。 -
要查看
specific timezone
的date,NSDateFormatter
与指定的特定时区一起使用。 -
最重要的是
NSDate
对象总是与timezone
,总是在'GMT/UTC'