SQLite unix epoch转换

时间:2015-03-08 18:05:38

标签: sqlite

我的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时代,而日期时间不是这样的吗?

在日期时间内取回正确日期的建议是什么?我真的需要在几毫秒内存储东西而不是其他时间。

1 个答案:

答案 0 :(得分:3)

结果是正确的,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,因为时区使一切变得复杂,所以我想在格式化阶段尽可能晚地添加它。