如何根据年和月计算日期,反之亦然

时间:2018-01-01 14:33:04

标签: php

我希望去年用户在1月份选择月份。

例如:如果今天是01-01-2018(2018年的第一个月)并且用户选择December或' 11月',我希望01-12-2017到{{1 (2017年11月或12月)。

如果今天是31-12-2017(选择2018年12月),并且用户选择15-12-2018,我希望December01-12-2018(想要2018年12月)。

3 个答案:

答案 0 :(得分:1)

可以使用strtotime()和时间戳(以秒为单位,而不是天数)来完成,但这是使用DateTime个对象的方法:

function get_thirty_days(\DateTime $date_in, int $days = null) {
    $days = $days ?? 30;
    $date_out = $date_in->add(new \DateInterval(sprintf('P%dD', $days)));
    $dates = [];

    while ($days) {
        $dates[] = $date_out
            ->sub(new \DateInterval('P1D'))
            ->format('Ymd')
        ;

        $days--;
    }

    return $dates;
}

然后,你所要做的就是有一个有效的\DateTime对象传入并为你做偏移:

get_thirty_days(new \DateTime()); // An array of dates, largest first, 30 days.
get_thirty_days(new \DateTime('2017-01-15'), 40); // An array of 40 dates, starting from...
array_reverse(get_thirty_days(new \DateTime('2017-01-15'), 10));

https://3v4l.org/5QjEr

以下是仅使用时间戳的方法:

get_thirty_days((new \DateTime())->getTimestamp());

function get_thirty_days(int $start_date_ts, int $days = null) {
    $days = $days ?? 30;
    $dates = [];

    while ($days--) {
        $dates[] = date('Y-m-d', $start_date_ts + ($days * (60 * 60 * 24)));
    }

    return $dates;
}

https://3v4l.org/UXPA0

答案 1 :(得分:1)

我会使用Carbon包来做这样的事情,因为它使这项工作变得如此简单,我已经将它包含在90%的项目中。

代码看起来像这样(未经测试):

function getDays($month) {
   $date = Carbon::now()->setMonth($month)->startOfMonth();
   $days = [];
   while($date->month == $month) {
      $days[] = $date->toDateString(); // or whatever format suits you
      $date->addDay();
   }
   return $days;
}

我猜不多解释,直观的Carbon API让代码说明了一切。

答案 2 :(得分:-1)

使用 DateTime 类在日期上进行操作,这样更容易

你问题的答案是 http://php.net/manual/pl/datetime.diff.php

<?php
$datetime1 = new DateTime('2009-10-11');
$datetime2 = new DateTime('2009-10-13');
$interval = $datetime1->diff($datetime2);
echo $interval->format('%R%a days');
?>