【问题标题】:Convert MySQL time with milliseconds to javascript timestamp with PHP使用 PHP 将 MySQL 时间(毫秒)转换为 javascript 时间戳
【发布时间】:2016-08-03 09:52:57
【问题描述】:

我有来自 mysql 的时间戳,例如:“2016-08-03 11:11:41.04000”。 此时间戳是 CONCAT('date', ' ', 'time') 选择的结果。

我需要将 PHP 的时间戳转换为仅数字的时间戳,以便我可以在 javascript 中使用保留毫秒精度的时间戳。

关于这个主题的其他问题只涉及没有 MySQL 毫秒片段的日期,或者只是建议 strtotime(''datestring) * 1000,这会失去毫秒精度。

需要保留毫秒精度,以便在 javascript 中使用。

【问题讨论】:

    标签: javascript php mysql timestamp milliseconds


    【解决方案1】:

    您可以使用DateTime 对象。构造函数几乎可以使用任何日期/时间格式。

    $datetime = new DateTime('2016-08-03 11:11:41.04000');
    echo $datetime->getTimestamp();
    // output: 1470215501
    

    正如下面评论中所述,使用getTimestamp 将丢失毫秒部分,因为 UNIX 时间戳基于秒并且不能存储秒的小数部分。如果需要,您可以考虑自己的时间戳语法。例如,输出日期和时间,每个数字之间没有任何分隔符:

    $datetime = new DateTime('2016-08-03 11:11:41.04000');
    echo $datetime->format('YmdHisu');
    // output: 20160803111141040000
    

    另一方面,JavaScript 能够直接解析包含毫秒的日期时间字符串。所以你也可以直接把输入传给JS,不用PHP转换。

    var datetime = new Date('2016-08-03 11:11:41.04000');
    console.log(datetime.toJSON());
    

    【讨论】:

    • 这会丢失毫秒精度。
    【解决方案2】:

    我建议如下:

    在您的 JS 中使用它时,在 PHP 中打印您的连接字符串。 您可以使用 JS Date 对象来设置正确的时间保留毫秒。这是对 Date 对象的引用: http://www.w3schools.com/jsref/jsref_obj_date.asp

    总之

    var d = new Date(year, month, day, hours, minutes, seconds, milliseconds);
    

    让 PHP 在你的 JS 中填写这些参数(年、月、毫秒等)

    【讨论】:

      【解决方案3】:

      使用这个简单的 PHP 代码将 PHP 格式的毫秒日期转换为 JS 时间戳格式,并保持毫秒。

      2016-08-03 11:11:41.040 转换为1470206501040

      <?php
      date_default_timezone_set('UTC');
      $date = '2016-08-03 11:11:41.040';
      $date = DateTime::createFromFormat('Y-m-d H:i:s.u', $date);
      $ts_micro = (float) ($date->getTimestamp() . '.' . $date->format('u'));
      $ts_mili = (float) ($ts_micro * 1000);
      echo round($ts_mili); //result: 1470206501040
      

      为了测试,你可以用JS将1470206501040反向转换为2016-08-03T11:11:41.040Z时间:

      var d = new Date(1470222701040);
      var n = d.toISOString();
      document.write(n); //result: 2016-08-03T11:11:41.040Z

      【讨论】:

        【解决方案4】:

        我已经使用了@feeela 和@sietse85 的建议。

        在 PHP 中:

        $datetime  = new \DateTime('2016-08-03 11:11:41.04000');
        $timestamp = $datetime->format('YmdHisu'); // 2016080311114104000
        

        在 javascript 中:

        /**
         * 2016080311114104000
         * @param string yyyymmddhhiissuuuuuu
         */
        function dateFromCustomTimestamp(date) {
            date = date.toString();
            return new Date(
                date.substring(0,4),
                date.substring(4,6),
                date.substring(6,8),
                date.substring(8,10),
                date.substring(10,12),
                date.substring(12,14),
                date.substring(14,20)/100
            );
        }
        

        不是很好,但是如果解决了将时间戳的数字表示转换为从 mysql => php => javascript 保留的毫秒数的问题。

        【讨论】:

        • 很高兴你解决了这个问题,解决方案可能不是最厚颜无耻的,但现在它可以工作了,你也可以尝试改进代码:)
        • 嗯,该方法可读性强且不言自明,目前我没有看到任何改进...
        猜你喜欢
        • 2016-03-04
        • 2016-03-04
        • 2013-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-29
        相关资源
        最近更新 更多