两天之间的PHP日期列表

时间:2012-09-26 20:18:17

标签: php list days

通过查看代码,您知道问题是什么吗?

如果你帮助我,我会很高兴:

list($from_day,$from_month,$from_year)    = explode(".","27.09.2012");
list($until_day,$until_month,$until_year) = explode(".","31.10.2012");

$iDateFrom = mktime(0,0,0,$from_month,$from_day,$from_year);
$iDateTo   = mktime(0,0,0,$until_month,$until_day,$until_year);

while ($iDateFrom <= $iDateTo) {
    print date('d.m.Y',$iDateFrom)."<br><br>";
    $iDateFrom += 86400; 
}

2次写同样问题的日期

十月(31)历史上写了2次,10月30日结束:(

2012年9月27日

2012年9月28日

...

2012年10月26日

2012年10月27日

[[2012年10月28日]]

[[2012年10月28日]]

2012年10月29日

二○一二年十月三十零日

4 个答案:

答案 0 :(得分:2)

  1. 您的问题是因为您已将时间设置为00:00:00,将其设置为12:00:00。那是因为Daylight saving time
  2. 停止使用date()函数,使用Date and Time类。
  3. 解决方案(PHP&gt; = 5.4):

    $p = new DatePeriod(
        new DateTime('2012-09-27'),
        new DateInterval('P1D'),
        (new DateTime('2012-10-31'))->modify('+1 day')
    );
    foreach ($p as $d) {
        echo $d->format('d.m.Y') . "\n";
    }
    

    解决方案(PHP <5.4)

    $end = new DateTime('2012-10-31');
    $end->modify('+1 day');
    $p = new DatePeriod(
        new DateTime('2012-09-27'),
        new DateInterval('P1D'),
        $end
    );
    foreach ($p as $d) {
        echo $d->format('d.m.Y') . "\n";
    }
    

答案 1 :(得分:1)

您有夏令时问题。从一个时间戳添加到另一个时间戳的秒数很容易出现这些边缘条件的问题(闰日可能有问题),你应该养成使用PHP的DateTime和DateInterval对象的习惯。它使日期工作变得轻而易举。

$start_date = new DateTime('2012-09-27');
$end_date = new DateTime('2012-10-31');
$current_date = clone $start_date;
$date_interval = new DateInterval('P1D');

while ($current_date < $end_date) {
    // your logic here

    $current_date->add($date_interval);
}

答案 2 :(得分:0)

我不知道你来自哪里,但很可能你的时区正在进行夏令时转换(我住的是11月4日 - 正好是10月28日之后的一周)。你不能完全依赖86400秒的一天。

如果你使用mktime循环递增,你应该没问题:

list($from_day,$from_month,$from_year)    = explode(".","27.09.2012");
list($until_day,$until_month,$until_year) = explode(".","31.10.2012");

$iDateFrom = mktime(0,0,0,$from_month,$from_day,$from_year);
$iDateTo   = mktime(0,0,0,$until_month,$until_day,$until_year);

while ($iDateFrom <= $iDateTo)
{
    print date('d.m.Y',$iDateFrom)."<br><br>";
    $from_day = $from_day + 1;
    $iDateFrom = mktime(0,0,0,$from_month,$from_day,$from_year);
}

即使$from_day可能会超过31,mktime也会为您进行数学转换。 (即31个月中的32天=下个月的第1天)

编辑:抱歉,我在错误的位置增加了。

答案 3 :(得分:0)

我解决这个问题的想法是这样的;

$firstDate = "27.09.2012";
$secondDate = "31.10.2012";

$daysDifference = (strtotime($secondDate) - strtotime($firstDate)) / (60 * 60 * 24);
$daysDifference = round($daysDifference);

for ($i = 0; $i <= $daysDifference; $i++)
{
    echo date("d.m.Y", strtotime('+'.$i.' day', strtotime($firstDate))) . "<BR>";
}

这应该可以解决您的问题并且更容易阅读(imho)。我刚刚测试了代码,它输出所有日期,没有双打。它还可以避免所有夏令时的不一致。