PHP日期时间由负UNIX时间戳与微秒毫秒/微秒
问题描述:
我想(1970年以前),以创建负UNIX时间戳PHP \ DateTime对象没有太多的脏代码。PHP日期时间由负UNIX时间戳与微秒毫秒/微秒
new \DateTime("@-100")
作品,但new \DateTime("@-100.123")
没有。
\DateTime::createFromFormat("U u", "100 123456")
作品,但\DateTime::createFromFormat("U u", "-100 123456")
没有。
And \ DateInterval当前没有微秒。
我发现迄今为止创建此类DateTime的唯一方法是解析字符串,如new \DateTime("1969-12-31T23:59:59.877GMT")
,但我不喜欢number-> string-> DateTime链。有没有更清晰的方法?
答
是在x64上的转换和从微秒工作的代码,但我不喜欢它了。
$ts_mks = -100000;
$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);
玉米粥较短,但更隐蔽(结合具有正小数部分整数负secons):
$date = new \DateTime(sprintf("@%d 00:00:00.%06d", $div, $mod));
转换回
$ts_mks = $date->getTimestamp() * 1000000 + (int) $date->format("u");