首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >获取以天为单位的PHP DateTime差异,将午夜视为一天的变化

获取以天为单位的PHP DateTime差异,将午夜视为一天的变化
EN

Stack Overflow用户
提问于 2013-08-07 19:47:34
回答 4查看 51.7K关注 0票数 36

考虑到午夜是一天的变化(就像DATEDIFF(DAY) DateTimes函数一样),那么获取两个PHP之间的天数差的最简单方法是什么?

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

代码语言:javascript
复制
$date1 = new DateTime("2013-08-07 13:00:00");
$date2 = new DateTime("2013-08-08 12:00:00");
echo $date1->diff($date2)->days; // 0
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-08-07 19:53:06

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

代码语言:javascript
复制
$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
票数 63
EN

Stack Overflow用户

发布于 2013-08-07 19:51:09

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

代码语言:javascript
复制
$date1 = new DateTime("2013-08-07");
$date2 = new DateTime("2013-08-08");
echo $date1->diff($date2)->days;

代码语言:javascript
复制
$date1 = new DateTime("2013-08-07 00:00:00");
$date2 = new DateTime("2013-08-08 00:00:00");
echo $date1->diff($date2)->days;

时间在这里并不重要

票数 9
EN

Stack Overflow用户

发布于 2014-04-09 23:49:42

请注意,DateInterval->days始终为正。因此使用了->invert。

代码语言:javascript
复制
/**
 * 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
}

使用示例:

代码语言:javascript
复制
$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)

一些文本魔术的例子:

代码语言:javascript
复制
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");
    }
}
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18102603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档