php - 从 PHP 中的日期范围获取一周的开始和结束日期
问题描述
我正在使用下面的代码从给定的日期范围获取周开始(星期一)和结束日期(星期日)。
function getWeekDates($date, $start_date, $end_date) {
$week = date('W', strtotime($date));
$year = date('Y', strtotime($date));
$month = date('M', strtotime($date));
$from = date("Y-m-d", strtotime("{$year}-W{$week}")); //Returns the date of monday in week
if($from < $start_date) $from = $start_date;
$to = date("Y-m-d", strtotime("{$year}-W{$week}-7")); //Returns the date of sunday in week
if($to > $end_date) $to = $end_date;
$d = date('d', strtotime($from));
return ['week'=>$month."-".$d,'st'=>$from,'end'=>$to];
}
function getWeekDatesArr($start_date = null , $end_date = null) {
$arr = [];
for($date = $start_date; $date <= $end_date; $date = date('Y-m-d', strtotime($date. ' + 7 days'))) {
$list = getWeekDates($date, $start_date, $end_date);
$arr[$list['week']] = ['start'=>$list['st'],'end'=>$list['end']];
}
return $arr;
}
$start_date = '2019-10-14';
$end_date = '2020-01-05';
$dates = getWeekDatesArr($start_date, $end_date);
echo "<pre>";
print_r($dates);
在输出中最后开始和结束日期是错误的。它没有显示明年
[Dec-23] => Array
(
[start] => 2019-12-23
[end] => 2019-12-29
)
[Dec-14] => Array
(
[start] => 2019-10-14
[end] => 2019-01-06
)
解决方案
使用DateTime 类更加容易和清晰。
<?php
$start_date = '2019-10-14';
$end_date = '2020-01-05';
$date = date_create($start_date);
$end = date_create($end_date);
$dates = [];
while($date < $end){
$key = $date->format('M-d');
$dates[$key] = [
'start' => $date->format('Y-m-d'),
'end' => $date->modify('next Sunday')->format('Y-m-d')
];
$date->modify('next Monday');
}
//test output
echo "<pre>";
var_dump($dates);
注意: 作为“Md”的键可能会导致问题。在几年的时间里,密钥不再是唯一的。最好将年份也包含在密钥中。
推荐阅读
- r - 用 ggplot 为许多变量按组绘制优势比
- spring-boot - 使用 onErrorResume 处理使用 Reactor Kafka 发布到 Kafka 的有问题的有效负载
- r - 删除 igraph 中的最大派系
- azure-virtual-network - 将现有 Azure 容器实例添加到 VNET
- scala - 由于 Databricks 不公开支持 spark-redshift 库,因此使用 Scala spark 从 Redshift 读取/写入 Redshift 的最佳方法是什么
- python - 我在 Heroku 上收到 404 错误,但它在本地工作
- pine-script - 如何使标签在右侧对齐?
- angular - 如何在文本区域内映射键 TAB
- spring-boot - 当原始代码正常工作时,为什么我的单元测试没有通过?
- orm - ORM 可以代表所有可能的 SQL 查询吗?