PHP:定义间隔的开始日期
我使用以下几行计算PHP中的4周间隔。 这将使用固定日期(PHP:定义间隔的开始日期,php,date,datetime,dateinterval,Php,Date,Datetime,Dateinterval,我使用以下几行计算PHP中的4周间隔。 这将使用固定日期($calStart)作为计算的基础,并以所选年份的最后一天($rangeEnd/$selYear)结束间隔,迄今为止效果良好 示例:如果所选年份为2015年,则我的范围内的第一个日期应为2015-01-16,作为所选年份的第一个间隔日期 这里有人能告诉我如何设置它,使$rangeDays仅从所选年份中的第一个间隔日期开始,而不是返回自$calStart日期以来的所有间隔(这是它目前所做的) 非常感谢你在这方面的帮助,蒂姆 如果您希望让$c
$calStart
)作为计算的基础,并以所选年份的最后一天($rangeEnd
/$selYear
)结束间隔,迄今为止效果良好
示例:如果所选年份为2015年,则我的范围内的第一个日期应为2015-01-16,作为所选年份的第一个间隔日期
这里有人能告诉我如何设置它,使$rangeDays
仅从所选年份中的第一个间隔日期开始,而不是返回自$calStart
日期以来的所有间隔(这是它目前所做的)
非常感谢你在这方面的帮助,蒂姆 如果您希望让
$calStart
与$rangeEnd
在同一年启动,这应该可以为您做到:
$calStart = new DateTime('2014-01-17');
if ($selYear !== $calStart->format('Y')) {
$calStart->setDate($selYear , $calStart->format('n'), $calStart->format('j'));
}
$interval = DateInterval::createFromDateString('4 weeks');
$rangeEnd = new DateTime($selYear . '-12-31');
$rangeDays = new DatePeriod($calStart, $interval, $rangeEnd);
我不确定您是如何将2015-01-16
作为新的开始日期的,因此我无法直接解决这个问题。您可以尝试:
$calStart = new \DateTime('2014-01-17');
$calYear = $calStart->format('Y');
if ($selYear !== $calYear) {
$day = (int) $calStart->format('z') + date('z', mktime(0,0,0,12,31,$calYear)) * ($selYear - $calYear);
$calStart->setDate($selYear, 1, $day % 28);
}
编辑:
这个更复杂:
$calStart = new \DateTime('2014-01-17');
$calYear = (int) $calStart->format('Y');
if ($selYear !== $calYear) {
$days = (int) $calStart->format('z') + 1; // get day in a year. +1 is because it starts with 0
for ($i = $calYear; $i < $selYear; $i++) {
$days -= (date('z', mktime(0,0,0,12,31,$i)) + 1) % 28; // remove from start day a modulo of 28 days, every year the date is lower
}
if ($days < 0) {
$days += 28; // if we will finish with value under 0, just add 4 weeks
}
$calStart->setDate($selYear, 1, $days);
}
$calStart=new\DateTime('2014-01-17');
$calYear=(int)$calStart->format('Y');
如果($selYear!=$calYear){
$days=(int)$calStart->format('z')+1;//获取一年中的日期。+1是因为它以0开头
对于($i=$calYear;$i<$selYear;$i++){
$days-=(date('z',mktime(0,0,0,12,31,$i))+1)%28;//从开始日起移除28天的模,每年的日期都较低
}
如果($天<0){
$days+=28;//如果我们将以小于0的值结束,只需添加4周
}
$calStart->setDate($selYear,1,$days);
}
很高兴看到有人使用PHP的DatePeriod类。它经常被忽视。谢谢——我同意。我认为这是非常棒的,而且你确实没有那么经常遇到它。:)我不明白这个问题。“只从第一个间隔日期开始”-“只”是什么意思?第一个间隔日期是什么,考虑到不合格的间隔没有日期,也没有日期?目前,这给了我从$calStart到所选年份12月31日的所有间隔日期(每4周一次),但我只需要所选年份1月1日到12月31日的间隔日期。嗯,如果不希望句点从$calStart
开始,请不要将$calStart
作为第一个参数传递给构造函数!谢谢你,约翰!2015-01-16是我在2015年间隔的第一天。你可以在$calStart上增加4周,直到2015年。明白了。让我发布另一个可能更适合您的答案。@user2571510 hsz发布了一个很好的方法。我会用他们的答案作为你的答案。谢谢!你能解释一下吗?我不再需要DateInterval和DatePeriod了吗?@user2571510对不起,我正在使用更复杂的解决方案。查看我的编辑。
$calStart = new \DateTime('2014-01-17');
$calYear = (int) $calStart->format('Y');
if ($selYear !== $calYear) {
$days = (int) $calStart->format('z') + 1; // get day in a year. +1 is because it starts with 0
for ($i = $calYear; $i < $selYear; $i++) {
$days -= (date('z', mktime(0,0,0,12,31,$i)) + 1) % 28; // remove from start day a modulo of 28 days, every year the date is lower
}
if ($days < 0) {
$days += 28; // if we will finish with value under 0, just add 4 weeks
}
$calStart->setDate($selYear, 1, $days);
}