确实
\Illuminate\Support\Carbon::now()->subMonth(1)->format('Y-m-d H:i:s')
2023-03-01 09:30:14
需要这样
echo \Illuminate\Support\Carbon::now()->startOfMonth()->subMonth(1)->format('Y-m-d H:i:s');
2023-02-01 00:00:00
或者
echo \Illuminate\Support\Carbon::now()->subMonthNoOverflow()->format('Y-m-d H:i:s');
2023-02-28 09:53:04
这样
echo date("Y-m-d", strtotime("last day of -1 month", time()));
2023-02-28
试一下go 也是一样,所以这个确实跟语言无关,和踩坑经验相关
now := time.Now()
lastMonth := now.AddDate(0, -1, 0)
fmt.Println(lastMonth.Format("2006-01-02"))
2023-03-01
不要那么主观上来就bug,有没有可能是你自己基本功不到位呢,请用 date('Y-m-d', strtotime('last day of -1 month')) 试一试呢,就算如果真的是bug请到官方仓库提issue或者pr而不是在社区抱怨带来负能量
// 今天 2023 年 3 月 29 日 09
echo date('Y-m-d', strtotime('-1 month')); // 2023-03-01
echo date('Y-m-d', strtotime('-2 month')); // 2023-01-29
// 按正常逻辑 -1 应该是 2023-02-29, 但是2 月没有这一天, 那么 29 号就会变成 28 号的后一天,即 2023-03-01
参考
这个是以当前时间计算得来的,上月没有29,就会往前移一天。要想计算日期准确需要稍微处理一下
// 获取当前日
$day = date('d');
// 获取上个月,因为 `last day of -1 month` 这是修正语句所以不会错,可以获取到上个月
$last_day_of_month = strtotime("last day of -1 month");
// 获取上个月最大天数
$last_days = date('t', $last_day_of_month);
// 取最小值
$true_day = min($day, $last_days);
// 获取准确日期
$last_month = date('Y-m-', $last_day_of_month) . $true_day;
echo $last_month;
这不是一个BUG,描述清楚你的目的,你想获取怎么样的日期,也许我可以帮助你。
官方函数 strtotime 是非常灵活的,无需扩展包就能做到很多很多你想不到的,学好英文,尝试用规范的英文语义化传递参数进去,你会得到预期的效果。可参考我写了一些用例手册,更多的等你自己去发现
www.kancloud.cn/wenshunbiao/wenshu...
这种每月的固定多少号到期,只是有些业务设计需要(我个人做过的比较多项目是按30天计),源码底层是不会考虑太多业务方面的东西的。这事让我想起前段时间很多人吐槽的爱奇艺会员,2月少几天。但有时候我们又需要这种业务场景。
闲来无事,原生实现了这种需求(有更精炼的写法,欢迎交流),灵感来自于Carbon
包,去学习了它的源码,要方便的话当然是直接用Carbon
包啦,下面的代码仅供学习或不想加包的场景使用:
// 面向对象风格
$date = new \DateTime();
$day = $date->format('d');
$date->modify("-1 month");
if ($day !== $date->format('d')) {
$date = $date->modify('last day of previous month');
}
echo $date->format(DATE_ATOM) . PHP_EOL;
// 函数风格
$timestamp = strtotime('-1 month');
if (date('d') !== date('d', $timestamp)) {
$timestamp = strtotime('last day of previous month', $timestamp);
}
echo date(DATE_ATOM, $timestamp) . PHP_EOL;
推荐文章: