记PHP第几周和日期转换的坑

项目中有个功能是周报生成,周报里会填写这一周的事件。写周报时,会判断今天属于今年第几周,然后决定写到哪周的周报中,周报简介中会显示这周包含哪几天

判断属于今年第几周代码:

echo strftime("%Y-%W",time());

这个功能默默的运行着,没给我添麻烦。。。直到刚跨入2016年发现一个诡异的坑。

周报文件名字包含时间,格式为strftime("%Y-%W",”本地当前时间时间戳“)。

周报中出现2016-00这样格式的文件,但是那个周报简介中包含的天数却为:1970-01-01至1970-01-07。


原来,strftime("%Y-%W",timestamp)的计算方法是这样的:从一月一号开始往后算,如果这一天不是星期一,就属于第0周,直到星期一的时候,就开始计算为第一周,拿2016年一月一号算:2016-1-1到2016-1-3都属于第0周,2016-1-4第一周。。

但是,strtotime("2016-W00")就会解析失败,如果不是第0周就没问题,比如:echo date("Y-m-d",strtotime("2016-W01"));会输出“2016-01-04”,这不扯淡么。。

所以只好自己计算了。。具体计算方法参照outlook的计算方法,不同的是我们这第一周第一天是星期一,outlook第一周第一天是星期天。

具体的计算方法是这样的:如果一年最后几天的那个星期一到星期天包含下一年的日期,那么这一周就算为下一年的第一周,拿2016年举例:第一周的日期是:2015-12-28到2016-01-3,第二周日期:2016-01-4到2016-01-10。

下面是根据年和第几周计算这周的星期一日期:

//这个函数用来获取$year年第一周的星期一的日期
function get_firstday_of_firstweek($year){
//计算这一年第一天星期几,范围0-6,分别是星期日到星期六
	$tm_wday = strptime("$year-01-01","%Y-%m-%d")['tm_wday'];
	$tm_wday = $tm_wday == 0 ? 7 : $tm_wday;
	$tm_wday -- ;
	return strtotime("$year-01-01 - $tm_wday days");
}

function get_firstday_of_week($year,$week){
//计算这一周星期一距第一年第一周的星期一多少天
	$days = ($week - 1)*7;
	$firstday_of_firstweek = get_firstday_of_firstweek($year);
	$date_str = date("Y-m-d",$firstday_of_firstweek);
//加上天数就获取到这一周星期一的日期了
	return strtotime("$date_str + $days days");
}



获取到了这一周星期一,再加6天就是这一周的星期天了


从日期判断这一天属于多少周计算方法类似,先计算第一周的星期一的日期,然后判断这一天距第一周的星期一多少天,整除7计算第几周,只是要判断下这一周是否包含下一年的日期,如果包含则这一周就是下一年的第一周了


本人出于个人兴趣,创建了一个个人公众号,每天筛选国外网友发现的有趣的事情推送到公众号,欢迎关注!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值