php 将“本月第一天”与strtetime()一起使用将返回上个月

y0u0uwnf  于 2022-12-02  发布在  PHP
关注(0)|答案(2)|浏览(151)

我想我可能在strtotime()函数中发现了一个bug。
我的应用程序使用unix时间戳来设置特定日期的事件。我将相对时间格式字符串与这些时间戳结合使用。
我编写了以下最小代码来重现错误:

<?php
echo "Last day of " . date('M-Y', 1677628800) . " is: " . date('M-d-Y', strtotime('last day this month', 1677628800)) . " expecting march 31! <br>"; 
echo "Last day of " . date('M-Y', 1677628800) . " is: " . date('M-d-Y', strtotime('last day next month', 1677628800)) . " expecting april 30 in this case!<br>";
echo "Last day of " . date('M-Y', 1677628800) . " is: " . date('M-d-Y', strtotime('first day of next month', 1677628800)) . " expecting first day of april <br>";
echo "Last day of " . date('M-Y', strtotime('first day of this month')) . " is: " . date('M-d-Y', strtotime('last day this month', strtotime('first day of this month'))) . "<br>"; 
echo "Last day of " . date('M-Y', strtotime('first day of this month')) . " is: " . date('M-d-Y', strtotime('last day this month')) . "<br>"; 
?>

为什么PHP会出现这种意外的行为?我猜我的时间戳刚好在两天的边缘是问题的根本原因。这是不是某个奇怪的时区问题?我想不是,因为strtotime()一开始就给出了这些时间戳,所以应该不会有什么区别!
有没有人有更好的解决办法,然后只是增加一天?

8fq7wneg

8fq7wneg1#

看起来如果你在你的strtetime规则中缺少“of”,它就不会像预期的那样工作。
如果我用你的最小代码来重现bug并修复它,添加缺失的“of”,它就能工作了。

<?php
echo  "Last day of ".date('M-Y', 1677628800)." is: ".date('M-d-Y', strtotime('last day of this month', 1677628800))." expecting march 31!" . PHP_EOL; 
echo  "Last day of ".date('M-Y', 1677628800)." is: ".date('M-d-Y', strtotime('last day of next month', 1677628800))." expecting april 30 in this case!" . PHP_EOL; 
echo  "Last day of ".date('M-Y', 1677628800)." is: ".date('M-d-Y', strtotime('first day of next month', 1677628800))." expecting first day of april" . PHP_EOL; 
echo  "Last day of ".date('M-Y', strtotime('first day of this month'))." is: ".date('M-d-Y', strtotime('last day of this month', strtotime('first day of this month'))). PHP_EOL; 
echo  "Last day of ".date('M-Y', strtotime('first day of this month'))." is: ".date('M-d-Y', strtotime('last day of this month')) . PHP_EOL;

请参阅:https://onlinephp.io/c/69307

toe95027

toe950272#

这是一个XY Problem(如果不是离题:拼写错误问题),因为您在“相对时间格式”表达式中没有使用of
因为所有月份都从1开始,所以可以静态地将01声明为日历年中任何月份的第一天,对于月份的最后一天,t提供该值。
代码:(Demo

echo date('M-01-Y');

echo "\n---\n";

echo date('M-01-Y', strtotime('next month'));

echo "\n---\n";

echo date('M-t-Y');

echo "\n---\n";

echo date('M-t-Y', strtotime('next month'));

输出量:

Nov-01-2022
---
Dec-01-2022
---
Nov-30-2022
---
Dec-31-2022

除此之外,PHP文档还显式地包含first day of条目。
设置当前月份的第一天。此短语通常最好与后面的月份名称一起使用,因为它只影响当前月份

相关问题