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日締め切り(

2012.09.27

2012.09.28

...

2012.10.26

2012.10.27

[[2012.10.28]]

[[2012.10.28]]

2012.10.29

2012.10.30

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 日のちょうど 1 週間後です)。1 日の長さが正確に 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_day31 をはるかに超える可能性がありますが、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>";
}

これで問題が解決し、読みやすくなります(imho)。コードをテストしたところ、すべての日付が出力され、double は出力されません。また、すべての夏時間の不一致からあなたを救います。

于 2012-09-26T20:41:53.673 に答える