2013-04-24 212 views
3

我想(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鏈。有沒有更清晰的方法?

回答

0

是在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");