我想我可能在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()
一开始就给出了这些时间戳,所以应该不会有什么区别!
有没有人有更好的解决办法,然后只是增加一天?
2条答案
按热度按时间8fq7wneg1#
看起来如果你在你的strtetime规则中缺少“of”,它就不会像预期的那样工作。
如果我用你的最小代码来重现bug并修复它,添加缺失的“of”,它就能工作了。
请参阅:https://onlinephp.io/c/69307
toe950272#
这是一个XY Problem(如果不是离题:拼写错误问题),因为您在“相对时间格式”表达式中没有使用
of
。因为所有月份都从1开始,所以可以静态地将
01
声明为日历年中任何月份的第一天,对于月份的最后一天,t
提供该值。代码:(Demo)
输出量:
除此之外,PHP文档还显式地包含
first day of
条目。设置当前月份的第一天。此短语通常最好与后面的月份名称一起使用,因为它只影响当前月份