【问题标题】:Save date in 'GMT' timezone in sqlite database在 sqlite 数据库中以“GMT”时区保存日期
【发布时间】:2015-07-29 10:24:01
【问题描述】:

我正在使用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 中的日期保存在数据库中,而不管我的设备的时区如何?

【问题讨论】:

  • 试试 [dateTimeformatter setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];或系统 [dateTimeformatter setTimeZone:[NSTimeZone systemTimeZone]];
  • Nop 不适用于 [NSTimeZone timeZoneWithName:@"GMT"] 和 systemTimezone 它将采用本地时区
  • 不确定,但请尝试“yyyy-MM-dd'T'HH:mm:ss Z”而不是“yyyy-MM-dd'T'HH:mm:ssZ”
  • 也许这有帮助 [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZZZ"]; stackoverflow.com/questions/16254575/…
  • 好的,所以您明白当您使用NSLog() 显示NSDate 对象时,它会显示在格林威治标准时间时区,对吧?

标签: ios core-data nsdateformatter nstimezone


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢您的回复,我想知道如果我保存日期 '2015-07-28T07:16:52+0000' 那么因为它是在 'GMT' ,将保持保存为 ' GMT' 和 '2015-07-28T07:16:52+0530' 在 'IST' 中也会首先转换回 'GMT' 并另存为 'GMT' ?
  • 是的,这基本上是正确的。无论您在输出NSDate 时看到哪个时区,在内部都是格林威治标准时间。
【解决方案2】:

通过做一些研究并使用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'

【讨论】:

    猜你喜欢
    • 2021-07-14
    • 2019-02-26
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    • 2011-02-25
    • 2012-01-27
    • 2012-08-19
    • 1970-01-01
    相关资源
    最近更新 更多