如何在特定年份的两个日期之间的天数

时间:2018-02-06 11:45:42

标签: php datetime

我正在解决以下任务>

我有两个约会 - $ start和$ end以及目标年份为$ year。

日期是php DateTime对象,year是字符串。

添加:日期来自MySql字段,来自此格式2017-02-01 15:00:00 ... add2:如果结束日期为null,我使用今天的日期......

我需要弄清楚特定年份这两个日期之间的天数。

此外,我需要将它整整一整天,即使一天中的一分钟应算作一整天......

我可以通过许多跟随ifs解决它。

我在示例中使用的值的预期结果是 2016年是0天 2017年是31天 2018年是32天 2019年是0天

但是有没有优雅的PHP功能可以帮助我这个? 我做了什么似乎是错误的方式,并给出了不好的结果 - 似乎只有整整几天......

请在此处查看我的代码>

<?php
$diff = True;
$start = DateTime::createFromFormat('Y-m-d H:i:s','2017-12-01 23:05:00');
$end = DateTime::createFromFormat('Y-m-d H:i:s','2017-12-03 00:05:00');
$year = '2017';

// start date
if ($start->format('Y')<$year)
{
    $newstart = new DateTime('first day of January '. $year);
}

if ($start->format('Y')==$year)
{
    $newstart = $start;
}

if ($start->format('Y')>$year)
{
    $result = 0;
    $diff = False;
}

// end date
if ($end->format('Y')>$year)
{
    $newend = new DateTime('last day of December '. $year);
}

if ($end->format('Y')==$year)
{
    $newend = $end;
}

if ($end->format('Y')<$year)
{
    $result = 0;
    $diff = False;
}               

// count if diff is applicable
if ($diff)
{
    $result  = $newend->diff($newstart)->format("%a");
}

echo $result;
?>

2 个答案:

答案 0 :(得分:1)

  

但是有没有优雅的PHP功能可以帮助我解决这个问题?

了解DateTime::diff()。它会返回一个DateInterval对象,其中包含天数($days),并检查$h$i$s的值,您可以判断你必须增加它来舍入结果。您还可以使用min()max()来缩短所需年份的时间间隔。

function getDays(DateTimeInterface $start, DateTimeInterface $end, $year)
{
    // Extend the start date and end date to include the entire day
    $s = clone $start;            // Don't modify $start and $end, use duplicates
    $s->setTime(0, 0, 0);
    $e = clone $end;
    $e->setTime(0, 0, 0)->add(new DateInterval('P1D'));  // start of the next day

    // Crop the input interval to the desired year
    $s = min($s, new DateTime("$year-01-01 00:00:00"));
    $year ++;
    $e = max(new DateTime("$year-01-01 00:00:00"), $end);     // start of the next year

    if ($e <= $s) {
        // The input interval does not span across the desired year
        return 0;
    }

    // Compute the difference and return the number of days
    $diff = $e->diff($s);

    return $diff->days;
}

答案 1 :(得分:0)

Auth::user

只需确保并且只有日期部分,您就不应该处理四舍五入。