以天为单位获取PHP日期时间差,将午夜视为一天的变化

以天为单位获取PHP日期时间差,将午夜视为一天的变化,php,date,datetime,dateinterval,Php,Date,Datetime,Dateinterval,将午夜视为一天的变化(就像DATEDIFF(day)SQL函数一样),获取两个PHPDateTimes之间天数差异的最简单方法是什么 例如,从今天的13:00到明天的12:00,我应该得到1(天),即使间隔不到24小时 $date1 = new DateTime("2013-08-07 13:00:00"); $date2 = new DateTime("2013-08-08 12:00:00"); echo $date1->diff($date2)->days; // 0 解决此

将午夜视为一天的变化(就像
DATEDIFF(day)
SQL函数一样),获取两个PHP
DateTimes
之间天数差异的最简单方法是什么

例如,从今天的13:00到明天的12:00,我应该得到1(天),即使间隔不到24小时

$date1 = new DateTime("2013-08-07 13:00:00");
$date2 = new DateTime("2013-08-08 12:00:00");
echo $date1->diff($date2)->days; // 0

解决此问题的一个简单方法是剥离时间或将其设置为
00:00:00
,这将始终为您提供所需的结果:

$date1 = new DateTime("2013-08-07");
$date2 = new DateTime("2013-08-08");
echo $date1->diff($date2)->days;


时间在这里并不重要

您可以忽略日期字符串的时间部分

$date1 = new DateTime(date('Y-m-d', strtotime("2013-08-07 13:00:00")));
$date2 = new DateTime(date('Y-m-d', strtotime("2013-08-08 12:00:00")));
echo $date1->diff($date2)->days; // 1

此示例可以帮助您:

   $date1 = date_create($d1);
$date2 = date_create($d2);
//$FromFullDateTime=$from.$FromTime;

$date1_month = date_format($date1, 'd');
$date2_month = date_format($date2, 'd');
$dif = $date2_month - $date1_month;

请注意,DateInterval->days始终为正值。因此使用->反转

/**
 * return amount of days between dt1 and dt2 
 * (how many midnights pass going from dt1 to dt2)
 *  0 = same day, 
 * -1 = dt2 is 1 day before dt1, 
 *  1 = dt2 is 1 day after  dt1, etc.
 *
 * @param \DateTime $dt1
 * @param \DateTime $dt2
 * @return int|false 
 */
function getNightsBetween(\DateTime $dt1, \DateTime $dt2){
    if(!$dt1 || !$dt2){
        return false;
    }
    $dt1->setTime(0,0,0);
    $dt2->setTime(0,0,0);
    $dti = $dt1->diff($dt2);    // DateInterval
    return $dti->days * ( $dti->invert ? -1 : 1);   // nb: ->days always positive
}
用法示例:

$dt1 = \DateTime::createFromFormat('Y-m-d', '2014-03-03' );
$dt2 = \DateTime::createFromFormat('Y-m-d', '2014-02-20' );
getNightsBetween($dt1, $dt2);       // -11

$dt1 = \DateTime::createFromFormat('Y-m-d H:i:s', '2014-01-01 23:59:59' );
$dt2 = \DateTime::createFromFormat('Y-m-d H:i:s', '2014-01-02 00:00:01' );
getNightsBetween($dt1, $dt2);       // 1 (only 2 seconds later, but still the next day)

$dt1 = \DateTime::createFromFormat('Y-m-d', '2014-04-09' );
$dt2 = new \DateTime();
getNightsBetween($dt1, $dt2);       // xx (how many days (midnights) passed since I wrote this)
一些文本魔术的例子:

function getRelativeDay(\DateTime $dt2){
    if(!$dt2){
        return false;
    }
    $n = getNightsBetween( new \DateTime(), $dt2);
    switch($n){
        case  0: return "today";
        case  1: return "tomorrow";
        case -1: return "yesterday";
        default: 
            return $n . (abs($n)>1?"days":"day") . ($n<0?" ago":" from now");
    }
}
函数getRelativeDay(\DateTime$dt2){ 如果(!$dt2){ 返回false; } $n=getNightsBetween(new\DateTime(),$dt2); 交换机(n美元){ 案例0:返回“今天”; 案例1:返回“明天”; 案例1:返回“昨天”; 违约: 返回$n.(绝对值($n)>1?“天”:“天”)($n
  • DateTime对象中的放置时间:
  • 获取适应对象的差异:

  • 为什么不抓取日期部分,没有时间,并从中得到区别?如果$DATE1月和$DATE2A月份在不同的月份,这将不起作用。我怎样才能得到<代码>小时<代码>差异?这个差异方法会返回一个数字还是一个字符串?我处于类似的情况下,我需要使用一些计算的差异。再见,我在这里找到的
    function getRelativeDay(\DateTime $dt2){
        if(!$dt2){
            return false;
        }
        $n = getNightsBetween( new \DateTime(), $dt2);
        switch($n){
            case  0: return "today";
            case  1: return "tomorrow";
            case -1: return "yesterday";
            default: 
                return $n . (abs($n)>1?"days":"day") . ($n<0?" ago":" from now");
        }
    }
    
    $date1 = new DateTime("2013-08-07 13:00:00");
    $date2 = new DateTime("2013-08-08 12:00:00");
    
    $date1->setTime(0, 0, 0);
    $date2->setTime(0, 0, 0);
    
    echo $date1->diff($date2)->days;