Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 获取最近6个月的时间戳,显示特定日期的重复项_Php - Fatal编程技术网

Php 获取最近6个月的时间戳,显示特定日期的重复项

Php 获取最近6个月的时间戳,显示特定日期的重复项,php,Php,我有下面的简单代码来检索前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 t

我有下面的简单代码来检索前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
        )

)

我有一个假设,
strotime(“-1个月”)
实际上并没有减去一个完整的月份?

我正确地假设
strotime(“-1个月”)
没有减去一个完整的按时间顺序排列的月份

我的解决方案是使用
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
    ];
}

你得到结果的原因是今天是12月31日。当您使用
strotime('-'.$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
是解决此问题的最佳方法