使用PHP实现获取周的起始和结束日期技术
跨年过去了几天,有些程序在获取周的起始和结束日期时出现 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); }
相关文章
暂无