РЕДАКТИРОВАТЬ
Я пробовал этот код прямо ниже. Это близко, но все еще не найдены недели с 1-го числа месяца до 1-й субботы, затем каждую неделю после вс-сб до последнего воскресенья до конца месяца.
function get_weeks($month, $year) {
$weeks = array();
$date = DateTime::createFromFormat('mY', $month.$year);
$date->modify('first day of this month');
$end = clone $date;
$end->modify('last day of this month');
$interval = DateInterval::createFromDateString('1 week');
$period = new DatePeriod($date, $interval, $end);
$counter = 1;
foreach ($period as $dt) {
$end_of_week = clone $dt;
$end_of_week->modify('this Saturday');
$weeks[] = sprintf("Week %u: %s - %s",
$counter,
$dt->format('Y-m-d'),
$end_of_week->format('Y-m-d')
);
$counter++;
}
return $weeks;
}
$weeks = get_weeks('08', '2020');
print_r($weeks);
Он печатает:
Array
(
[0] => Week 1: 2020-08-01 - 2020-08-01
[1] => Week 2: 2020-08-08 - 2020-08-08
[2] => Week 3: 2020-08-15 - 2020-08-15
[3] => Week 4: 2020-08-22 - 2020-08-22
[4] => Week 5: 2020-08-29 - 2020-08-29
)
Но вместо этого он должен напечатать:
Array
(
[0] => Week 1: 2020-08-01 - 2020-08-01 //correct for this month since 1st day of month and 1st Saturday of this month just happen to be on the same day
[1] => Week 2: 2020-08-02 - 2020-08-08
[2] => Week 3: 2020-08-09 - 2020-08-15
[3] => Week 4: 2020-08-16 - 2020-08-22
[4] => Week 5: 2020-08-23 - 2020-08-29
[5] => Week 6: 2020-08-30 - 2020-08-31 //last Sunday until end of month
)
ОРИГИНАЛЬНАЯ ЗАПИСЬ
Моя цель - получить данные временной метки для указанного номера недели указанного месяца. Я начинаю свою неделю в вс, заканчиваю в сб. Итак, я пытаюсь получить все временные метки для каждой недели в конкретном c месяце, чтобы я мог построить график, показывая общее количество часов каждой недели. Но сначала мне нужно указать начало и конец каждой недели для этого месяца. Мне удалось сделать это для каждого дня недели определенной c недели, но настройка недели / месяца для меня слишком сложна.
Вот что у меня есть:
function task_range_month_week($monthweek, $cap_start_raw, $cap_end_raw) {
$start = new DateTime(date('Y-m-d',$cap_start_raw));
$end = new DateTime(date('Y-m-d',$cap_end_raw+86399));
$interval = DateInterval::createFromDateString('1 week');
$period = new DatePeriod($start, $interval, $end);
foreach ($period as $dt) {
//just make it return the values for only a single (specified) week of the month
//if ($dt->format("N") == $monthweek) {
$cap_start = strtotime($dt->format("Y-m-d 00:00:00"));
$cap_end = strtotime($dt->format("Y-m-d 23:59:59"));
//}
}
Тогда Я бы назвал функцию так, где $cap_start_raw
и $cap_end_raw
- даты начала и окончания месяца, а $monthweek
- это указанный номер недели (1-6). Поэтому я пытаюсь получить время с воскресенья по субботу (или любых других неполных дней недели месяца) для этой конкретной c недели.
Тогда $cap_start
и $cap_end
будут выходными для диапазона указанной недели.
Я хочу вызвать эту функцию следующим образом:
//get the 1st week of August 2020, Sun 00:00:00 - Sat 11:59:59 (or whatever days of the month are still in this week)
task_range_month_week(1, 1596240000, 1598918399)
//this would output the 2 new timestamps for that week(1)
//$cap_start = 1XXXXXXXXX;
//$cap_end = 1XXXXXXXXX;
//get the 2nd week of August 2020, Sun 00:00:00 - Sat 11:59:59 (or whatever days of the month are still in this week)
task_range_month_week(2, 1596240000, 1598918399)
//this would output the 2 new timestamps for that week(2)
//$cap_start = 1XXXXXXXXX;
//$cap_end = 1XXXXXXXXX;
etc...
Я считаю, что это имеет отношение к части $dt->format()
, но не знаю, как ее получить
Предполагаемый результат должен вернуть значения отметок времени $ cap_start и $ cap_end.
Другой способ сказать, что это ...
... он возвращает новые метки времени начала и конца для предполагаемого диапазона вывода. Я вызываю функцию task_range_month_week () для каждой недели, которую я ищу, чтобы найти начало и конец отдельной недели (вывод $ cap_start, $ cap_end). Итак, поскольку в августе 2020 года есть дни, охватывающие 6 различных календарных недель, я вызываю эту функцию 6 раз, каждый с указанием в месяц в месяц для 1-6 в случае этого месяца. Тогда в случае 1-й недели месяца новый выходной диапазон будет иметь $ cap_start 1-го числа месяца в 00:00:00, а поскольку $ cap_end выпадает на субботу, когда я хотите закончить мои недели (начинаются по воскресеньям), он должен вывести $ cap_end в тот же день в 23:59:59. Затем следующая неделя будет с воскресенья по субботу и так далее, пока не будут найдены все время начала и окончания недели для этого месяца, причем первая и последняя недели будут иметь диапазоны только до максимального отсечения, которое является началом месяца и время окончания.
Если я установлю «1 день» вместо «1 неделя» и раскомментирую if ($dt->format("N") == $monthweek)
, тогда он будет работать, когда я использую дни указанной недели, которые у меня уже есть для этого график. Но как заставить его работать на недельную настройку?
Есть идеи?