iPhone上SQLite时间戳的错误时间

Posted

技术标签:

【中文标题】iPhone上SQLite时间戳的错误时间【英文标题】:Wrong time on SQLite timestamp on the iPhone 【发布时间】:2009-06-19 15:33:40 【问题描述】:

从我的 iPhone 应用程序中,我在我的 sqlite 数据库中插入了一些数据,其中包括使用 CURRENT_TIMESTAMP 默认值的日期。一切都很好,除了时间比它应该的时间晚了 1 小时。这发生在设备和模拟器上。 我可以在某处访问任何 sqlite 设置(如当前时间)?

如果您想查看我使用的代码,可以查看我对这篇文章的回答:sqlite datetime data type with iphone NSdate?

【问题讨论】:

听起来像是夏令时问题 【参考方案1】:

听起来好像在 SQLite 和 NSDateFormatter 使用的时区之间可能存在夏令时时区不一致。它looks as though SQLite stores the datetime in GMT。因此,您需要确保 NSDateFormatter 也设置为 GMT。看来您可以这样做:

gmtFormatter.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
[gmtFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]

一旦你有了你的 NSDate 实例,我希望你可以使用一个设置了本地/系统时区的 NSDateFormatter 实例来获取它的字符串版本,以显示正确的本地时间。

注意:我还没有真正尝试过。

【讨论】:

我试试这个并没有什么不同。而且它必须是相对的,所以我不想将它设置为 GMT+1,如果有人在中国玩,我不想得到错误的时间戳...... 我并不是建议您将其设置为 GMT+1。 SQLite 中的所有时间戳似乎都固定为 GMT,因此您描述的 NSDateFormatter 也必须同步到同一时区(GMT)。从格式化程序派生的 NSDate 应该与时区无关,因此可以转换为任何其他时区 - 无论是 GMT+1 还是北京。【参考方案2】:

您可能需要考虑使用现在在 O/S 3.0 中可用的 Core Data - 它会自动为您处理此类事情,而无需您指定时区等 - 它只会使用用户的默认值并保持一切一致。

还有许多其他优点 - 但这似乎是相关的。

【讨论】:

感谢您的提示,但由于该应用程序已经制作,我不想更改它。下一篇我会记住的:)【参考方案3】:

我想你最好执行teabot 的建议。当一个时区有冬季而一个时区没有时,问题就来了......

【讨论】:

我记得当时尝试过他的建议,但没有奏效...如果人们同意teabot的方法有效,我将接受他的正确答案以帮助他人。当我有时间时,我也会尝试自己再次实现它。【参考方案4】:

我也刚要解决这个问题,茶壶的答案是正确的。 sqlite 创建的时间戳是 GMT 格式的,因此当您从数据库中读取它时,您需要告诉您的日期格式化程序也以 GMT 格式读取它。生成的 NSDate 将是您所在时区的正确日期。 你说你已经纠正它的方式,增加1小时,最终会失败。在 GMT 时区使用该应用程序的任何人都将看到 +1 小时的所有时间。其他时区的任何人都会看到完全不同的时间偏移。 (我知道这已经有好几年了,但它刚刚帮助了我)。

【讨论】:

【参考方案5】:

好吧,因为我找不到这个 1 小时的差异来自哪里,所以我使用以下方法来确定日期。这不是一个合适的解决方案,但它正是我需要的。所以万一其他人遇到和我一样的麻烦..这是我的解决办法:

NSDate *date = [[NSDate alloc] initWithTimeInterval:3600 sinceDate:[formatter dateFromString:score.datetime]];

这只是给日期时间增加一小时的延迟,因此使其正确。

【讨论】:

这不是处理此问题的正确方法,并且会在您的用户处于不同时区时给您带来问题。

以上是关于iPhone上SQLite时间戳的错误时间的主要内容,如果未能解决你的问题,请参考以下文章

来自unix时间戳的DateTime是错误的[重复]

带有时间戳的 AWS Athena SQL 查询错误

如何以自定义格式加载带有时间戳的 CSV?

带有谷歌时间戳的 Protobuf C++ 消息导致段错误 [重复]

TwinCAT3 - 使用 Matlab 从 ADS 数据流读取时时间戳的错误值

python 边缘上带有时间戳的有向图。