毫秒比较在PHP中
$date1 = "2017-04-13 09:09:80:300"
$date2 = "2017-04-13 09:09:80:400"
我怎样才能检查date2
是多少少100毫秒然后$date 1
英寸和假如果不是(101 - 或多或少)
如果你以这种格式获得时间(我将09:09:80
更改为09:09:40
因为格式不正确)
$date1 = "2017-04-13 09:09:40:300"
$date2 = "2017-04-13 09:09:40:400"
创建自定义函数,因为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;
}
现在只需检查差异是否小于100
$lessOrEqual100 = abs(myDateToMs($date1) - myDateToMs($date2)) <= 100;
虽然看起来很简单,但您的问题实际上相当难看,因为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";
}
演示在这里:
Rextester
根据php手册的strtotime分数是允许的,虽然目前被strtotime
函数忽略。
这意味着你可以像这样表示你的日期2017-04-13 09:00:20.100
让它们可以没有错误地使用strtotime进行分析(保持它们未来不受影响),然后使用自定义函数比较日期的毫秒部分,如果时间戳是相同的
如果日期在100毫秒内,下面的函数将返回true,否则返回false。 你可以通过数量来比较它们作为参数。
<?php
date_default_timezone_set ( "UTC" );
$date1 = "2017-04-13 09:00:20.100";
$date2 = "2017-04-13 09:00:20.300";
// pass date1, date2 and the amount to compare them by
$res = compareMilliseconds($date1,$date2,100);
var_dump($res);
function compareMilliseconds($date1,$date2,$compare_amount){
if(strtotime($date1) == strtotime($date2)){
list($throw,$milliseond1) = explode('.',$date1);
list($throw,$milliseond2) = explode('.',$date2);
return ( ($milliseond2 - $milliseond1) < $compare_amount);
}
}
?>
链接地址: http://www.djcxy.com/p/86177.html