获取过去 6 个月的时间戳,显示某些日期的重复项



我有以下简单的代码来检索过去 6 个月的时间戳。但是今天在12月31日一直工作正常;七月出现两次,十二月出现两次。

这让我对在PHP中处理时间产生了非理性的恐惧

for ($i = 6; $i >= 0; $i--) {
$time_start = strtotime('first day of this month 00:00:00', strtotime('-' . $i . ' months'));
$time_end = strtotime('last day of this month 23:59:59', strtotime('-' . $i . ' months'));
$timestamps[] = [
'label' => date('M', $time_start),
'start' => $time_start,
'end' => $time_end
];
}

输出:

Array
(
[0] => Array
(
[label] => Jul
[start] => 1561903200
[end] => 1564581540
)
[1] => Array
(
[label] => Jul
[start] => 1561903200
[end] => 1564581540
)
[2] => Array
(
[label] => Aug
[start] => 1564581600
[end] => 1567259940
)
[3] => Array
(
[label] => Oct
[start] => 1569852000
[end] => 1572530340
)
[4] => Array
(
[label] => Oct
[start] => 1569852000
[end] => 1572530340
)
[5] => Array
(
[label] => Dec
[start] => 1575122400
[end] => 1577800740
)
[6] => Array
(
[label] => Dec
[start] => 1575122400
[end] => 1577800740
)
)

我有一个假设,strtotime('-1 month')实际上并没有减去一整月?

您获得结果的原因是今天是 12 月 31 日。使用strtotime('-' . $i . ' months')时,您将获得以下日期序列:

31 December
31 November
31 October
31 September
31 August
31 July
31 June

PHP 可以方便地识别出其中三个日期是非法的,并将它们转换为最佳猜测,从而为您提供:

31 December
1 December
31 October
1 October
31 August
31 July
1 July

因此,您在输出中看到重复项(以及缺少的 9 月和 11 月(。如您所见,使用DateTime是解决此问题的最佳方法。

我假设strtotime('-1 month')未能减去一个完整的时间顺序月份是正确的。

我的解决方案是用DateTime减去,这感觉更准确

for ($i = 5; $i >= 0; $i--) {
$start = new DateTime('first day of this month 00:00:00');
$start->modify('-' . $i . ' months');
$time_start = strtotime('first day of this month 00:00', $start->getTimestamp());
$time_end = strtotime('last day of this month 23:59', $start->getTimestamp());
$timestamps[] = [
'label' => date('M', $time_start),
'start' => $time_start,
'end' => $time_end
];
}

最新更新