我希望去年用户在1月份选择月份。
例如:如果今天是01-01-2018
(2018年的第一个月)并且用户选择December
或' 11月',我希望01-12-2017
到{{1 (2017年11月或12月)。
如果今天是31-12-2017
(选择2018年12月),并且用户选择15-12-2018
,我希望December
到01-12-2018
(想要2018年12月)。
答案 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));
以下是仅使用时间戳的方法:
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;
}
答案 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');
?>