1

看代码就知道是什么问题了?

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

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 次

10 月(31 日)历史上写过 2 次画到 10 月 30 日结束:(

27.09.2012

28.09.2012

...

26.10.2012

27.10.2012

[[2012 年 10 月 28 日]]

[[2012 年 10 月 28 日]]

29.10.2012

30.10.2012

4

4 回答 4

2
  1. 您的问题是因为您已将时间设置为 00:00:00,将其设置为 12:00:00。那是因为夏令时
  2. 停止使用 date() 函数,使用Date 和 Time类。

解决方案(PHP >= 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";
}
于 2012-09-26T20:26:36.407 回答
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);
}
于 2012-09-26T20:32:29.217 回答
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 天)

编辑:对不起,我在错误的地方增加了。

于 2012-09-26T20:39:31.627 回答
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>";
}

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

于 2012-09-26T20:41:53.673 回答