有没有一个解决方案可以找到特定周数的开始和结束日期。示例:
如果我输入$week=5,我想得到2016-03-28-2016-04-03。我只需要一年。
我想你要找的是strtotime和date。
<?php
$year = 2016;
$week = 1;
$a = strtotime('January 1 ' . $year);
$b = date('N', $a) - 1;
$c = $a;
$a += (7 - $b) * 86400;
if($week > 1) {
$start = $a + (($week - 2) * 604800);
$end = $start + ($b ? 518400 : 604800);
}
else {
$start = $c;
$end = $a - 86400;
}
echo date('l jS 'of F Y', $start);
echo '<br />';
echo date('l jS 'of F Y', $end);
2016年1月1日星期五
2016年1月3日星期日
作为一个经过验证的函数。如果最后一周进入下一年,这个版本甚至会缩短一年的最后一周,就像第一周一样。如果周不在年内,则返回false:
<?php
function weekdays($week, $year = false) {
$week = floor($week);
if($week < 0 || $week > 53)
return false;
if($year == false)
$year = date('Y');
$a = strtotime('January 1 ' . $year);
$b = date('N', $a) - 1;
$c = $a;
$a += (7 - $b) * 86400;
if($week > 1) {
$a += (($week - 2) * 604800);
$b = $a + ($b ? 518400 : 604800);
return
date('Y', $a) == $year
? array(
'first' => $a,
'last' =>
date('Y', $b) > $year
? $b - (8 - date('N', $b)) * 86400
: $b
) : false;
}
else
return array('first' => $c, 'last' => $a - 86400);
}
$week = weekdays(14, 2016);
echo date('l jS 'of F Y', $week['first']);
echo '<br />';
echo date('l jS 'of F Y', $week['last']);
2016年3月28日星期一
2016年4月3日星期日
您可以使用DateTime:执行此操作
$year = 2016;
$week = 13;
$date = new DateTime();
$date->setISODate($year, $week);
$start = $date->format('Y-m-d');
$end = $date->modify('+6 days')->format('Y-m-d');
echo 'Week start: '. $start , "'n"; // 2016-03-28
echo 'Week end: '. $end , "'n"; // 2016-04-03
您可以使用PHP相对日期时间函数(http://php.net/manual/en/datetime.formats.relative.php)类似:
//date_default_timezone_set('Europe/Amsterdam');
$date = new DateTime();
$date->modify('2016W5'); //First day of week 5 of 2016
$date->modify('2016W5 +6 days'); //Last day of week 5 of 2016
或者建立自己的功能:
function week_start_date($wk_num, $yr, $first = 1, $format = 'F d, Y')
{
$wk_ts = strtotime('+' . $wk_num . ' weeks', strtotime($yr . '0101'));
$mon_ts = strtotime('-' . date('w', $wk_ts) + $first . ' days', $wk_ts);
return date($format, $mon_ts);
}
$sStartDate = week_start_date($week_number, $year);
$sEndDate = date('F d, Y', strtotime('+6 days', strtotime($sStartDate)));
从这里提取:通过php 查找一周中的第一天
如果我输入$week=5,我想得到2016-03-28-2016-04-03。
所以,我想你想要三月五周的星期一和星期日。
为了获得这一点,我创建了一个简单的函数,该函数需要一个日期字符串(YYYY-MM-DD)和周数。函数根据给定的字符串创建一个DateTime
对象,然后在月的第一天对其进行修改,然后检索日期周的第一天并添加$week
-1周。此时,我们迎来了本周的第一天(星期一)。我们将此日期克隆到$end
,并添加6天。
函数返回一个以$start
和$end
日期为属性的对象,该对象是通过投射compact()
:创建的数组获得的
function monthWeek( $date, $week )
{
$start = new DateTime( $date );
$start->modify( 'first day of this month' );
$start->modify( '-'.($start->format( 'w' )-1).' days' );
$start->modify( '+'.($week-1).' weeks' );
$end = clone $start;
$end->modify( '+6 days' );
return (object) compact( 'start', 'end' );
}
用一个随意的三月天调用上述函数:
$week = monthWeek( '2016-03-25', 5 );
echo $week->start->format( 'l, Y-m-d' );
echo " => ";
echo $week->end->format( 'l, Y-m-d' );
我们得到这个:
Monday, 2016-03-28 => Sunday, 2016-04-03
您也可以使用该函数来检索基于年份的周,使用一月的一天作为第一个参数:
$week = monthWeek( '2016-01-25', 14 );
echo $week->start->format( 'l, Y-m-d' );
echo " => ";
echo $week->end->format( 'l, Y-m-d' );
将输出:
Monday, 2016-03-28 => Sunday, 2016-04-03
phpFiddle演示