PHP中时间函数strtotime记录容易出现bug的情况

11月的时候,同事做了一个功能,大致为获取上个月的表单并提醒未提交表单的人提交,该功能在12月发布。但是在12.31号,本该提醒的是11月未提交表单的人,却提醒了12月未提交表单的人。查看代码的时候发现用的函数没有错误,于是上网搜索问题,结果原来是strtotime函数逻辑问题。

代码如下:

$subMonth=Carbon::now()->subMonth()->toDateTimeString();<br>
$year=date('Y',strtotime($subMonth));<br>
$month=date('m',strtotime($subMonth));

之后有同事提醒之前曾经看过鸟哥的博客有解释过这个问题。

date内部的对于这种事情的处理逻辑:

  • 1. 先做-1 month, 那么当前是07-31, 减去一以后就是06-31.
  • 2. 再做日期规范化, 因为6月没有31号, 所以就好像2点60等于3点一样, 6月31就等于了7月1

更改代码为一下生效

$year = date("Y", strtotime('last day of last month', time()));
$month = date("m", strtotime('last day of last month', time()));

参考: http://www.laruence.com/2018/07/31/3207.html

Visits: 57