在PHP中毫秒比较

Sco*_*opi 6 php time date

$date1 = "2017-04-13 09:09:80:300" 
$date2 = "2017-04-13 09:09:80:400"
Run Code Online (Sandbox Code Playgroud)

如何检查是否date2大于或等于100毫秒$date 1,如果不是,则检查是否为假(101 - 更多或更少)

Tim*_*sen 5

您的问题虽然看似简单,但实际上相当丑陋,因为PHP的strtotime()函数会从时间戳截断毫秒数。实际上,它甚至无法正确处理时间戳$date1以及$date2您所遇到的时间戳。一种解决方法是修剪时间戳的毫秒部分,使用strtotime()以获取自该纪元以来的毫秒数,然后使用正则表达式获取并添加毫秒部分。

$date1 = "2017-04-13 09:09:40:300";
$date2 = "2017-04-13 09:09:40:400";

preg_match('/^.+:(\d+)$/i', $date1, $matches);
$millis1 = $matches[1];
$ts1 = strtotime(substr($date1, 0, 18))*1000 + $millis1;
preg_match('/^.+:(\d+)$/i', $date2, $matches);
$millis2 = $matches[1];
$ts2 = strtotime(substr($date2, 0, 18))*1000 + $millis2;

if (abs($ts1 - $ts2) < 100) {
    echo "within 100 millseconds";
}
else {
    echo "not within 100 millseconds";
}
Run Code Online (Sandbox Code Playgroud)

演示在这里:

右旋酯


Pet*_*ter 5

如果您将自己的这种格式的时间(我换09:09:8009:09:40,因为它是不正确的格式)

$date1 = "2017-04-13 09:09:40:300" 
$date2 = "2017-04-13 09:09:40:400"
Run Code Online (Sandbox Code Playgroud)

创建自定义函数,因为strtotime不支持ms

function myDateToMs($str) {
   list($ms, $date) = array_map('strrev', explode(":", strrev($str), 2));
   $ts = strtotime($date);
   if ($ts === false) {
       throw new \InvalidArgumentException("Wrong date format");
   }
   return $ts * 1000 + $ms;
}
Run Code Online (Sandbox Code Playgroud)

现在只需检查差异是否小于100

$lessOrEqual100 = abs(myDateToMs($date1) - myDateToMs($date2)) <= 100;
Run Code Online (Sandbox Code Playgroud)