5

场景:一条记录​​被输入到数据库中。

我试图找出以下等式:

  1. 如何获取自添加记录以来的小时数。
  2. 如何获取自添加记录以来距离午夜还有多少小时。

鉴于这些时间:

  • 日期/时间:2012-08-22 20:11:20
  • 时间戳:1345684280
  • 今晚午夜:2012-08-23 00:00:00
  • 午夜时间戳:1345698000

我觉得我在正确的轨道上。只需要一些适当的数学来进行计算吗?我的数学很糟糕。任何帮助或指导将不胜感激。我不是在找人来帮我完成这个。只是寻找关于我做错了什么的建议,或者我如何能做得更好。也许解释实现我的目标所必需的数学公式。

这是我到目前为止所拥有的:

class tools{

    public function __construct(){
    }

    public function check_time($time, $request){
        $time = strtotime($time);
        if($request == 'since'){
            $theTime = time() - $time;
            $prefix = 'Since:';
        } elseif($request == 'until'){
            $midnight = mktime(0, 0, 0, date('n'), date('j'), date('Y'));
            $theTime = $midnight - $time;
            $prefix = 'Until:'; 
        }

        $tokens = array (
            31536000 => 'year',
            2592000 => 'month',
            604800 => 'week',
            86400 => 'day',
            3600 => 'hour',
            60 => 'minute',
            1 => 'second'
        );

        foreach($tokens as $unit => $text){
            if($theTime < $unit) continue;
            $duration = floor($theTime / $unit);
            return $prefix.' '.$duration.' '.$text.(($duration>1)?'s':'');
        }
    }
}// EoF tools class

$tools = new tools();

print_r($tools->check_time('2012-08-22 20:11:20', 'since'));
print_r($tools->check_time('2012-08-22 20:11:20', 'until'));
4

5 回答 5

10

这里的解决方案非常简单。有一个小错误会导致您的所有问题。

在您的代码中,您可以使用它来计算午夜。

$midnight = mktime(0, 0, 0, date('n'), date('j'), date('Y'));

这是不正确的,因为它使用的是今天的午夜(这本来是今天的 00:00,但从现在开始的几个小时前。你想要明天的午夜,因为它被认为是 24 小时时间的 00:00 并且是明天。正确方法是这样的:

$midnight = strtotime("tomorrow 00:00:00");

请记住,strtotime() 的所有内容都基于 GMT,因此请确保在文件/应用程序中设置默认时区。

我希望我的回答很清楚,并解释了为什么您发布的代码是错误的以及如何修复它。

于 2012-08-24T00:47:52.630 回答
3

也许是这样的?我不得不承认没有完全理解你想要的输出是什么:

$d1 = new DateTime('2012-08-22 20:11:20');                                                                                          
$d2 = new DateTime('2012-08-23 00:00:00');

$interval = $d1->diff($d2);

echo $interval->format('%h hours %i minutes and %s seconds');
于 2012-08-23T16:01:18.097 回答
1

好,易于:

$timeLeft = 86400 - (time() - strtotime("today"));
echo date("H:i:s", $timeLeft);

86400是一天的初始时间。
time()是当前时间。
strtotime("today")是这一天的开始时间。

date("H:i:s", $timeLeft)用于以小时、分钟和秒为单位的格式。

更短的方式:

date("H:i:s", strtotime("tomorrow") - time())
于 2018-10-16T13:01:59.780 回答
0

午夜不超过第二天没有指定时间最好的方法必须是:

<?php
$datetime1 = new DateTime(date('Y-m-d H:i:s'));//current datetime object
$datetime2 = new DateTime(date('Y-m-').date(d));//next day at midnight
$interval = $datetime1->diff($datetime2);//diference
echo $interval->format('H');printing only hours (same as date format)
?>

如果您想了解更多信息:php date_diff

于 2012-08-23T16:07:42.680 回答
-1

你可以试试这个:

$now = strtotime('2012-08-22 20:11:20');
$midnight = strtotime('2012-08-23 00:00:00');
$difference = $midnight - $now;

echo date("H:i:s", $difference);
于 2012-08-23T15:58:17.613 回答