SQLite unix 纪元转换

标签 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 纪元,而日期时间不喜欢这样?

如何建议在日期时间中返回正确的日期?我确实需要以毫秒为单位存储内容,而不是其他时间。

最佳答案

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

关于SQLite unix 纪元转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28929982/

相关文章:

android - 用于在 ListView 中显示 SQLite 记录的 SimpleCursorAdaptor 替代方案

android - 检查数据库值

sqlite - 查找一部电影在发行当年被租借的次数

sql - 为什么 SQLITE 在一个简单的计数查询上要花很长时间?

java - 从时间选择器获取时间值 - android

python - 从 Python 执行 sqlite3 "dot"命令或在命令行实用程序中注册排序规则

android - 通过内部联接将数据保存在内容提供者的关系表中

android - 在 Kotlin 中,Exposed 和 Anko 哪个更适合处理 SQLite?

.net - 使用 .NET 应用程序部署 SQLite 时的 list

android - SQLite 数据库不创建 android