如何从给定的开始日期和结束日期开始每隔一周获取星期一和星期三的日期
例如
Start date : 01-01-2019
End Date : 05-03-2019
每周一、周三
所以以下日期应该在列表中
Wednesday : 02-01-2019
Monday : 14-01-2019
Wednesday : 16-01-2019
Monday : 28-01-2019
Wednesday : 30-01-2019
Monday : 11-02-2019
Wednesday : 13-02-2019
Monday : 25-02-2019
Wednesday : 27-02-2019
$startDate = '01-01-2019';
$endDate = '01-03-2019';
$day_number = '1';
$ofWeek = '2';
getDateForSpecificDayBetweenDates($startDate,$endDate,$day_number,$ofWeek);
function getDateForSpecificDayBetweenDates($startDate,$endDate,$day_number,$ofWeek){
$endDate = strtotime($endDate);
$days=array('1'=>'Monday','2' => 'Tuesday','3' => 'Wednesday','4'=>'Thursday','5' =>'Friday','6' => 'Saturday','7'=>'Sunday');
$date_array = array();
$cnt=0;
for($i = strtotime($days[$day_number], strtotime($startDate)); $i <= $endDate; $i = strtotime('+1 week', $i))
{
$weeknumber = weekOfMonth(date('Y-m-d',$i));
echo "Week : ".$weeknumber.' - Date : '.date('Y-m-d',$i)."<br>";
if($weeknumber == $ofWeek){
$date_array[$cnt]['dates']=date('Y-m-d',$i);
$date_array[$cnt]['week']=$weeknumber;
$cnt++;
}
}
echo "<pre>";print_r($date_array);echo "<pre>";
}
function weekOfMonth($date) {
// estract date parts
list($y, $m, $d) = explode('-', date('Y-m-d', strtotime($date)));
// current week, min 1
$w = 1;
// for each day since the start of the month
for ($i = 1; $i <= $d; ++$i) {
// if that day was a sunday and is not the first day of month
if ($i > 1 && date('w', strtotime("$y-$m-$i")) == 0) {
// increment current week
++$w;
}
}
// now return
return $w;
}
我已经使用了开发此代码,但它只给了我每月 2 周的时间,我需要在开始日期后每 2 周一次
我无法从范围中找到第二周。如何识别第二周的日期
任何帮助都将被挪用
这看起来是一个有趣的挑战。
下面是使用 DateTime 对象和 ->modify()
函数移动到下一个星期一和星期三的一种方法。
<?php
$start_date = '01-01-2019';
$end_date = '05-03-2019';
$sd = new DateTimeImmutable($start_date);
$nd = new DateTime($start_date);
$ed = new DateTimeImmutable($end_date);
echo 'Start Date = ' . $sd->format('D Y-m-d').PHP_EOL;
// check if the next date from the start date is a monday or a wednesday
// and output the first date accordingly
if ( $sd->modify('next monday') < $sd->modify('next wednesday')) {
echo '>>>' . $nd->modify('next monday')->format('D d/m/Y'). PHP_EOL;
echo '>>>' . $nd->modify('next wednesday')->format('D d/m/Y'). PHP_EOL;
}else{
echo '>>>' . $nd->modify('next wednesday')->format('D d/m/Y'). PHP_EOL;
}
while (1) {
// add 7 days
$nd->add(new DateInterval('P7D'));
// go to next monday unless that means we went past the end date
if ( $nd->modify('next monday') > $ed ) { break; }
echo '>>>' . $nd->format('D d/m/Y'). PHP_EOL;
// go to next wednesday unless that means we went past the end date
if ( $nd->modify('next wednesday') > $ed ) { break; }
echo '>>>' . $nd->format('D d/m/Y'). PHP_EOL;
}
结果
Start Date = Tue 2019-01-01
>>>Wed 02/01/2019
>>>Mon 14/01/2019
>>>Wed 16/01/2019
>>>Mon 28/01/2019
>>>Wed 30/01/2019
>>>Mon 11/02/2019
>>>Wed 13/02/2019
>>>Mon 25/02/2019
>>>Wed 27/02/2019
<?php
$date1 = new DateTime('01-01-2019');
$date2 = new DateTime('05-03-2019');
$interval = $date1->diff($date2);
$weekday = ['monday','tuesday','wednesday','thursday','friday','saturday','sunday'];
while($date1<$date2)
{
$day_of_week = intval($date1->format('w'));
if($day_of_week>=1 && $day_of_week<3)
{
$addDays=3-$day_of_week;
}else{
$addDays=15-$day_of_week;
}
$date1->modify('+' . $addDays . ' day');
$day_of_week = intval($date1->format('w')) - 1;
if($date1<$date2)
{
echo $weekday[$day_of_week] . ' - ' . $date1->format('d-m-Y') . '<br>';
}
}
?>
你在php小提琴上试试这个。
首先,我休息了一周。
然后检查是星期一还是星期二,如果是,则从 3 得到差异,因为星期三是一周的第三天并将其添加到当天。
然后你有星期一,应该是星期三之后的第二个星期一。
两个星期一之间的差异是 15 天,因此从 15 中减去。
这是输出。
wednesday - 02-01-2019
monday - 14-01-2019
wednesday - 16-01-2019
monday - 28-01-2019
wednesday - 30-01-2019
monday - 11-02-2019
wednesday - 13-02-2019
monday - 25-02-2019
wednesday - 27-02-2019
DatePeriod
来实现它:
$begin = new DateTime('2019-01-01');
$end = new DateTime('2019-03-05');
$interval = new DateInterval('P2W');
$period = new DatePeriod($begin, $interval, $end);
$dates = [];
foreach ($period as $date) {
$wednesday = $date->modify('next wednesday');
$monday = (clone $wednesday)->modify('+1 week next monday');
if ($wednesday < $end) {
$dates[] = $wednesday;
}
if ($monday < $end) {
$dates[] = $monday;
}
}
foreach ($dates as $date) {
echo $date->format('D: d-m-Y') . '<br />';
}
结果是:
Wed: 02-01-2019
Mon: 14-01-2019
Wed: 16-01-2019
Mon: 28-01-2019
Wed: 30-01-2019
Mon: 11-02-2019
Wed: 13-02-2019
Mon: 25-02-2019
Wed: 27-02-2019
在这里查看
试试 此函数传递两个日期时间戳:
<?php
function get_date($startDateTime,$repeat_until){
for ($i = $startDateTime; $i <= $repeat_until; $i+=86400) {
$ShowDay_arr = array(1, 3);
$Newdate = $i;
$Numerday=date("N",$Newdate);
if(in_array($Numerday,$ShowDay_arr)){
$day = date("D", $Newdate);
echo "<b> Day : ".$day."</b> (".date("d-m-Y",$Newdate).")";
echo "<br>";
}
}
}
get_date(1559401144,1561906744);
?>