首页 > 解决方案 > 在 PHP 中使用 DateTime 解析毫秒时间戳

问题描述

我想从毫秒时间戳创建一个 DateTime 对象,但这似乎不起作用:

$timestamp_in_ms = 1546300800000; // int or string no difference
var_dump(DateTime::createFromFormat("Uv", $timestamp_in_ms));
var_dump(DateTime::getLastErrors());

这导致:

bool(false)
array(4) {
  ["warning_count"]=>
  int(0)
  ["warnings"]=>
  array(0) {
  }
  ["error_count"]=>
  int(1)
  ["errors"]=>
  array(1) {
    [13]=>
    string(12) "Data missing"
  }
}

但是,如果我使用稍微不同的符号,它确实有效:

$timestamp_in_ms = "1546300800.000";
var_dump(DateTime::createFromFormat("U\.v", $timestamp_in_ms));
var_dump(DateTime::getLastErrors());
object(DateTime)#1 (3) {
  ["date"]=>
  string(26) "2019-01-01 00:00:00.000000"
  ["timezone_type"]=>
  int(1)
  ["timezone"]=>
  string(6) "+00:00"
}

是的,我可以这样做:

$timestamp_with_dot = $timestamp_in_ms / 1000 + "." + $timestamp_in_ms % 1000;

文档没有提供任何见解。U和均受v支持。

关于这个问题的任何更多信息?我正在运行 PHP 7.4.10

标签: phpdatetime

解决方案


除以 1000 后,您可以将毫秒时间戳转换为以秒为单位的浮点数。

$msTimeStamp = 1600790571478;
$floatSec = $msTimeStamp/1000.0;

使用 DateTime::createFromFormat 时,也可以使用“Uu”格式。“u”格式应该正好是 6 个字符。这可以通过 sprintf() 来完成。

$dateTime = DateTime::createFromFormat("U\.u", sprintf('%1.6F',$floatSec));

//test
echo $dateTime->format('Y-m-d H:i:s.u');
//2020-09-22 16:02:51.478000 
//Timezone "+00:00" (UTC)

毫秒时间戳也可以是浮点数,也可以包含微秒。上面的代码也适用于 32 位系统。


推荐阅读