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
(续)…所以是的,我认为这是解析这些部分的一个很好的开始,但需要更多的爱。谢谢你给我指出了一个好的方向:)当然!我刚刚做了另一次编辑来报道你的案子。我不确定它是否真的涵盖了所有内容,但它可能会帮助你。请让我了解最新情况:)