Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:定义间隔的开始日期_Php_Date_Datetime_Dateinterval - Fatal编程技术网

PHP:定义间隔的开始日期

PHP:定义间隔的开始日期,php,date,datetime,dateinterval,Php,Date,Datetime,Dateinterval,我使用以下几行计算PHP中的4周间隔。 这将使用固定日期($calStart)作为计算的基础,并以所选年份的最后一天($rangeEnd/$selYear)结束间隔,迄今为止效果良好 示例:如果所选年份为2015年,则我的范围内的第一个日期应为2015-01-16,作为所选年份的第一个间隔日期 这里有人能告诉我如何设置它,使$rangeDays仅从所选年份中的第一个间隔日期开始,而不是返回自$calStart日期以来的所有间隔(这是它目前所做的) 非常感谢你在这方面的帮助,蒂姆 如果您希望让$c

我使用以下几行计算PHP中的4周间隔。 这将使用固定日期(
$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);
}