如何使用PHP获取午夜时间直到午夜

Mic*_*und 4 php math datetime timestamp equation

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

我想弄清楚以下等式:

  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'));
Run Code Online (Sandbox Code Playgroud)

小智 10

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

在您的代码中,您可以计算午夜.

$midnight = mktime(0, 0, 0, date('n'), date('j'), date('Y'));
Run Code Online (Sandbox Code Playgroud)

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

$midnight = strtotime("tomorrow 00:00:00");
Run Code Online (Sandbox Code Playgroud)

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

我希望我的回答很清楚,并解释为什么你发布的代码是错误的以及如何解决它.

  • 或者只是strtotime('明天')每http://www.php.net/manual/en/datetime.formats.relative.php (3认同)