我正在尝试使用sqlite数据库中的日期。我将我的日期存储为时间戳,但是当我使用strftime()将它们格式化为人类可读日期时,我会得到不可预见的结果。
考虑以下情况,我选择当前时间戳:
SELECT strftime("%s","now");
1281353727
然后我尝试使用我知道代表的时间戳格式化日期,现在期望恢复今天日期的人类可读格式:
SELECT strftime('%d - %m - %Y ', 1281353727);
01 - 04 - 3503
相反,我得到了上述结果。这是正确的行为吗?我做错了什么?
提前致谢,
凯文
答案 0 :(得分:54)
您需要先将时间戳转换为日期时间:
SELECT strftime('%d - %m - %Y ', datetime(1281353727, 'unixepoch')) FROM Visits;
答案 1 :(得分:5)
这对我有用:
datetime(visit_date/1000000,'unixepoch')
答案 2 :(得分:0)
将时间戳转换为日期时间,然后对其进行格式化:
SELECT strftime('%d - %m - %Y ', datetime(1281353727, 'unixepoch', 'localtime')) FROM Visits;
确保添加 localtime
参数。否则,您将获得居住在“格林威治”的人们所感知的日期(因为时间戳从 1/1/1970 00:00 UTC (=GMT) 开始计算)。
请参阅下文,在具有 EEST 时区的工作站上,日期输出如何根据我们是否使用“localtime”而发生变化。
select strftime('%d - %m - %Y ', datetime(1623707777, 'unixepoch', 'localtime'))
<块引用>
输出:15 - 06 - 2021
select strftime('%d - %m - %Y ', datetime(1623707777, 'unixepoch'))
<块引用>
输出:14 - 06 - 2021
这是因为在 00:01 EEST,GMT 仍然是昨天。
许多程序(例如 ViberPC)也将毫秒(甚至纳秒)添加到时间戳,在这种情况下,您需要先除以 1000(或分别除以 1000000):
select strftime('%d - %m - %Y ', datetime(1623707777421/1000, 'unixepoch', 'localtime'))