【问题标题】:16-digit timestamp with PHPs date() function带有 PHP 日期()函数的 16 位时间戳
【发布时间】:2011-01-15 09:31:11
【问题描述】:

如何在 PHP 的 date() 函数中使用以下 16 位时间戳(来自 XML 文件)?

1295076698126000  // 15-01-2011 08:31:38.126
1286697695521000  // 10-10-2010 10:01:35.521

【问题讨论】:

    标签: php xml timestamp


    【解决方案1】:

    这些时间戳以微秒为单位。但是,由于 PHP 在date() 中使用整数作为时间戳(以秒为单位),因此您将无法获得微秒值。您仍然可以通过将时间戳除以一百万(100 万微秒 = 1 秒)并将商传递给date() 来打印剩余的日期:

    // "u" will always be printed as 000000 regardless of actual microseconds
    echo date('d-m-Y H:i:s.u', 1295076698126000 / 1000000);
    

    编辑:Hacky,但您可以执行手动算术以获取毫秒并将其作为解决方法单独输出,如下所示:

    $xml_timestamp = 1295076698126000;
    $seconds = $xml_timestamp / 1000000;
    $microseconds = $seconds - floor($seconds);
    $seconds = floor($seconds);
    
    // 1 millisecond = 1000 microseconds
    // Milliseconds, because your desired output is 3 decimal places long, not 6
    $milliseconds = round($microseconds * 1000);
    
    $format = 'd-m-Y H:i:s.' . sprintf('%03d', $milliseconds);
    echo date($format, $seconds);
    

    为了可重用性,DateTime 类是一个不错的选择。或者,自定义函数:

    function date_milliseconds($format, $timestamp = NULL) {
        $seconds = ($timestamp === NULL) ? microtime(true) : $timestamp / 1000000;
        $microseconds = $seconds - floor($seconds);
        $seconds = floor($seconds);
        $milliseconds = round($microseconds * 1000);
    
        $format = preg_replace('/(?<!\\\\)u/', sprintf('%03d', $milliseconds), $format);
        return date($format, $seconds);
    }
    
    echo date_milliseconds('d-m-T H:i:s.u', floatval($xml_timestamp));
    

    【讨论】:

    • 请注意,您可以DateTime 对象中使用“u”,根据 Edward Rudd 在 date() 手册页上的评论:uk3.php.net/manual/en/function.date.php#93891 但这不是t 实际上非常有用,因为我看不到设置微秒时间戳的简单方法(setTimestamp() 似乎将输入转换为 int)。
    • 你能让代码动态吗? echo $timestamp*1 总是给出相同的数字 (2147483647),请参阅:stackoverflow.com/questions/573692/…
    • @Kristoffer:你使用的是什么版本的 PHP?当 $timestamp 超过 32 位有符号整数限制时,PHP 会将 $timestamp 变为浮点数。
    • 当前版本 v5.3.5 - 使用 SimpleXML 解析 XML。
    • 如果您var_dump() 使用 SimpleXML 获得时间戳后立即得到它们,您会得到什么?
    猜你喜欢
    • 2017-06-08
    • 1970-01-01
    • 2017-12-19
    • 1970-01-01
    • 2021-07-13
    • 2010-10-16
    • 1970-01-01
    • 2013-06-16
    • 2011-08-07
    相关资源
    最近更新 更多