在“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的答案来解决我所面临的问题 。我提到了任何可能遇到与时区有关的问题的人的一些发现。

发现:

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

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

  3. 当date从database取出时,也是在'GMT/UTC'时区。

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

  5. 最重要的是NSDate对象总是与timezone ,总是在'GMT/UTC'