PHP-从日期时间开始的时间跨度

PHP-从日期时间开始的时间跨度,php,Php,我有一个日期,格式为“14/11/2012 4:26:10 PM”,来自mysql查询 我对PHP不是很有经验,但如何计算“当时”和“现在”之间的简单时间跨度 并将其格式化为人类可读的字符串?例如“1小时,5分钟前” 我试图寻找一个解决方案,我发现了一个我认为有效的解决方案,但它不能解释上午/下午,所以当我将其转换为时间戳时,它最终导致了一个问题。有人知道吗 这是我正在尝试做的,但效果不太好: $time = $row["NotificationSent"];

我有一个日期,格式为“14/11/2012 4:26:10 PM”,来自mysql查询

我对PHP不是很有经验,但如何计算“当时”和“现在”之间的简单时间跨度

并将其格式化为人类可读的字符串?例如“1小时,5分钟前”

我试图寻找一个解决方案,我发现了一个我认为有效的解决方案,但它不能解释上午/下午,所以当我将其转换为时间戳时,它最终导致了一个问题。有人知道吗

这是我正在尝试做的,但效果不太好:

$time = $row["NotificationSent"];           
            list($day, $month, $year, $hour, $minute) = split('[/ :]', $time); 
            $timestamp = mktime($hour, $minute,0, $month, $day, $year);         
            $j = TimeSince($timestamp);
我在google上找到的timesince函数是:

    function TimeSince($original) // $original should be the original date and time in Unix format
    {
        // Common time periods as an array of arrays
        $periods = array(
            array(60 * 60 * 24 * 365 , 'year'),
            array(60 * 60 * 24 * 30 , 'month'),
            array(60 * 60 * 24 * 7, 'week'),
            array(60 * 60 * 24 , 'day'),
            array(60 * 60 , 'hour'),
            array(60 , 'minute'),
            );

        $today = time();
        $since = $today - $original; // Find the difference of time between now and the past

        // Loop around the periods, starting with the biggest
        for ($i = 0, $j = count($periods); $i < $j; $i++)
        {
            $seconds = $periods[$i][0];
            $name = $periods[$i][1];

            // Find the biggest whole period
            if (($count = floor($since / $seconds)) != 0)
            {
                break;
            }
        }

        $output = ($count == 1) ? '1 '.$name : "$count {$name}s";

        if ($i + 1 < $j)
        {
            // Retrieving the second relevant period
            $seconds2 = $periods[$i + 1][0];
            $name2 = $periods[$i + 1][1];

            // Only show it if it's greater than 0
            if (($count2 = floor(($since - ($seconds * $count)) / $seconds2)) != 0)
            {
                $output .= ($count2 == 1) ? ', 1 '.$name2 : ", $count2 {$name2}s";
            }
        }
        return $output;
    }
function TimeSince($original)/$original应该是Unix格式的原始日期和时间
{
//作为数组数组的公共时段
$periods=数组(
阵列(60*60*24*365,'年'),
数组(60*60*24*30,'月'),
数组(60*60*24*7,'周'),
数组(60*60*24,'天'),
数组(60*60,'小时'),
数组(60,'分钟'),
);
$today=时间();
$since=$today-$original;//查找现在和过去的时间差
//循环周期,从最大周期开始
对于($i=0,$j=count($periods);$i<$j;$i++)
{
$seconds=$periods[$i][0];
$name=$periods[$i][1];
//找出最大的整个周期
如果(($count=floor($since/$seconds))!=0)
{
打破
}
}
$output=($count==1)?'1'。$name:“$count{$name}s”;
如果($i+1<$j)
{
//检索第二个相关期间
$seconds2=$periods[$i+1][0];
$name2=$periods[$i+1][1];
//仅当大于0时才显示
如果($count2=楼层($begin-($seconds*$count))/$seconds2))!=0)
{
$output.=($count2==1)?',1'.$name2:“,$count2{$name2}s”;
}
}
返回$output;
}
返回的结果已格式化为我要查找的内容,但给出的数字不正确。 “2012年11月19日下午2:48:53”返回“1天5小时”,但应该是“17小时32分钟”


感谢您的帮助

如果您有人类可读的时间戳,可以使用
strotime()
将其转换为unix时间戳:


然后只需从该值中减去
time()
,即可获得过去的时间(以秒为单位)。

如果您有一个人类可读的时间戳,您可以使用
strotime()
将其转换为unix时间戳:


然后只需从该值中减去
time()
,即可得到过去的时间(以秒为单位)。

请参见,这就是
DateTime
对象的解救位置:

<?php

$time = DateTime::createFromFormat("d/m/Y g:i:s A", "14/11/2012 4:26:10 PM");;
$now = new DateTime;

$diff = $time->diff($now);
var_dump($diff);

请参见,
DateTime
对象就是在这里救援的:

<?php

$time = DateTime::createFromFormat("d/m/Y g:i:s A", "14/11/2012 4:26:10 PM");;
$now = new DateTime;

$diff = $time->diff($now);
var_dump($diff);

可能重复的
mktime
需要24小时格式,当您拆分文本时,您忽略了
PM
,因此50%的情况下需要12小时的差异。您可以共享sql查询吗?我想知道您实际上是如何将时间戳存储在db$time=$row[“NotificationSent”];它以“文本”的形式存储在数据库中,
mktime
可能以24小时格式重复,当您拆分文本时,您忽略了
PM
,因此50%的情况下会出现12小时的差异。您可以共享sql查询吗?我想知道您实际上是如何将时间戳存储在db$time=$row[“NotificationSent”];它作为“文本”存储在数据库中,为什么不更现代一点,改用
DateTime::createFromFormat
?为什么不更现代一点,改用
DateTime::createFromFormat
?需要注意的是,如果您没有设置时区
date\u default\u timezone\u set()
(或其他等效设置),那么您将收到一个致命错误。嗯,不是真的:P只需使用
$now=new DateTime('',new DateTimeZone('Berlin/Europe')相反,您将不会有任何致命错误。应该注意的是,如果您没有设置时区
date\u default\u timezone\u set()
(或其他类似设置),您将收到致命错误。嗯,不是真的:P只需使用
$now=new DateTime('',new DateTimeZone('Berlin/Europe'),您将不会有任何致命错误