如何使用PHP获得午夜的小时数

时间:2012-08-23 15:51:50

标签: php math datetime timestamp equation

场景:已将记录输入数据库。

我想弄清楚以下等式:

  1. 如何获取自添加记录以来的小时数。
  2. 如何记录自记录以来的午夜时间 添加了。
  3. 考虑到这些时间:

    • 日期/时间: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'));
    

5 个答案:

答案 0 :(得分:10)

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

在你的代码中,你可以计算午夜。

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

这是不正确的,因为它正在使用TODAY的午夜(今天是00:00,不过几个小时前,从现在开始。你想要午夜明天,因为它在24小时时被认为是00:00,明天是正确的做法就是这样:

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

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

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

答案 1 :(得分: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');

答案 2 :(得分: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())

答案 3 :(得分: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

答案 4 :(得分:-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);