在sqlite数据库中的“GMT”时区中保存日期

时间:2015-07-29 10:24:02

标签: ios core-data nsdateformatter nstimezone

我正在使用Core-Data存储日期时间对象。

EG。 2015-07-28T07:16:52+0000这是GMT时区的ISO格式的日期。

但是当我在数据库中保存这个日期时

 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];

我在数据库中看到的结果日期为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]直接保存在数据库中,它也会根据设备的时区保存转换后的日期。

为什么Core-data没有考虑NSDateFormatter的时区? 谁能告诉我如何在GMT数据库中保存日期而不管我的设备的时区?

2 个答案:

答案 0 :(得分:2)

我认为您所看到的行为是第三方软件将其转换为您的时区进行展示。除了显示目的(或者如果你需要在它们之间进行转换以进行计算),时区并不重要。并且,NSDate对于他们自己并不真正对应于任何特定的时区,尽管在内部它们被表示为好像是GMT。 The doc说:

  

NSDate的唯一原始方法,timeIntervalSinceReferenceDate,   为NSDate接口中的所有其他方法提供了基础。   此方法返回相对于绝对引用的时间值   日期 - 格林威治标准时间2001年1月1日的第一个瞬间。

如果您查看实际存储的值(您可以使用sqlite3命令行工具执行),您可以看到Core Data将其存储为自1/1/01以来的秒数;没有涉及时区。我有an app进行大量日期操作并将日期存储在Core Data存储中。它看起来像:

zach$ sqlite3 TaskLog.sqlite
sqlite> select ZSTARTTIME from ZTASK;
459924925.598104
459925327.3355
459925356.467429
...

答案 1 :(得分:0)

我通过做一些研究并使用zpasternack's answer 设法解决了我面临的问题。我提到了一些可能遇到与时区有关的问题的人的调查结果。

调查结果:

  1. database中保存的日期(最初在任何时区)将保存在'GMT/UTC'时区。

  2. 直接在数据库local timezone中看到的日期是因为third party tool用于查看数据库中的数据。

  3. 当日期从database中取出时,它也在'GMT/UTC'时区。

  4. 要查看specific timezone中的日期,NSDateFormatter将与指定的特定时区一起使用。

  5. 最重要的是NSDate对象始终与timezone无关,始终位于'GMT/UTC'