【问题标题】:sqlite timestamp formattingsqlite 时间戳格式化
【发布时间】:2010-08-09 11:43:08
【问题描述】:

我正在尝试使用 sqlite 数据库中的日期。我将日期存储为时间戳,但是当我使用 strftime() 将它们格式化为人类可读的日期时,我得到了意想不到的结果。

考虑以下,我选择当前时间戳:

SELECT strftime("%s","now");
1281353727

然后我尝试使用我现在知道代表的时间戳来格式化日期,期望得到今天日期的人类可读格式:

SELECT strftime('%d - %m  - %Y ', 1281353727);
01 - 04  - 3503

相反,我得到了上述结果。这是正确的行为吗?我是不是做错了什么?

提前致谢,

凯文

【问题讨论】:

    标签: sql database sqlite date-formatting


    【解决方案1】:

    您需要先将时间戳转换为日期时间:

    SELECT strftime('%d - %m  - %Y ', datetime(1281353727, 'unixepoch')) FROM Visits;
    

    【讨论】:

    • 有没有办法让它以文本形式打印月份?例如:八月
    • 你好 reko,如果我从 Java dateObj.getTime() 存储这个日期,那么它是否可以与 datetime 函数中的 unixepoch 选项一起使用?
    • 在我的情况下,我需要使用 1000。
    【解决方案2】:

    这对我有用:

    datetime(visit_date/1000000,'unixepoch')
    

    【讨论】:

    • visit_date/1000000 在查看 firefox sqlite 记录时非常有用
    • 有时/1000 就足够了。 IE。在 android 应用程序的数据库中。
    【解决方案3】:

    将时间戳转换为日期时间,然后格式化:

    SELECT strftime('%d - %m  - %Y ', datetime(1281353727, 'unixepoch', 'localtime')) FROM Visits;
    

    抓到 1

    确保添加 localtime 参数。否则,您将获得居住在“格林威治”的人们所认为的日期(因为时间戳从 1970 年 1 月 1 日 00:00 UTC (=GMT) 开始计算)。

    请参阅下面的日期输出如何根据我们是否在具有 EEST 时区的工作站上使用“本地时间”而变化。

    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,格林威治标准时间仍然是昨天。

    捕捉 2

    许多程序(例如 ViberPC)也会将毫秒(甚至纳秒)添加到时间戳,在这种情况下,您需要先除以 1000(或分别除以 1000000):

    select strftime('%d - %m  - %Y ', datetime(1623707777421/1000, 'unixepoch', 'localtime'))
    

    【讨论】:

      猜你喜欢
      • 2019-02-17
      • 1970-01-01
      • 1970-01-01
      • 2011-10-03
      • 2018-06-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多