我正在使用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
数据库中保存日期而不管我的设备的时区?
答案 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 设法解决了我面临的问题。我提到了一些可能遇到与时区有关的问题的人的调查结果。
调查结果:
database
中保存的日期(最初在任何时区)将保存在'GMT/UTC'
时区。
直接在数据库local timezone
中看到的日期是因为third party tool
用于查看数据库中的数据。
当日期从database
中取出时,它也在'GMT/UTC'
时区。
要查看specific timezone
中的日期,NSDateFormatter
将与指定的特定时区一起使用。
最重要的是NSDate
对象始终与timezone
无关,始终位于'GMT/UTC'