LMLPHP后院

使用PHP实现获取周的起始和结束日期技术

maybe yes 发表于 2016-02-15 22:03

跨年过去了几天,有些程序在获取周的起始和结束日期时出现 BUG,导致很多统计出现错误。经过排查,发现是通过周和年两个参数获取周的起始和结束日期方法问题导致。需要弄明白这个问题需要明白周是可以跨年的,比如 2015年的最后一周是第 53 周,日期是 2015 年的 12 月 28 日到 2016 年的 1 月 3 日。

所以当你使用 PHP 的 date 函数在 2016 年的 1 月 1 日获取周时,返回的值是 53,返回的年是 2016。如果没有弄清楚概念,还会以为是 2016 年的第 53 周呢。所以周和年是没有什么特别的关系的。写时间的转换函数,首先一定是通过时间戳。下面的实现不是太完美,但是选择了某人的生日作为一个参照点来计算。我一直以为这样功能的函数其实真的不需要传参数,所以两个参数都是可选的。代码如下:

function get_week_dates($week = '', $year = ''){
	if(!$week){
		$week = date('W');
	}
	if(!$year){
		$year = date('Y');
	}
	if ($week == date('W') && $year == date('Y')) {
		$witchDay = date('w'); // 0 - 6
		if ($witchDay == 0) {
			$witchDay = 7; // 周日
		}
		$pastDays = $witchDay - 1;
		$today_timestamp = strtotime('today');
		$startOfWeek = $today_timestamp - $pastDays * 86400;
	} else {
		$timestamp0210 = strtotime($year.'-02-10');
		$weekOfYear = date('W', $timestamp0210);
		$dayOfWeek = date('w', $timestamp0210);
		if ($dayOfWeek == 0) {
			$dayOfWeek = 7;
		}
		$timestampOfWeek = $timestamp0210 - 86400 * ($dayOfWeek - 1);
		$timestampDistance = ($weekOfYear - $week) * 86400 * 7;
		$startOfWeek = $timestampOfWeek - $timestampDistance;
	}
	$endOfWeek = $startOfWeek + 86400 * 6;
	$startDateOfWeek = date('Y-m-d', $startOfWeek);
	$endDateOfWeek = date('Y-m-d', $endOfWeek);
	return array($startDateOfWeek, $endDateOfWeek);
}
相关文章
2024-04-26 18:14:40 1714126480 0.029429