遇到了PHP的strtotime(“- x month”) bug

上午接到财务的电话,在录入工资的时候,默认的工资都是0了,所有的人工资都要重新录入,问怎么办?

工资系统是我2010年在原来的教学教务支持系统上开发并新增的一个模块,PHP编写。今年是17年了,7年来运行很稳定。开发设计录入工资的时候,为了节省财务人员工作量并考虑到基础工资的变化较小,所以所有人的基础工资这块都是由上月的数字自动填入的,财务人员只要再录入变化的绩效工资就可以了。而这次恰恰是这个环节出了问题。

系统开发的时间太久了,找到生成工资的程序,仔细看了一下代码。因为经过这么多年的运行,代码应该是稳定的。所以就直接在中间加了几个断点,查一下状态。最后发现是查询上月工资返回值是0.也就是说上月没有工资,进数据库再次核查,上月有工资无误。再一次变量,才发现上月工资的值应该是2017年2月,结果值却为2017年3月,和本月的值一样。结果当然不对。呵呵,所以我收回刚才那句话,应该是“经过这么多年的运行,代码也不一定稳定。”

上网查了一下资料,应该是strtotime("- x month") 的bug,在月末执行时,有可能会遇到,不可知的问题,比如今天这个。看来财务在录数据的时候,运气真是好啊,这么多年才碰到这一次。找到原因了,解决办法如下。

//$bfdaynow1=date("Y",strtotime("-1 month"));//取上月年
//$bfdaynow2=date("m",strtotime("-1 month"));//取上月月
$first_day_of_month = date('Y-m',time()) . '-01 00:00:01';
$t = strtotime($first_day_of_month);
$bfdaynow1=date("Y",strtotime("-1 month",$t));//取上月年
$bfdaynow2=date("m",strtotime("-1 month",$t));//取上月月

注释掉的是原代码,下面是新代码,也就是让当前时间不要变成月末,变成月初,就解决了。

未经允许不得转载:生于七零年代 » 遇到了PHP的strtotime(“- x month”) bug

赞 (6) 打赏

评论

4+2=

觉得文章有用就打赏一下文章作者

微信扫一扫打赏