strtotime 踩坑记录

前言

今天是 2019 年的最后一天,即将从 2019 年咸鱼进化成 2020 年咸鱼

就在今早,代码写着写着就出现了一个奇怪的事情:


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

// 2019/12/01

见鬼了,还能不能好好让我当一条咸鱼了?


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

// 2019/10/31

唔。。。来看看鸟哥怎么说:令人困惑的 strtotime

date 内部处理逻辑

  • 先做 -1 month :今天是 2019/12/31,上个月的今天就是 2019/11/31

  • 再做日期规范化:因为 11 月没有 31 号,自然成了 12 月的 1 号

验证一下:


echo  date('Y/m/d', strtotime('-1 month', strtotime('2019/03/31')));

// 2019/03/03

那我该如何获取上个月的最后一天日期呢?

相对格式


echo  date('Y/m/d', strtotime('last day of -1 month'));

// 2019/11/30

相对格式

最后

问题解决,继续当回一条可爱的咸鱼。

原文

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 3小时前 自动加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 9
wanghan

文章底部的刷牙女让我看了半小时

3个月前 评论
cnguu (楼主) 3个月前
laisxn 3个月前
thus 3个月前

file

这个图片我盗走了

3个月前 评论
cnguu (楼主) 3个月前
wade (作者) 3个月前

建议使用扩展 Carbon

3个月前 评论
cnguu (楼主) 3个月前
_杭城浪子 3个月前

这时候需要拿出carbon:
today()->subMonthNoOverflow()

3个月前 评论

用多了扩展性能有点差

3个月前 评论

很多时候直接用mktime

3个月前 评论

file

// 现在日期 - 2020-01-02
echo date('Y/m/d');

// 按你的意思是期望得到  2019-12-02,  实际得到的是  2019/12/31
echo  date('Y/m/d', strtotime('last day of -1 month'));

// 也就是说, 你这个使用还要判断今天几号, 上月有没有 对应日期,  2333

PS: 没错我就是来抬(ti)杠(bug)的

3个月前 评论
Zccc 3个月前
p270228163 (作者) 3个月前
cnguu (楼主) 3个月前
p270228163 (作者) 3个月前

我12月31号测试定时任务也才发现这个问题 :smile:

2个月前 评论
cnguu (楼主) 2个月前
likunyan

我前几天也是遇到这个问题。。。

2个月前 评论

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!