【问题标题】:SQLite unix epoch conversionSQLite unix 纪元转换
【发布时间】:2015-05-09 21:35:16
【问题描述】:

我的 SQLite 数据库中有两行,时间戳分别为 2 月 7 日星期六和 3 月 6 日星期五。

我正在运行这个查询:

select strftime('%w', datetime(CreationDate / 1000, 'unixepoch')),
       datetime(CreationDate / 1000, 'unixepoch'),
       CreationDate from mytable 

输出是:

"6" "2015-03-07 02:17:02"   "1425694622000"
"6" "2015-02-07 05:00:00"   "1423285200000"

很明显有些地方出了问题,这两个时间戳都是在星期六。我认为问题是我将时间戳除以 1000,然后再将其投射到 unix 纪元,而 datetime 不喜欢这样?

在日期时间中取回正确日期的建议是什么?我真的需要以毫秒为单位存储东西,而不是其他时间。

【问题讨论】:

  • 1425694622000 / 1000 是 2015 年 3 月 7 日UTC。也许您对时区感到困惑?我已经更新了我的答案来解决这个问题。
  • 非常感谢,就是这样!

标签: sqlite


【解决方案1】:

结果是正确的,2015 年 2 月 7 日和 2015 年 3 月 7 日都是星期六。请记住,非闰年的 2 月有 28 天,平均分为 7 天的一周,因此 3 月的日期将具有相同的一周中的日子。

$ cal 2015
                             2015

      January               February               March
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa
             1  2  3   1  2  3  4  5  6  7   1  2  3  4  5  6  7
 4  5  6  7  8  9 10   8  9 10 11 12 13 14   8  9 10 11 12 13 14
11 12 13 14 15 16 17  15 16 17 18 19 20 21  15 16 17 18 19 20 21
18 19 20 21 22 23 24  22 23 24 25 26 27 28  22 23 24 25 26 27 28
25 26 27 28 29 30 31                        29 30 31

您可能对时区感到困惑。 Unix time is the number of seconds since January 1st, 1970 UTC。默认SQLite date functions will use the UTC time zone。如果你希望你的时间在本地时区,你必须告诉 SQLite。

sqlite> select strftime('%w', datetime(1425694622000 / 1000, 'unixepoch'));
6
sqlite> select strftime('%w', datetime(1425694622000 / 1000, 'unixepoch'), "localtime");
5

可以通过 datetime 或 strftime 来完成。我选择 strftime 是因为时区会使一切变得复杂,所以我想在格式化阶段尽可能晚地添加它。

【讨论】:

  • 非常感谢 - 非常感谢您在这件事上的帮助。这正是手头的问题。
猜你喜欢
  • 2013-01-15
  • 2013-08-04
  • 2017-12-20
  • 1970-01-01
  • 1970-01-01
  • 2012-01-30
  • 2012-11-07
  • 2011-03-28
  • 2021-11-23
相关资源
最近更新 更多