来自负UNIX时间戳的PHP DateTime,以毫秒/微秒为单位

时间:2013-04-24 15:46:54

标签: php datetime timestamp

我想从负UNIX时间戳(1970年之前)创建PHP \ DateTime对象,只有几秒没有太多脏代码。

new \DateTime("@-100")有效,但new \DateTime("@-100.123")没有。

\DateTime::createFromFormat("U u", "100 123456")有效,但\DateTime::createFromFormat("U u", "-100 123456")没有。

并且\ DateInterval当前没有微秒。

到目前为止我发现创建这样的DateTime的唯一方法是解析像new \DateTime("1969-12-31T23:59:59.877GMT")这样的字符串,但我不喜欢number-> string-> DateTime链。还有更明确​​的方法吗?

1 个答案:

答案 0 :(得分:0)

适用于x64的代码,用于转换为微秒,但我不喜欢它。

$ts_mks = -100000012345;

$div = floor($ts_mks / 1000000);
$mod = $ts_mks % 1000000;
if($mod < 0) {
    $mod += 1000000;
}

$date_s = new \DateTime();
$date_s->setTimestamp($div);
$date_s->setTimezone(new \DateTimeZone("GMT"));
$ts_str = $date_s->format("Y-m-d\\TH:i:s.") . sprintf("%06dZ", $mod);

// result
$date = \DateTime::createFromFormat("Y-m-d\\TH:i:s.ue", $ts_str);

Mush更短但更神秘(结合整数阴性secons与正分数部分):

$date = new \DateTime(sprintf("@%d 00:00:00.%06d", $div, $mod));

转换回来

$ts_mks = $date->getTimestamp() * 1000000 + (int) $date->format("u");