【问题标题】:Date say that we are 1st april and forget 29th,30th,31st日期说我们是 4 月 1 日,忘记了 29、30、31 日
【发布时间】:2019-08-20 18:47:44
【问题描述】:

我正在处理 PHP 中的一些日期,问题是今天,php 返回我说我们是 4 月 1 日。 我真的不知道为什么

试图更改代码以获取日期。

$actArray= array();
for($i=0;$i<30;$i++){
    $date = new DateTime(date("Y-m-d"));
    $date->modify("-".$i." days");
    $date->modify("-1 months");
    $actArray[date("Y-m-d",time()-60*60*24*$i)]=array("display"=>$date->format("Y, m, d"),"MaxPlayers"=>0,"PlayersOn"=>0,"Register"=>0);
}

Alerdy 试过

for($i=0;$i<30;$i++){
    $date = new DateTime(date("Y-m-d",time()-60*60*24*$i));
    $date->sub(new DateInterval("P1M"));
    $actArray[date("Y-m-d",time()-60*60*24*$i)]=array("display"=>$date->format("Y, m, d"),"MaxPlayers"=>0,"PlayersOn"=>0,"Register"=>0);
}

同样的结果

他好像跳过了 3 天。

输出 : 2019, 03, 01 2019, 02, 28 2019, 02, 27 2019, 02, 26 2019, 02, 25 2019.....2019, 02, 28

感谢您的帮助

【问题讨论】:

    标签: php date


    【解决方案1】:

    为什么不使用 date() 函数?它返回本地时间/日期。

    你可以得到今天的日期:

    echo date("Y, M, d");
    

    更多详情:date function php

    https://www.guru99.com/php-date-functions.html很好的参考

    【讨论】:

    • 我alerdy试过$date = new DateTime(date("Y-m-d"));它没有改变什么,正如你所见,我在对象中使用,而不仅仅是函数,因为我需要30天
    • DateTime 接受这种格式的字符串(“ymd”),但是 date 返回这种格式的字符串(“y,m,d”),可以使用替换函数替换逗号:@987654325 @
    • 另请注意,并非所有月份都只有 30 天?
    • 谢谢,这真的很有趣,它似乎只工作一次并停止工作。但我认为这可能是一个可能的解决方案。 :D (在 30 天里,我在 db 中选择 30 个值 :P)但这里的 pb 无关紧要,为什么它跳过 3 天“= 仅在 1 年以来的 3 月”
    【解决方案2】:

    不是每个月都有 30 天,有些甚至更少。

    并非所有日子都有 24 小时。

    DateTime / strtotime 有很多选项,您永远不需要自己进行花哨的时间计算。

    考虑这段代码:

    $today = new DateTime('today');
    echo $today->format('Y-m-d') . PHP_EOL;
    $today->sub(DateInterval::createFromDateString('30 days'));
    echo $today->format('Y-m-d') . PHP_EOL;
    
    $today = new DateTime('today');
    echo $today->format('Y-m-d') . PHP_EOL;
    $today->sub(DateInterval::createFromDateString('1 month'));
    echo $today->format('Y-m-d') . PHP_EOL;
    

    输出:

    2019-03-29
    2019-02-27
    2019-03-29
    2019-03-01
    

    你看,“30天”和“1个月”是有区别的……

    另一个例子:

    $today = new DateTime('today');
    echo $today->format('Y-m-d') . PHP_EOL;
    for($i = 0; $i < 5; $i ++) {
        $today->add(DateInterval::createFromDateString('1 days'));
        echo $today->format('Y-m-d') . PHP_EOL;
    }
    
    2019-03-29
    2019-03-30
    2019-03-31
    2019-04-01
    2019-04-02
    2019-04-03
    

    【讨论】:

    • 是的,我明白了,首先感谢您的帮助 :D 只是我真的不明白为什么我的代码在 3 月到 4 月全年都能正常工作。正如我所说,我用 30 天绘制图表。我不需要一个月,但图表已适应。真正的问题是三月到四月。 (在花哨的时候是我的同事,我个人使用修改)
    • 现在还不是四月(而且您的示例没有显示四月的日期)。您在初始帖子中的日期顺序看起来是正确的(例如 2 月 28 日,然后是 3 月 1 日)。时区是什么?为什么你认为跳过了 3 天?我看不到...
    • "Europe/Paris" :我认为因为它只发生在 4 月,似乎 1 年发生在 4 月/3 月之间,它每隔几个月就会起作用,这就是原因。
    • 请再解释一下您在哪里看到跳过的 3 天?
    • 我给你放了图表的屏幕,如果你愿意,我可以把你的数组作为行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-13
    • 2021-07-13
    • 2020-01-03
    相关资源
    最近更新 更多