php开发过程中,经常会用到一些针对日期、时间、时间戳的转换获取等操作,如下个月第一天啊,上周啊,每个月第三天啊;形式多样,层出不穷。然而,具体到应用时,总想不起具体使用方式,查询网上总没有一个非常全面的整理。不论是博客上还是官网上,都不全面,有的只是文字说明,有的只是简单实例,都不具有实战性。

基于此,整理本文;本文几乎全部是实例;看着非常方便。

//时间戳加减时间段,day,week,month,year是否带s都可以,与前面的数字是否有空格也都可以。
//因此,这个strtotime对格式要求不严格
$tt=strtotime("+3 days",$time);//$time 3天之后的时间戳
$tt=strtotime("+6 month",$time);//$time6个月之后的时间戳
$tt=strtotime("+1 year 6 months",$time);//指定时间戳1年6个月后的时间戳
 
$t=time();//当前时间:1545184219,2018-12-19上午9点50
echo strtotime(date('Y-m-01', $t));//结果是:1543593600(2018/12/1 0:0:0)
echo strtotime(date('Y-m-10', $t));//结果是:1544371200(2018/12/10 0:0:0)
echo strtotime(date('Y-m-d 8:0:0', $t));//结果是:1545177600(2018/12/19 8:0:0)
echo strtotime(date("Y-m-d",time()).' 23:59:59');//当天23:59:59的INT类型时间戳
echo strtotime(date("Y-m-t", $tt1).' 23:59:59');//根据某一时间戳获取当月最后的时间戳
 
$t0 = strtotime(date('Y-m-01', strtotime('-1 month', $t)));//上月起点
$t1 = strtotime(date('Y-m-01'));//本月起点
$t2 = strtotime(date('Y-m-t 23:59:59'));//本月终点
 
//关于生日判断
$shengri='1986-01-06';
$date=date("m-d",strtotime($shengri));//结果是:01-06
$t_date=strtotime(date('Y-'.$date.'8:0:0', time()));//结果是:1546732800(2019/1/6 8:0:0)


关于strtotime()出现的一些奇怪的问题

date("Y-m-d",strtotime("-1 month"))//如果当前是2018-07-31,则输出2018-07-01
var_dump(date("Y-m-d", strtotime("2017-06-31")));//输出2017-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("-1 month", strtotime("2017-03-31"))));
//输出2017-03-03
var_dump(date("Y-m-d", strtotime("+1 month", strtotime("2017-08-31"))));
//输出2017-10-01
var_dump(date("Y-m-d", strtotime("next month", strtotime("2017-01-31"))));
//输出2017-03-03
var_dump(date("Y-m-d", strtotime("last month", strtotime("2017-03-31"))));
//输出2017-03-03


那怎么办呢?
从PHP5.3开始呢, date新增了一系列修正短语, 来明确这个问题, 那就是"first day of" 和 "last day of", 也就是你可以限定好不要让date自动"规范化":

var_dump(date("Y-m-d", strtotime("last day of -1 month", strtotime("2017-03-31"))));
//输出2017-02-28
var_dump(date("Y-m-d", strtotime("first day of +1 month", strtotime("2017-08-31"))));
//输出2017-09-01
var_dump(date("Y-m-d", strtotime("first day of next month", strtotime("2017-01-31"))));
//输出2017-02-01
var_dump(date("Y-m-d", strtotime("last day of last month", strtotime("2017-03-31"))));
//输出2017-02-28


评论(0条)

刀客源码 游客评论