【问题标题】:PHP: strtotime() doesn't add the correct amount of daysPHP:strtotime() 没有添加正确的天数
【发布时间】:2021-02-25 11:45:45
【问题描述】:

我有命令date('d.m.y', strtotime('22.02.21 +1 days'))。预期的输出是 23.02.21,但我得到的是 26.02.21。它增加了四天,而不是一天。尝试添加两天时,它会添加五天。

使用不同的日期格式(即date('d.m.y', strtotime('02/22/21 +1 days')))可行,但如果可能,我想使用这种日期格式。

有没有办法让strtotime() 使用这种格式?

【问题讨论】:

  • date('d.m.y', strtotime('2021-02-22 +1 day')); 会更近
  • 都分不清“22.02.21”应该是什么日期,所以我可以同情strtotime的困惑……
  • @deceze♦ 这是德国的正常日期格式。 2021 年 2 月 22 日
  • PHP 是德语吗...?

标签: php string date datetime


【解决方案1】:

根据https://www.php.net/manual/en/function.strtotime.php.

strtotime 期望得到一个包含 英文日期格式 的字符串,并将尝试将该格式解析为 Unix 时间戳。

m/d/y 或 d-m-y 格式的日期通过查看各个组件之间的分隔符来消除歧义:如果分隔符是斜杠 (/),则假定为美式 m/d/y;而如果分隔符是破折号 (-) 或点 (.) 可见,则假定为欧洲 d-m-y 格式。

但是,如果年份以两位数格式给出并且分隔符是破折号 (-) 或点 (.) 可见,则日期字符串将被解析为 y-m-d。 p>

date("d.m.y", strtotime("2021-02-22 +1 day"))

为避免混淆,最好使用 4 位年份的日期

date('d.m.y', strtotime('22.02.2021 +1 days'))

最后,为了避免潜在的歧义,最好尽可能使用 ISO 8601 (YYYY-MM-DD) 日期或 DateTime::createFromFormat()。

【讨论】:

    【解决方案2】:

    如果您的年份是两位数,则无论如何都需要消除世纪的歧义。使用四位数年份即可。

    在此示例中,假设从 70 年开始的任何年份都在 20 世纪,而所有其他年份都在 21 世纪。

    $inputDate = '22.02.21';
    $year = substr($inputDate, 6);
    if ( $year > 69 ) {
        $year = '19' . $year;
    } else {
        $year = '20' . $year;
    }
    $date = substr($inputDate, 0, 6) . $year;
    
    echo date("d.m.y", strtotime($date . ' +1 day'));
    

    沙盒示例:http://sandbox.onlinephpfunctions.com/code/14a79178f8909f3078666ae630163fa7c943cff1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-13
      • 2019-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多