我有以下简单的代码来检索过去 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
];
}