PHP strtotime() 函数
定义和用法
strtotime() 函数将任何英文文本的日期或时间描述解析为 Unix 时间戳(自 January 1 1970 00:00:00 GMT 起的秒数)。
注意:如果年份表示使用两位数格式,则值 0-69 会映射为 2000-2069,值 70-100 会映射为 1970-2000。
注意:请注意 m/d/y 或 d-m-y 格式的日期,如果分隔符是斜线(/),则使用美洲的 m/d/y 格式。如果分隔符是横杠(-)或者点(.),则使用欧洲的 d-m-y 格式。为了避免潜在的错误,您应该尽可能使用 YYYY-MM-DD 格式或者使用 date_create_from_format() 函数。
strtotime是PHP自带的关于时间操作很好用的函数,
但经常会有人被strtotime结合-1 month, +1 month, next month的时候搞得很困惑, 然后就会觉得这个函数有点不那么靠谱, 动不动就出问题. 用的时候就会很慌…
//今天是2021-07-31 执行代码:
date("Y-m-d",strtotime("-1 month"))
//怎么输出是2021-07-01?
业务中使用这段代码,如果测试得不仔细,就容易出现这种问题。
虽然这个问题看起来很迷惑, 但从内部逻辑上来说呢, 其实是”对”的, 你先别着急哈, 让我慢慢讲:
我们来模拟下date内部的对于这种事情的处理逻辑:
- 1. 先做-1 month, 那么当前是07-31, 减去一以后就是06-31.
- 2. 再做日期规范化, 因为6月没有31号, 所以就好像2点60等于3点一样, 6月31就等于了7月1
是不是逻辑很”清晰”呢? 我们也可以手动验证第二个步骤, 比如:
var_dump(date("Y-m-d", strtotime("2021-06-31")));
//输出2021-07-01
也就是说, 只要涉及到大小月的最后一天, 都可能会有这个迷惑, 我们也可以很轻松的验证类似的其他月份, 印证这个结论
那怎么办呢?
从PHP5.3开始呢, date新增了一系列修正短语, 来明确这个问题, 那就是”first day of” 和 “last day of”, 也就是你可以限定好不要让date自动”规范化”:
那么回到标题的问题,
//输出本月的第一天 打印2021-07-01
var_dump(date("Y-m-d", strtotime("first day of".date('Y-m-d H:i:s'))));
//输出本月的最后一天 打印 2021-07-31
var_dump(date("Y-m-d", strtotime("last day of".date('Y-m-d H:i:s'))));
//当前月份(2021-07) 上一个月最后一天
$lastMonthLastDay = date("Y-m-d", strtotime("last day of -1 month"));
echo $lastMonthLastDay . '<br/>'; //打印:2021-06-30
//指定月份的最后一天
$month = '2020-01';
$lastMonthLastDay = date("Y-m-d", strtotime("{$month} +1 month -1 day"));
echo $lastMonthLastDay . '<br/>'; //打印:2020-01-31
PHP日期加减
//获得当前时间
//date()格式化时间返回String类型。 date("Y-m-d H:i:s")
$current_date = date(’Y-m-d’,time());
//根据当前时间加一周后
$weekLater = date(’Y-m-d’,strtotime("$current_date + 1 week"));
echo $weekLate;
// 2021-05-26 加一天的日期
$tomorrow = date(’Y-m-d’,strtotime("2021-05-26 + 1 day"));
echo $tomorrow; // 2021-05-27
也可以这样 date("Y-m-d",strtotime("-1 day")) ;直接获得前一天时间
|