在 sqlite 数据库中以 'GMT' 时区保存日期

Save date in 'GMT' timezone in sqlite database

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

例如。 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 中的日期,而不管我设备的时区如何?

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

The sole primitive method of NSDate, timeIntervalSinceReferenceDate, provides the basis for all the other methods in the NSDate interface. This method returns a time value relative to an absolute reference date—the first instant of 1 January 2001, GMT.

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

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

我通过做一些研究并使用 设法解决了我面临的问题。我为可能遇到与时区相关的此类问题的任何人提到了一些发现。

调查结果:

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

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

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

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

  5. 最重要的是NSDate对象总是与任何timezone无关并且总是在'GMT/UTC'