php - 意外的 DateTime DateInterval DatePeriod 结果

标签 php date datetime

在使用 DateTime DateInterval 和 DatePeriod 计算两个日期之间的间隔时,我在使用 P1W(周)和 P1M(月)时遇到了一些意想不到的结果。

如果我们获取 9 月 30 日至 10 月 29 日之间的月份,则仅输出“Sep”。将结束日期更改为 10 月 30 日会输出“Sep”和“Oct”。我的第一个想法是也许它需要是该月的最后一天,但是当然,10 月有 31 天......

$dateStart  = '2014-09-30 00:00:00';
$dateEnd    = '2014-10-29 23:59:59'; // Sep
// $dateEnd = '2014-10-30 23:59:59'; // Sep, Oct
// $dateEnd = '2014-10-31 23:59:59'; // Sep, Oct
$dateInt    = 'M';

$start      = new DateTime($dateStart);
$end        = new DateTime($dateEnd);
$interval   = new DateInterval('P1'.$dateInt);
$period     = new DatePeriod($start, $interval, $end);

foreach ($period as $day) {
    var_dump($day->format($dateInt));
}

当尝试获取两个日期之间的周数时,也会发生同样的情况。将结束日期设置为 10 月 27 日星期一,结果中不包括该周 (44)。然而,将结束日期更改为 10 月 28 日星期二,确实包括第 44 周。

$dateStart  = '2014-09-30 00:00:00';
$dateEnd    = '2014-10-27 23:59:59'; // Monday - 40, 41, 42, 43
// $dateEnd = '2014-10-28 23:59:59'; // Tuesday - 40, 41, 42, 43, 44
// $dateEnd = '2014-10-29 23:59:59'; // Wednesday - 40, 41, 42, 43, 44
$dateInt    = 'W';

$start      = new DateTime($dateStart);
$end        = new DateTime($dateEnd);
$interval   = new DateInterval('P1'.$dateInt);
$period     = new DatePeriod($start, $interval, $end);

foreach ($period as $day) {
    var_dump($day->format($dateInt));
}

有谁知道这是否是一个已知的错误?如果是这样/如果不是,有人知道最好的解决方法/修复吗?

最佳答案

文档在 comments 中说明:

endDate datetime is excluded

所以 2014-09-30 00:00:00 - 2014-10-30 00:00:00 包含 1 个月

但是 2014-09-30 00:00:00 - 2014-10-30 00:00:01 包含 2 个月

此外,文档指出您甚至可以通过在构造函数方法调用中使用标志来排除 startDate。

关于php - 意外的 DateTime DateInterval DatePeriod 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26652057/

相关文章:

php - 在不同日期更新2条记录?

java - 带有日期的负参数的奇怪结果

JavaScript 新日期格式

javascript - 当系列中不存在日期时,Highstock 比较先前的数据点

php -  上传到数据库的 html 代码中的字符

php - 从 img 标签的 src 属性上传图像 JQuery AJAX PHP

php - 在单个查询中使用两个推测表?

c# - DateTime 是否适合仅存储日期?

来自 ISO8601 时间戳字符串的 Django 模型 DateTimeField

JavaScript 上午/下午时间比较