【问题标题】:SQLITE datetime function to display localtime doesn't work显示本地时间的 SQLITE 日期时间函数不起作用
【发布时间】:2017-09-22 09:54:42
【问题描述】:

我有一个以时间戳作为主键的 Sqlite 数据库,这个时间戳被记录为 UTC。根据我的时区和夏令时,我检查了记录是否正确。

我正在尝试在我的应用程序中显示这些时间戳,但以 Localtime 格式显示,为此我使用以下功能:SELECT ... datetetime (timestamp, 'localtime')。

但我得到的是我的本地时间加上 1 小时,我不知道为什么。 我电脑的本地时间是正确的,我使用的是 Ubuntu 12.04 作为操作系统。

提前感谢您的建议。

【问题讨论】:

  • 您使用的年份是 1970 年到 2037 年吗?
  • @Adam111p SQLite 适用于 0000 到 9999 之间的所有年份。
  • SELECT datetime('now'), datetime('now', 'localtime'); 的输出是什么?
  • localtime_r() C 函数通常只适用于 1970 年到 2037 年之间的年份。对于此范围之外的日期,SQLite 尝试将年份映射到此范围内的等效年份,进行计算,然后映射一年前。这些函数仅适用于 0000-01-01 00:00:00 和 9999-12-31 23:59:59 之间的日期(朱利丹天数 1721059.5 到 5373484.5)。对于超出该范围的日期,这些函数的结果是未定义的。
  • 您在哪个时区,以及哪些时间戳会给您带来问题?

标签: sqlite datetime utc dst localtime


【解决方案1】:

这对你有帮助吗?

注意事项和错误

当地时间的计算在很大程度上取决于政治家的一时兴起,因此很难在所有地区都正确。在这个实现中,使用标准 C 库函数 localtime_r() 来辅助计算本地时间。 localtime_r() C 函数通常只适用于 1970 年到 2037 年之间的年份。对于此范围之外的日期,SQLite 会尝试将年份映射到此范围内的等效年份,进行计算,然后将年份映射回去。

这些函数仅适用于 0000-01-01 00:00:00 和 9999-12-31 23:59:59 之间的日期(朱利丹天数 1721059.5 到 5373484.5)。对于超出该范围的日期,这些函数的结果是未定义的。

非 Vista Windows 平台仅支持一组 DST 规则。 Vista 只支持两个。因此,在这些平台上,历史 DST 计算将不正确。例如,在美国,2007 年 DST 规则发生了变化。非 Vista Windows 平台也将新的 2007 DST 规则应用于所有以前的年份。回到 1986 年,当规则也发生变化时,Vista 在将结果正确化方面做得更好。

所有内部计算均采用公历系统。还假设每天的持续时间正好是 86400 秒。

https://sqlite.org/lang_datefunc.html

【讨论】:

    【解决方案2】:

    好的,我知道了。 是的,日期是“现在”的日子(2000 年之后)。

    我认为问题在于我将数据库中的时间戳作为字符串类型,所以当我制作时:SELECT datetime(Time,'localtime')... 不能正常工作,因为它没有 tzinfo (是一个不知道的日期时间)。 所以我得到了在 SELECT 之后处理数据的正确时间(在我的情况下使用 python): 1.- 使用简单的 SELECT 查询获取数据 2.- 知道 python 中的日期时间到 UTC 时区(使用 pytz libray) 3.- 然后转换为本地时区(使用 localize 和 astimezone 模块)

    【讨论】:

      猜你喜欢
      • 2021-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-12
      • 2013-02-27
      • 2019-05-05
      • 2016-09-06
      • 2016-07-29
      相关资源
      最近更新 更多