每周时间安排表php,php – 查找一个月的每周时段(从星期一开始)

我想找到一个月和一年的每周时段.日期应从星期一开始,到星期日结束.如果该月的第一天是星期日(2011年5月),它应该是第一个元素.

2011年5月

> 5月1日(星期日)

> 5月2日 – 5月8日(周一至周日)

> 5月9日 – 5月15日(周一至周日)

> 5月17日 – Ma6y 22(周一至周日)

> 5月23日 – 5月29日(周一至周日)

> 5月30日 – 5月31日(周一至周二)

2012年9月

> 9月1日至9月2日

> 9月3日 – 9月9日

> 9月10日 – 9月16日

> 9月17日 – 9月23日

> 9月24日 – 9月30日

我正在使用此函数计算两个日期的周数 – 即.该月的第一天和该月的最后一天.

public function getWeekNumbers($startDate, $endDate)

{

$p = new DatePeriod(

new DateTime($startDate),

new DateInterval('P1W'),

new DateTime($endDate)

);

$weekNumberList = array();

foreach ($p as $w)

{

$weekNumber = $w->format('W');

$weekNumberList[] = ltrim($weekNumber, '0');

}

return $weekNumberList;

}

奇怪的是,对于1月份,当我期待[1,2,3,4,5]时,它会返回[52,1,2,3,4]的周数.

一旦我有周数,我就像这样使用它们:

//The following loop will populate the dataset with the entire month's durations - regardless if hours were worked or not.

$firstDayOfMonth = date('Y-m-d', strtotime("first day of {$this->year}-{$monthName}"));

$lastDayOfMonth = date('Y-m-d', strtotime("last day of {$this->year}-{$monthName}"));

foreach ($this->getWeekNumbers($firstDayOfMonth, $lastDayOfMonth) as $key => $weekId)

{

// find first mоnday of the year

$firstMon = strtotime("mon jan {$this->year}");

// calculate how many weeks to add

$weeksOffset = $weekId - date('W', $firstMon);

$beginDays = $weeksOffset * 7;

$endDays = ($weeksOffset * 7) + 6;

$searchedMon = strtotime(date('Y-m-d', $firstMon) . " +{$beginDays} days");

$searchedSun = strtotime(date('Y-m-d', $firstMon) . " +{$endDays} days");

echo date("M d", $searchedMon) . " - " . date("M d", $searchedSun);

}

因为getWeekNumbers函数没有返回我期望的周数,所以上述函数的输出是不足为奇的

> 12月24日 – 12月30日(2012年)

> 1月2日 – 1月8日(2012年)

> 1月9日 – 1月15日(2012年)

> 1月16日 – 1月22日(2012)

> 1月23日 – 1月29日(2012)

请注意,第1行(12月24日 – 12月30日)是当年(2012年)的结束,而不是去年年底(2011年).

理想情况下,我希望它看起来像

有任何想法吗?谢谢!!

解决方法:

如果您需要选定月份的所有周数以及所选周的所有日期,那么这就是您所需要的:

function getWeekDays($month, $year)

{

$p = new DatePeriod(

DateTime::createFromFormat('!Y-n-d', "$year-$month-01"),

new DateInterval('P1D'),

DateTime::createFromFormat('!Y-n-d', "$year-$month-01")->add(new DateInterval('P1M'))

);

$datesByWeek = array();

foreach ($p as $d) {

$dateByWeek[ $d->format('W') ][] = $d;

}

return $dateByWeek;

}

getWeekDays()函数返回多维数组.第一个关键是周数. 2级是数组,其日期保存为DateTime对象.

获取示例:

print_r( getWeekDays(5, 2011) ); # May 2011

print_r( getWeekDays(9, 2012) ); # Sep 2012

我有一点额外的时间,所以我写了一个例子;-)

$datesByWeek = getWeekDays(8, 2012);

$o = '

$o.= '

WeekMondayTuesdayWednesdayThursdayFridaySaturdaySunday';

foreach ($datesByWeek as $week => $dates) {

$firstD = $dates[0];

$lastD = $dates[count($dates)-1];

$o.= "

";

$o.= "

" . $firstD->format('M d') . ' - ' . $lastD->format('M d') . "";

$N = $firstD->format('N');

for ($i = 1; $i < $N; $i++) {

$o.= "

-";

}

foreach ($dates as $d) {

$o.= "

" . $d->format('d.') . " / 0.00";

# for selected date do you magic

}

$N = $lastD->format('N');

for ($i = $N; $i < 7; $i++) {

$o.= "

-";

}

$o.= "

";

}

$o.= '

';

echo $o;

输出如下:

标签:duration,period,php,time,week-number

来源: https://codeday.me/bug/20190928/1829262.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值