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 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 9
wanghan

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

4年前 评论
cnguu (楼主) 4年前
laisxn 4年前
rufo 4年前

建议使用扩展 Carbon

4年前 评论
cnguu (楼主) 4年前
_杭城浪子 4年前

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

4年前 评论

用多了扩展性能有点差

4年前 评论

很多时候直接用mktime

4年前 评论

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)的

4年前 评论
Zccc 4年前
kis龍 (作者) 4年前
cnguu (楼主) 4年前
kis龍 (作者) 4年前

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

4年前 评论
cnguu (楼主) 4年前

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

4年前 评论

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