令人困惑的strtotime

文章讨论了在PHP中使用strtotime处理日期时遇到的问题,特别是在涉及闰年2月和月份边界时。当从如2023年3月29日减去一个月时,会得到不正确的结果。解决方案包括使用firstdayof和lastdayof来指定日期范围,或者采用Carbon库来更精确地管理日期和时间操作。
摘要由CSDN通过智能技术生成
// 今天 2023 年 3 月 29 日

echo date('Y-m-d', strtotime('-1 month'));

结果返回的却是
在这里插入图片描述
一顿搜索后发现

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

逻辑一下就清晰了, 我们也可以手动验证第二个步骤

var_dump(date("Y-m-d", strtotime("2023-02-29")));

在这里插入图片描述
也就是说, 只要涉及到大小月的最后一天, 都可能会有这个问题

解决办法就是"first day of" 和 “last day of”, 也就是你可以限定好不要让date自动"规范化":

var_dump(date("Y-m-d", strtotime("last day of -1 month", strtotime("2023-03-31"))));
var_dump(date("Y-m-d", strtotime("first day of +1 month", strtotime("2023-08-31"))));
var_dump(date("Y-m-d", strtotime("first day of next month", strtotime("2023-01-31"))));
var_dump(date("Y-m-d", strtotime("last day of last month", strtotime("2023-03-31"))));

在这里插入图片描述
还可以使用carbon包来解决这个问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值