【问题标题】:Convert unix timestamp to datetime with milliseconds in MySQL在 MySQL 中将 unix 时间戳转换为以毫秒为单位的日期时间
【发布时间】:2020-06-24 23:44:25
【问题描述】:

问题

将 unix 时间戳转换为日期时间,同时保留毫秒。

背景

我收到以下格式的 unix 时间戳:

  • 1584049707

然后我尝试使用TO_TIMESTAMP() 通过 PHP 将其发送到 MySQL 中的 datetime(3) 列。我也尝试过FROM_UNIXTIME(),但结果相同。

SQL

$sql = "
  INSERT INTO assoc_table (timestart, timeend) 
  VALUES (TO_TIMESTAMP(:timestart), TO_TIMESTAMP(:timeend))
";

结果

  • 2020-03-12 22:42:23.000

由于某种原因,它没有记录毫秒数。

期望的结果

  • 从 unix 时间戳中获取毫秒数并进入 datetime 列。

【问题讨论】:

  • 但是您的纪元时间戳首先没有毫秒部分。
  • 我正在使用 Math.round((new Date()).getTime() / 1000);从 JS 获取 unix 时间戳。会不会这么简单我需要去掉/1000?
  • TO_TIMESTAMP() 来自哪里?我在任何 MySQL 文档中都没有看到这一点?
  • 另外,如果您的列是DATETIME 类型,它需要YYYY-MM-DD hh:mm:ss[.fraction] 格式的值
  • 为什么它会注册任何毫秒? 1584049707 不包含毫秒。

标签: php mysql sql date datetime


【解决方案1】:

Epoch 时间戳表示自 1970 年 1 月 1 日以来经过的 数;如果你想要小数秒,它需要有一个小数部分......这不是你给 MySQL 的输入的情况;然后,这会反映在您获得的结果中。

给定一个带有小数部分的纪元时间戳,from_unixtime() 按预期工作:

select from_unixtime(1584049707.123)

返回:

2020-03-12 21:48:27.123

注意:datetime(3) 是存储此类值的相关格式。

【讨论】:

  • 我需要用 JavaScript 写什么才能得到“1584049707.123”?似乎问题就在那里。我试过 now() 和 getTime(),但都没有返回小数部分。
  • @kexxcream 删除Math.round(),例如(Date.now() / 1000).toFixed(3)
  • @Phil 这似乎运作良好,但当我申请 FROM_UNIXTIME(:timestart) 它添加三个零。我得到的结果是:2020-03-12 23:30:45.182000。输出应该是2020-03-12 23:30:45.182。如何删除最后三个零?
【解决方案2】:

使用 php 创建一个日期时间对象并使用 epoch 然后格式化它应该可以工作:

$epoch = 1584049707;
$dt = new DateTime("@$epoch");
echo $dt->format('Y-m-d H:i:s.u');

如果您需要在 MySQL 上进行转换,请查看此文档: https://www.epochconverter.com/programming/mysql

应该看起来像:

DATE_ADD(FROM_UNIXTIME(0), interval -315619200 second),'%Y-%m-%d-%f');

-315619200 是你的时代

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 2016-04-25
    • 2016-04-22
    • 2020-06-04
    • 2016-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多