【问题标题】:How to convert UNIX time before 1970 to date format in MySQL?如何将 1970 年之前的 UNIX 时间转换为 MySQL 中的日期格式?
【发布时间】:2011-11-02 12:27:50
【问题描述】:

我有一个使用 unix 时间作为日期的数据库(我使用的是 mySQL)。我想以每日日期格式检索日期。这是我的查询:

SELECT FROM_UNIXTIME(time_created) FROM member

这适用于 1970 年之后的日期(例如,1314162229),但不适用于 1970 年之前的日期(例如,-769338000)。这里有什么工作吗?

【问题讨论】:

    标签: mysql unix-timestamp


    【解决方案1】:

    一种可能的解决方法是在一定年数(最好是 4 的倍数)中设置一个与秒数相对应的常数。您可以添加这个常数,转换时间,然后减去选择的年数。

    示例:选择 40 年。

    确定常数:

    MySQL [files]> select adddate(from_unixtime(0), interval 40 year);
    +---------------------------------------------+
    | adddate(from_unixtime(0), interval 40 year) |
    +---------------------------------------------+
    | 2010-01-01 01:00:00                         |
    +---------------------------------------------+
    1 row in set (0.09 sec)
    
    MySQL [files]> select unix_timestamp(adddate(from_unixtime(0), interval 40 year));
    +-------------------------------------------------------------+
    | unix_timestamp(adddate(from_unixtime(0), interval 40 year)) |
    +-------------------------------------------------------------+
    |                                                  1262304000 |
    +-------------------------------------------------------------+
    1 row in set (0.09 sec)
    

    现在您可以使用 1930 到 20xx 之间的每个 unix 时间戳 x 并使用它。

    select subdate(from_unixtime(x+1262304000), interval 40 year);
    

    用你的例子-769338000,你得到

    MySQL [files]> select subdate(from_unixtime(-769338000+1262304000), interval 40 year);
    +-----------------------------------------------------------------+
    | subdate(from_unixtime(-769338000+1262304000), interval 40 year) |
    +-----------------------------------------------------------------+
    | 1945-08-15 17:00:00                                             |
    +-----------------------------------------------------------------+
    1 row in set (0.09 sec)
    

    【讨论】:

    • 确实如此,但 1998 年之后的日期返回 NULL
    • @trf 好吧,这些日期可以在没有这种解决方法的情况下使用。关键是使用负 UNIX 时间戳。您获得 NULL 的原因是 2038 年的“UNIX 时间 oerflow 日期”被拉到 40 年前,即 1998 年。
    【解决方案2】:

    我找到了一种新方法:

    转换为 MySQL 日期:

    SELECT DATE_ADD(FROM_UNIXTIME(0), interval YOURTIMESTAMPHERE second);
    

    将您的纪元转换为日期字符串:

    SELECT DATE_FORMAT(DATE_ADD(FROM_UNIXTIME(0), interval YOURTIMESTAMPHERE second), '%Y-%m-%d');
    

    回来

    SELECT TIMESTAMPDIFF(second,FROM_UNIXTIME(0),'1960-01-01 00:00:00' );
    

    来源: http://www.epochconverter.com/programming/mysql-from-unixtime.php#negavtiveEpoch

    【讨论】:

    • 这是对我有用的一个,特别是列出的第二个。并不是说接受的答案不是正确的答案,但我喜欢这只是正确地显示日期,不需要常数的计算。
    【解决方案3】:
    SELECT DATE_ADD(CAST('1970-01-01 00:00:00' AS DATETIME), INTERVAL `time_created` SECOND) FROM `member`
    

    【讨论】:

      【解决方案4】:

      据我所知,在 1970 年 1 月 1 日 00:00 UTC 之前没有 UNIX 时间。更多信息请访问Wikipedia

      【讨论】:

      • 如果我要存储早于 1970 年的日期(如生日),这是否意味着我不应该使用 UNIX 时间?
      • 当然有。来自您自己的链接:This can be extended backwards from the epoch too, using negative numbers; thus 1957-10-04T00:00:00Z, 4 472 days before the epoch, is represented by the Unix time number −4 472 × 86 400 = -386 380 800.
      • @cularis:我错过了那部分,坦率地说,我从未见过这样使用它。我个人唯一需要对历史日期做任何事情的时候,我的东西可以追溯到 1200 年代,所以 UNIX 时间从未出现过。我注意到我链接到的同级文章说"Some systems correctly handle negative time values, while others do not."。我想这就是我的想法。
      • 那篇文章还说您不能依赖time_t 进行签名。以真正的维基百科方式,它是不完整的,没有提到最好的理由,恕我直言,time_t 被签名:它允许时间算术正常工作。也就是说,time_t(-1) 并不总是意味着“纪元前一秒”。如果第二个减数是后面的值,它也可以是减去两个相差一秒的time_ts 的结果。如果您随后将该增量添加到另一个 time_t,它会减去 1 秒,正如您可能预期的那样。但同样,您不能依赖这种行为。
      • @glglgl 我知道,我在那儿!尽管我在 74 年夏天在老化的霍尼韦尔系统上用 COBOL 编程总共花了 4 周时间,但我仍然记得遇到 2 位数的年份表示并想,“他们将不得不处理一些天……”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-17
      • 2017-04-28
      • 1970-01-01
      • 2020-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多