PHP获取指定日期所在周和月的起止时间代码实现
本文介绍如何利用PHP内置的日期函数获取指定日期所在星期和月份的开始与结束时间,包含核心算法代码及常见时间段筛选的应用场景。
核心功能实现原理
在处理日志、报表或数据筛选时,确定一个时间区间(如“本周”、“本月”)是基础需求。PHP标准库提供了足够灵活的字符串解析和时间戳处理能力来实现这一目标,无需引入第三方包。
第1步:计算星期的开始与结束时间
目的: 根据传入的日期,返回该星期一00:00:00到星期日23:59:59的时间字符串。
入口参数: $date,格式为 'Y-m-d' 或 strtotime可识别的日期格式。
关键步骤:
- 使用
strtotime($date)将输入日期转换为Unix时间戳。 - 使用
strftime('%u', $timestamp)获取该日期的星期几数值(1-7,其中1代表周一,7代表周日)。注意:这与%w(0-6,周日为0)不同,此处采用ISO 8601标准的周一至周日。 - 计算起始时间:
$timestamp - ($w - 1) * 86400,即向前偏移天数乘以每天秒数。 - 计算结束时间:
$timestamp + (7 - $w) * 86400,即向后偏移至周日。
// 获取指定日期所在星期的开始时间与结束时间
function getWeekRange($date){
$ret = array();
$timestamp = strtotime($date);
$w = strftime('%u', $timestamp); // %u 1=Monday, 7=Sunday
// 设置周一00:00:00
$ret['sdate'] = date('Y-m-d 00:00:00', $timestamp - ($w - 1) * 86400);
// 设置周日23:59:59
$ret['edate'] = date('Y-m-d 23:59:59', $timestamp + (7 - $w) * 86400);
return $ret;
}
第2步:计算月份的开始与结束时间
目的: 根据传入的日期,返回该月1号00:00:00到月末最后一秒的时间字符串。
入口参数: $date,同上。
关键步骤:
- 获取时间戳后,利用
date('t', $timestamp)直接获取该月份的天数(28-31天),这比手动计算闰年更准确且简洁。 - 起始日期固定为该月1号:
'Y-m-1'。 - 结束日期为当月最后一天:
'Y-m-' . $mdays。
// 获取指定日期所在月的开始日期与结束日期
function getMonthRange($date){
$ret = array();
$timestamp = strtotime($date);
$mdays = date('t', $timestamp); // 获取当月天数
// 设置1号00:00:00
$ret['sdate'] = date('Y-m-1 00:00:00', $timestamp);
// 设置月末23:59:59
$ret['edate'] = date('Y-m-'.$mdays.' 23:59:59', $timestamp);
return $ret;
}
第3步:应用示例——常见时间段筛选器
在实际业务中,通常需要将数字索引映射为具体的时间区间。以下代码展示了如何结合上述两个函数,构建一个通用的时间过滤器 getFilter($n)。
操作说明: 根据不同配置项 $n,返回对应的起止时间数组。
- n=1: 昨天(独立处理,因为跨月时直接减一天即可,无需调用range函数复杂化)。
- n=2: 本星期,传入
date('Y-m-d')获取当天然后套用周逻辑。 - n=3/4: 上一周/上上上周,先使用
strtotime('-1 week')计算出基准日期,再代入周计算函数。 - n=5/6: 本月/上月,逻辑同理,先定位基准日期再套用月计算函数。
// 以上两个函数的应用示例
function getFilter($n){
$ret = array();
switch($n){
case 1: // 昨天
$ret['sdate'] = date('Y-m-d 00:00:00', strtotime('-1 day'));
$ret['edate'] = date('Y-m-d 23:59:59', strtotime('-1 day'));
break;
case 2: // 本星期
$ret = getWeekRange(date('Y-m-d'));
break;
case 3: // 上一个星期
$strDate = date('Y-m-d', strtotime('-1 week'));
$ret = getWeekRange($strDate);
break;
case 4: // 上上星期
$strDate = date('Y-m-d', strtotime('-2 week'));
$ret = getWeekRange($strDate);
break;
case 5: // 本月
$ret = getMonthRange(date('Y-m-d'));
break;
case 6: // 上月
$strDate = date('Y-m-d', strtotime('-1 month'));
$ret = getMonthRange($strDate);
break;
}
return $ret;
}
注意事项与排错
时区问题: strftime 和部分 date 行为受服务器时区影响。建议在脚本开头添加 date_default_timezone_set('Asia/Shanghai'); 以确保输出符合预期。
性能考量: 对于高频调用的场景(如每毫秒级计数),字符串转换开销较大。但在常规Web请求中,此方法的性能损耗可忽略不计,代码可读性优于复杂的数学运算。
简要总结
通过 strftime('%u') 确定周首尾,结合 date('t') 获取月末天数,可以极简地解决PHP中的周期时间范围查询问题。这种基于时间戳加减偏移量的方式灵活且兼容性好,适用于各类后台统计系统。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













