2013-09-30 41 views
1

我有两个ASCII日期时间标记。最终,我想要以秒和毫秒为单位获得差异。我试过使用DateTime类以及Date()函数。这两个似乎都会缩短微秒,尽管日期格式的文档说该类保留了它。PHP使用微秒将ASCII日期/时间标记转换为Unix时间

这里是我到目前为止有:

<?php 
// test.datetimediff.php 

echo "<pre>\n"; 

$tz = new DateTimeZone('America/Toronto'); 
echo print_r($tz, true) . "<br>\n"; 

/* 
$dt1 = date('Y-m-d H:i:s.u', '2013-09-30 13:06:56.944'); 
$dt2 = date('Y-m-d H:i:s.u', '2013-09-30 13:06:56.979'); 
*/ 

$dt1 = new Datetime('2013-09-30 13:06:56.944', $tz); 
$dt2 = new Datetime('2013-09-30 13:06:56.979', $tz); 

echo print_r($dt1, true) . "<br>\n"; 
echo print_r($dt2, true) . "<br>\n"; 

$interval = $dt1->diff($dt2); 

$seconds = $interval->format('%s'); 

echo 'seconds: ' . $seconds . "<br>\n"; 

echo "</pre>\n" . "<br>\n"; 
+0

ASCII是一个字符编码方案,不知道什么是“ASCII日期”是 – 2013-09-30 19:28:04

+2

相当肯定的DateTime不占几分之一秒。 – Sammitch

+1

@Sammitch是对的 - https://bugs.php.net/bug.php?id=52519 –

回答

0

这是一种可能的解决方法。不是最漂亮的,但它的工作:

<?php 
// test.datetimediff.php 

echo "<pre>\n"; 

$tz = new DateTimeZone('America/Toronto'); 
echo print_r($tz, true) . "<br>\n"; 

/* 
$dt1 = date('Y-m-d H:i:s.u', '2013-09-30 13:06:56.944'); 
$dt2 = date('Y-m-d H:i:s.u', '2013-09-30 13:06:56.979'); 
*/ 

$dt1 = new Datetime('2013-09-30 13:06:56.944', $tz); 
$dt2 = new Datetime('2013-09-30 13:06:56.979', $tz); 

echo print_r($dt1, true) . "<br>\n"; 
echo print_r($dt2, true) . "<br>\n"; 

$interval = $dt1->diff($dt2); 

$seconds = (int) $interval->format('%s'); 

// Get microseconds from both start and end date 
$us1 = $dt1->format('u'); 
$us2 = $dt2->format('u'); 

// Compute the microsecond difference and add it to the seconds 
$seconds += abs($us2 - $us1)/1000000; 

echo 'seconds: ' . $seconds . "<br>\n"; 

echo "</pre>\n" . "<br>\n"; 
+0

您如何从ISO 8601日期到$ interval? – NotoriousWebmaster

+0

@NotoriousWebmaster答案中的代码意味着可以将代码集成到代码中以添加微秒。我已经更新了答案,所以你可以看到它会发生什么 – Bogdan

1

找不到这将需要microtime中考虑的功能。所以我把它转换成了整数秒,并且自己在毫秒级上。以下是我设置的功能:

/* 
expects $datetime in format yyyy-mm-ddThh:mm:ss.9999 
*/ 
function strtomtime($datetime) { 

    $dt1 = strtotime($datetime); 
    $pos = strrpos($datetime, '.'); 
    $mtime = $dt1 + floatval(substr($datetime, $pos)); 
    return $mtime; 
} 
相关问题