内容简介:在 PHP 里,如果想获取下个月的今天,我们通常会用随着时间流逝,到了搜了一下,找到鸟哥有一篇
在 PHP 里,如果想获取下个月的今天,我们通常会用 strtotime('2019-01-13 +1 month')
或者是 strtotime('next month', strtotime('2019-01-13'))
,结果是 1549987200
,用 date
转换成字符串就是 2019-02-13
,so easy!
随着时间流逝,到了 2019-01-31
这一天,这代码似乎出问题了,居然得到的是 2019-03-03
???
搜了一下,找到鸟哥有一篇 文章 有解释过为什么会出现这个情况,原因是:
在 date
内部对于这种事情的处理逻辑:
- 先做 +1 month,那么当前是 01-31,加上一以后就是 02-31
- 再做日期规范化, 因为 2 月没有 31 号, 所以就好像 2:60 等于 3:00 一样,2019 年 2 月 31 日就等于了 3 月 3 日
知道了原因,那我们就知道该怎么去处理这个问题了。
首先我们先约定,如果是大月的 31 号,遇到小月时则取小月的最后一天作为 下个月的今天
,为什么这么约定呢,因为在一些结算系统中,假如你第一次月结日是在 31 号,那么下一次月结如果遇到小月,通常是以小月的最后一天作为月结日,而不是跨到再下一个月去月结。
function next_month($date)
{
if (is_numeric($date)) {
$date = date('Y-m-d', $date);
}
$next_month = date('Y-m-d', strtotime('next month', strtotime($date)));
// 获取当前日期的年、月、日
list($d_y, $d_m, $d_d) = explode('-', $date);
// 获取“一个月后”的年、月、日
list($n_y, $n_m, $n_d) = explode('-', $next_month);
// 如果月份差大于 1,说明跨月了,只需要取下一个月的最后一天就可以了;
// 细心的你可能会想到,如果是 12 月,那么 $n_m - $d_m 就是负数,需不需要再特殊处理呢?
// 其实是不用的,因为 12 月和 1 月都是大月,不存在“一个月后的今天”是跨到了次年 2 月的情况
if ($n_m - $d_m > 1) {
$next_month = date('Y-m-d', strtotime('last day of next month', strtotime($date)));
}
return $next_month;
}
这回可以正确地获取到 一个月后的日期
了,但是,如果我要获取两个月后的今天呢?
echo next_month(next_month('2019-01-31'));
上面这种用法会输出 2019-03-28
这个结果,很明显是不行的,如果是用 date('Y-m-d', strtotime('2019-01-31 +2 months'))
,在这一次需求里还行,但是如果恰巧遇上两个月后是小月呢?又或者是我要知道第 N 个月后的今天的日期?
其实也很简单,只要对上面的函数稍作修改即可:
function next_months($date, $months = 1) {
if (is_numeric($date)) {
$date = date('Y-m-d', $date);
}
$next_month = date('Y-m-d', strtotime('+' . $months . ' month', strtotime($date)));
list($d_y, $d_m, $d_d) = explode('-', $date);
list($n_y, $n_m, $n_d) = explode('-', $next_month);
$diff = ($n_y - $d_y) * 12 + ($n_m - $d_m);
if ($diff > $months) {
$next_month = date('Y-m-d', strtotime('last day of next month', strtotime($date)));
}
return $next_month;
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- ADO.NET获取数据(DataSet)同时获取表的架构实例
- 根据 PID 获取 K8S Pod名称 - 反之 POD名称 获取 PID
- .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
- phpinfo获取敏感内容
- 低开销获取时间戳
- python 利率获取
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
硅谷增长黑客实战笔记
曲卉 / 机械工业出版社 / 2018-4-10 / 65.00元
增长黑客这个词源于硅谷,简单说,这是一群以数据驱动营销、以迭代验证策略,通过技术手段实现爆发式增长的新型人才。近年来,互联网公司意识到这一角色可以发挥四两拨千斤的作用,因此对该职位的需求也如井喷式增长。 本书作者曾在增长黑客之父肖恩•埃利斯麾下担任增长负责人,用亲身经历为你总结出增长黑客必备的套路、内力和兵法。本书不仅有逻辑清晰的理论体系、干货满满的实践心得,还有Pinterest、SoFi......一起来看看 《硅谷增长黑客实战笔记》 这本书的介绍吧!