从星期日到星期六获取指定月份的所有星期

强尼·普洛

编辑

我在下面直接尝试了此代码。已经很接近了,但是仍然找不到从每月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
)

原始帖子

我的目标是提取指定月份的指定周数的时间戳数据。我从星期日开始我的一周,从星期六开始。因此,我正在尝试汇总特定月份中每周的所有时间戳,以便我可以将其绘制出来,以显示每周的总时数。但是首先,我需要指定该月每个星期的开始和结束。我可以在特定一周的每个工作日执行此操作,但是周/月的设置对我来说太复杂了。

这是我所拥有的:

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)。因此,我正在尝试获取该特定星期从星期日-星期六(或每月的部分星期天)的时间。

然后,$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年8月的天数跨越6个不同的日历周,因此我将调用该函数6次,在本月的情况下,每个函数都将$ monthweek指定为1-6。然后在该月的第一个星期的情况下,新的输出范围将在该月的1号的00:00:00具有$ cap_start,并且由于$ cap_end恰好是在星期六,要结束我的几周(从星期日开始),它应该在同一天的23:59:59输出$ cap_end。然后,下周是从Sun-Sat开始,依此类推,直到找到该月的一周的开始和结束时间,

如果我将其设置为“ 1天”而不是“ 1周”,并且取消注释,if ($dt->format("N") == $monthweek)则它适用于我在指定周中的某天进行设置的工作,而该周我已经为该图进行了设置。但是,如何使其在数周的设置中起作用?

有任何想法吗?

米克马克萨

我决定从算术角度而不是日期时间角度来完成此任务。

也许有一种我没有考虑过的优雅的日期时间对象变异技术,但是我发现我的函数调用轻方法并不可怕。

我相信我的变量命名将通过我的脚本提供足够的逻辑指导,但是有效地我将给定周的开始和结束天数增加了一个变量/计算值,并在整个月的所有天都结束时取消了循环代表。

代码:(演示

function get_weeks($month, $year) {
    $weeks = [];
    $ym = $year . '-' . $month;
    $final = date('t', strtotime($ym));
    $firstSat = date('d', strtotime("first Saturday of $ym"));
    $d = 1;
    $weekNo = 0;

    do {
        $weekEnd = $d === 1 ? $firstSat : min($final, $d + 6);
        $weeks[] = sprintf(
            "Week %d: %s-%02d - %s-%02d",
            ++$weekNo,
            $ym,
            $d,
            $ym,
            $weekEnd
        );
        $d = $weekEnd + 1;
    } while ($weekEnd < $final);

    return $weeks;
}
foreach (['01','02','03','04','05','06', '07', '08', '09', '10', '11', '12'] as $month) {
    echo var_export(get_weeks($month, '2020'), true) . "\n";
}

输出:

array (
  0 => 'Week 1: 2020-01-01 - 2020-01-04',
  1 => 'Week 2: 2020-01-05 - 2020-01-11',
  2 => 'Week 3: 2020-01-12 - 2020-01-18',
  3 => 'Week 4: 2020-01-19 - 2020-01-25',
  4 => 'Week 5: 2020-01-26 - 2020-01-31',
)
array (
  0 => 'Week 1: 2020-02-01 - 2020-02-01',
  1 => 'Week 2: 2020-02-02 - 2020-02-08',
  2 => 'Week 3: 2020-02-09 - 2020-02-15',
  3 => 'Week 4: 2020-02-16 - 2020-02-22',
  4 => 'Week 5: 2020-02-23 - 2020-02-29',
)
array (
  0 => 'Week 1: 2020-03-01 - 2020-03-07',
  1 => 'Week 2: 2020-03-08 - 2020-03-14',
  2 => 'Week 3: 2020-03-15 - 2020-03-21',
  3 => 'Week 4: 2020-03-22 - 2020-03-28',
  4 => 'Week 5: 2020-03-29 - 2020-03-31',
)
array (
  0 => 'Week 1: 2020-04-01 - 2020-04-04',
  1 => 'Week 2: 2020-04-05 - 2020-04-11',
  2 => 'Week 3: 2020-04-12 - 2020-04-18',
  3 => 'Week 4: 2020-04-19 - 2020-04-25',
  4 => 'Week 5: 2020-04-26 - 2020-04-30',
)
array (
  0 => 'Week 1: 2020-05-01 - 2020-05-02',
  1 => 'Week 2: 2020-05-03 - 2020-05-09',
  2 => 'Week 3: 2020-05-10 - 2020-05-16',
  3 => 'Week 4: 2020-05-17 - 2020-05-23',
  4 => 'Week 5: 2020-05-24 - 2020-05-30',
  5 => 'Week 6: 2020-05-31 - 2020-05-31',
)
array (
  0 => 'Week 1: 2020-06-01 - 2020-06-06',
  1 => 'Week 2: 2020-06-07 - 2020-06-13',
  2 => 'Week 3: 2020-06-14 - 2020-06-20',
  3 => 'Week 4: 2020-06-21 - 2020-06-27',
  4 => 'Week 5: 2020-06-28 - 2020-06-30',
)
array (
  0 => 'Week 1: 2020-07-01 - 2020-07-04',
  1 => 'Week 2: 2020-07-05 - 2020-07-11',
  2 => 'Week 3: 2020-07-12 - 2020-07-18',
  3 => 'Week 4: 2020-07-19 - 2020-07-25',
  4 => 'Week 5: 2020-07-26 - 2020-07-31',
)
array (
  0 => 'Week 1: 2020-08-01 - 2020-08-01',
  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',
)
array (
  0 => 'Week 1: 2020-09-01 - 2020-09-05',
  1 => 'Week 2: 2020-09-06 - 2020-09-12',
  2 => 'Week 3: 2020-09-13 - 2020-09-19',
  3 => 'Week 4: 2020-09-20 - 2020-09-26',
  4 => 'Week 5: 2020-09-27 - 2020-09-30',
)
array (
  0 => 'Week 1: 2020-10-01 - 2020-10-03',
  1 => 'Week 2: 2020-10-04 - 2020-10-10',
  2 => 'Week 3: 2020-10-11 - 2020-10-17',
  3 => 'Week 4: 2020-10-18 - 2020-10-24',
  4 => 'Week 5: 2020-10-25 - 2020-10-31',
)
array (
  0 => 'Week 1: 2020-11-01 - 2020-11-07',
  1 => 'Week 2: 2020-11-08 - 2020-11-14',
  2 => 'Week 3: 2020-11-15 - 2020-11-21',
  3 => 'Week 4: 2020-11-22 - 2020-11-28',
  4 => 'Week 5: 2020-11-29 - 2020-11-30',
)
array (
  0 => 'Week 1: 2020-12-01 - 2020-12-05',
  1 => 'Week 2: 2020-12-06 - 2020-12-12',
  2 => 'Week 3: 2020-12-13 - 2020-12-19',
  3 => 'Week 4: 2020-12-20 - 2020-12-26',
  4 => 'Week 5: 2020-12-27 - 2020-12-31',
)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

从给定日期获取从星期日到星期六的整个星期的日期

SQL Server上周从星期日到星期六

php中的星期日到星期六星期日期数组

JMeter:如何从星期日到星期六获取上周的日期?

获取上周日期范围从星期日到星期六的时刻js

从当年的所有星期日和星期六插入MySQL表

编号日期为星期日至星期六

如何从给定目录中包含日期为星期六或星期日的csv文件中查找所有行?

获取 2 周前星期日和星期六的日期

在Java中,如何使用系统的默认语言环境(语言)获取星期几的字符串(星期日,星期一,...,星期六)

我可以通过HMS中的Time Capture API获取日期详细信息(星期日-星期六)

计算两个日期之间的周末(星期六和星期日)的数量

我想计算日期范围内的星期六和星期日

如果今天是星期六或星期日,则为PHP

使用JavaScript确定日期是星期六还是星期日

Primefaces p:calendar组件在星期六和星期日不起作用

Python weekday()将星期日设为1,将星期六设为7

在javascript中将对象星期日至星期六排序

SQL Sever - Datediff、小时,但不包括星期六/星期日

Pandas - 确定 pandas 列中的日期是在星期六还是星期日

ionic 3 DateTime组件如何禁用未来的星期六和星期日

从数据集中过滤出星期六和星期日

从 DatePicker Andorid 禁用星期六和星期日

获取上个月的最后一天,如果不是星期六,则获取直到星期六的所有日期(包括星期六)

如何用之前的星期五替换在星期六或星期日到达的计算出的日期

如何获取两个日期之间的所有星期日/星期一/星期二?

如何修复工作日,以在周六和周日输出特定信息。从星期一到星期五,人们在工作,从星期六到星期日是周末

JSON数据-使用Javascript / Jquery按星期几(星期日,星期一,星期二,星期三,星期四,星期五,星期六)分组

在函数SQL中获取给定月份的星期日