php date的坑

先看一下这段代码

$str = '2023-10-31';
date('Y-m-01', strtotime("{$str} -1 month"));

目测这个时间获取到的是 2023-09-01 对不对, 其实得到的结果是 2023-10-01, 是不是很坑?

如果想要获取准确的推荐 \Carbon\Carbon::now()->subMonthNoOverflow()->startOfMonth()->toDateString()

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 13

楼上已经贴出了鸟哥的文章,这不是什么BUG,补充一点文档说明(如下图),文档上已经说明,相对月份值是根据它们经过的月份长度计算的,以你的代码为例,减1月,经过就是9月份,9月总共30天,结果就是10.1。

file

Carbon包封装2个方法,只不过有一个方法正好适用于你的业务。

\Carbon\Carbon::now()->subMonthWithOverflow()->toDateString();  // 等同于你的代码示例
\Carbon\Carbon::now()->subMonthNoOverflow()->toDateString(); // 你业务真正需要的  
5个月前 评论
sunny123456 5个月前
raybon 5个月前

因为php - 1month实际上是减的上个月的天数。不可信。真想获取上月第一天可以这么写

$m = date('m')-1;
$str = date('Y').'-'.$m;
echo date('Y-m-01', strtotime($str));
5个月前 评论
Async_ 5个月前
ononl (作者) 5个月前
$str = '2023-10-31';
$date = date('Y-m-d', strtotime("{$str} first day of -1 month 00:00:00"));
var_dump($date);

www.kancloud.cn/wenshunbiao/wenshu...

5个月前 评论

楼上已经贴出了鸟哥的文章,这不是什么BUG,补充一点文档说明(如下图),文档上已经说明,相对月份值是根据它们经过的月份长度计算的,以你的代码为例,减1月,经过就是9月份,9月总共30天,结果就是10.1。

file

Carbon包封装2个方法,只不过有一个方法正好适用于你的业务。

\Carbon\Carbon::now()->subMonthWithOverflow()->toDateString();  // 等同于你的代码示例
\Carbon\Carbon::now()->subMonthNoOverflow()->toDateString(); // 你业务真正需要的  
5个月前 评论
sunny123456 5个月前
raybon 5个月前

subMonthNoOverflow,你这有点菜鸟了 :joy:

5个月前 评论
date('Y-m-01', strtotime(date("Y-m-01"))-1)
5个月前 评论

不仅仅是PHP的获取有此问题,go语言的也有这个问题,解决方法可以获取本月第一天的时间然后减去一个月即可

5个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!