Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php从日期字符串获取微时间_Php_Strtotime_Microtime - Fatal编程技术网

php从日期字符串获取微时间

php从日期字符串获取微时间,php,strtotime,microtime,Php,Strtotime,Microtime,我正在尝试获取两个日期时间字符串之间传递的时间(包括毫秒) 例如: $pageTime = strtotime("2012-04-23T16:08:14.9-05:00"); $rowTime = strtotime("2012-04-23T16:08:16.1-05:00"); $timePassed = $rowTime - $pageTime; echo $timePassed . "<br/><br/>"; $pageTime=strotime(“2012-04

我正在尝试获取两个日期时间字符串之间传递的时间(包括毫秒)

例如:

$pageTime = strtotime("2012-04-23T16:08:14.9-05:00");
$rowTime = strtotime("2012-04-23T16:08:16.1-05:00");
$timePassed = $rowTime - $pageTime;
echo $timePassed . "<br/><br/>";
$pageTime=strotime(“2012-04-23T16:08:14.9-05:00”);
$rowTime=strotime(“2012-04-23T16:08:16.1-05:00”);
$timePassed=$rowTime-$pageTime;
echo$timePassed。“

”;
我想看到的是“1.2”,但是
strotime()
忽略字符串的毫秒部分。另外,显然
microtime()
不允许您为其指定日期字符串。。。有没有其他的函数来计算这个值,或者我需要做一些字符串分析来提取秒数和毫秒数并进行减法?

试一下

这需要一点解决方法,因为
DateInterval
(由
DateTime::diff()返回)不计算微秒,所以需要手动完成

$pageTime = new DateTime("2012-04-23T16:08:14.1 - 5 hours");
$rowTime  = new DateTime("2012-04-23T16:08:16.9 - 5 hours");

// the difference through one million to get micro seconds
$uDiff = abs($pageTime->format('u')-$rowTime->format('u')) / (1000 * 1000);

$diff = $pageTime->diff($rowTime);

echo $diff->format('%s')-$uDiff;
我总是推荐
DateTime
,因为它的灵活性,你应该仔细研究一下

编辑

对于PHP 5.2的向后兼容性,它采用与毫秒相同的方法:

$pageTime = new DateTime("2012-04-23T16:08:14.1 - 5 hours");
$rowTime  = new DateTime("2012-04-23T16:08:16.9 - 5 hours");

// the difference through one million to get micro seconds
$uDiff = abs($pageTime->format('u')-$rowTime->format('u')) / (1000 * 1000);


$pageTimeSeconds = $pageTime->format('s');
$rowTimeSeconds  = $rowTime->format('s');

if ($pageTimeSeconds + $rowTimeSeconds > 60) {
  $sDiff = ($rowTimeSeconds + $pageTimeSeconds)-60;
} else {
  $sDiff = $pageTimeSeconds - $rowTimeSeconds;
}


if ($sDiff < 0) {
  echo abs($sDiff) + $uDiff;
} else {
  // for the edge(?) case if $dt2 was smaller than $dt
  echo abs($sDiff - $uDiff);
}
$pageTime=新日期时间(“2012-04-23T16:08:14.1-5小时”);
$rowTime=新的日期时间(“2012-04-23T16:08:16.9-5小时”);
//差过一百万就可以得到微秒
$uDiff=abs($pageTime->format('u')-$rowTime->format('u'))/(1000*1000);
$pageTimeSeconds=$pageTime->format('s');
$rowTimeSeconds=$rowTime->format('s');
如果($pageTimeSeconds+$rowTimeSeconds>60){
$sDiff=($rowTimeSeconds+$pageTimeSeconds)-60;
}否则{
$sDiff=$pageTimeSeconds-$rowTimeSeconds;
}
如果($sDiff<0){
回声abs($sDiff)+$uDiff;
}否则{
//对于边(?)情况,如果$dt2小于$dt
回声abs($sDiff-$uDiff);
}

基于Dan Lee的答案,这里有一个通用的解决方案:

$pageTime = new DateTime("2012-04-23T16:08:14.9-05:00");
$rowTime  = new DateTime("2012-04-23T16:08:16.1-05:00");

$uDiff = ($rowTime->format('u') - $pageTime->format('u')) / (1000 * 1000);

$timePassed = $rowTime->getTimestamp() - $pageTime->getTimestamp() + $uDiff;
完整解释:

  • 我们将两个日期之间的有符号微秒差存储在
    $uDiff
    中,并将结果以秒为单位除以1000*1000进行转换
  • $uDiff
    中的操作数顺序很重要,必须与$timePassed操作中的操作数顺序相同
  • 我们计算两个日期之间的Unix时间戳(以整秒为单位)差,并将微秒差相加以获得所需的结果
  • 即使差值大于60秒,使用也会给出正确答案

darn…这看起来很有希望,但它需要5.3+,而我使用的是5.2,我无法控制升级:(+1认为这是因为
DateTime::diff()
。这意味着您也需要手动进行减法,请参见我的编辑:)。我明白了…一般来说,这看起来有助于更轻松地提取数据(与使用正则表达式相反)但我认为你的数学/逻辑不正确。例如,如果我有
$pageTime=newdatetime(“2012-04-23T16:08:14.662-05:00”)$行时间=新日期时间(“2012-04-23T16:08:19.954-05:00”)
我应该得到
5.292
,但它正在输出
4.708
。此外,您的代码只处理秒和微秒之间的时间差。如果你从
2012-04-23T16:08:59.9-05:00开始,然后以
2012-04-23T16:09:00.1-05:00结束,你应该得到
0.2
,但是你的代码给了我
58.2
(续)…所以是的,我认为这是解析这些部分的一个很好的开始,但需要更多的爱。谢谢你给我指出了一个好的方向:)当然!我刚刚做了另一次编辑来报道你的案子。我不确定它是否真的涵盖了所有内容,但它可能会帮助你。请让我了解最新情况:)