我在网站上显示每隔一周开会一次的公司的日期。我遇到的问题是显示下一个日期。
例如,如果当前会议是在2014年9月16日,则日期应显示在2014年9月30日。
然而,在本例中,直到2014年9月30日不到一周的时间,日期将显示在之后的一周; 2014年10月7日这是不正确的。
以下是我使用的代码:
<?php
$dow = 'tuesday';
$step = 2;
$unit = 'W';
$start = new DateTime(gmdate("Y-m-d", time()));
$end = clone $start;
$start->modify($dow); // Move to first occurence
$end->add(new DateInterval('P1Y')); // Move to 1 year from start
$interval = new DateInterval("P{$step}{$unit}");
$period = new DatePeriod($start, $interval, $end);
$count = 0;
echo('<h3>');
foreach ($period as $date) {
if($count < 1){
echo $date->format('D, d M Y'), PHP_EOL;
}
$count+=1;
}
echo('</h3>');
?>
答案 0 :(得分:0)
您可以使用,而不是重新发明轮子 Carbon - 众所周知的PHP DateTime Library。它将为您处理与DateTime相关的所有内容。试一试。
以下是对Carbon的快速浏览。要从现在起添加2周,您可以使用
echo Carbon::now()->addWeek(2);
从指定日期开始增加2周,例如2014年9月10日
echo Carbon::createFromDate(2014, 9, 10)->addWeek(2);
答案 1 :(得分:0)
如果会议每两周举行一次,您可以依赖周数。
e.g。如果会议每周二进行一次,你可以试试这个:
<?php
$today= new DateTime();
$nextTuesday = strtotime("next tuesday");
$week = $today->format("W");
echo("See you on ");
if($week % 2 == 0){
echo(date("D d/m/Y",strtotime("+7 day", $nextTuesday)));
}
else {
echo(date("D d/m/Y",$nextTuesday));
}
?>
答案 2 :(得分:0)
您的代码示例与您的问题说明不匹配。
由于您通过new DateTime(gmdate("Y-m-d", time()));
使用当前时间戳,因此PHP不知道上次会议的时间,并且只计算下周二的2周,从今天开始。
使用DateTime执行所描述的操作的方法是设置一个固定的时间点:
$dow = 'tuesday';
$step = 2;
$unit = 'W';
$start = new DateTime('2014-09-16');
$start->modify($dow);
$start->add(new DateInterval("P{$step}{$unit}"));
echo '<h3>'
. $start->format('D, d M Y')
. '</h3>';
如果您想输出下一年的所有会议日期(如您的代码所示):
$dow = 'tuesday';
$step = 2;
$unit = 'W';
$start = new DateTime('2014-09-16');
$start->modify($dow);
$end = clone $start;
$end->add(new DateInterval('P1Y'));
$interval = new DateInterval("P{$step}{$unit}");
while ($start < $end) {
$start->add($interval);
echo '<h3>'
. $start->format('D, d M Y')
. '</h3>';
}