在 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 方软件将其转换为您的时区以供显示。时区并不重要,除了显示目的(或者如果您需要在它们之间进行转换以进行计算,也许)。而且,NSDate
s 本身并不真正对应于任何特定的时区,尽管在内部它们被表示为好像它们是 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
...
我通过做一些研究并使用 设法解决了我面临的问题。我为可能遇到与时区相关的此类问题的任何人提到了一些发现。
调查结果:
保存在database
的日期(原本在任何时区)将保存在'GMT/UTC'
时区。
直接在数据库local timezone
中看到的日期是因为third party tool
是用来查看数据库中数据的。
当日期从 database
中取出时,它也在 'GMT/UTC'
时区。
要查看 specific timezone
中的日期,NSDateFormatter
与指定的特定时区一起使用。
最重要的是NSDate
对象总是与任何timezone
无关并且总是在'GMT/UTC'
我正在使用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 方软件将其转换为您的时区以供显示。时区并不重要,除了显示目的(或者如果您需要在它们之间进行转换以进行计算,也许)。而且,NSDate
s 本身并不真正对应于任何特定的时区,尽管在内部它们被表示为好像它们是 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
...
我通过做一些研究并使用
调查结果:
保存在
database
的日期(原本在任何时区)将保存在'GMT/UTC'
时区。直接在数据库
local timezone
中看到的日期是因为third party tool
是用来查看数据库中数据的。当日期从
database
中取出时,它也在'GMT/UTC'
时区。要查看
specific timezone
中的日期,NSDateFormatter
与指定的特定时区一起使用。最重要的是
NSDate
对象总是与任何timezone
无关并且总是在'GMT/UTC'