1

私は PHP を使用してカレンダーを作成していますが、この方法では、2 回書き込まれる日もあります。

この小さなスクリプトで動作を複製しました。

<?php
//
// define a date to start from
//
$d = 26;
$m = 10;
$y = 2013;
date_default_timezone_set('CET');
$time = mktime(0, 0, 0, $m, $d, $y);

//
// calculate 10 years
//
for($i=0;$i<3650;$i++){ 
  $tomorrowTime = $time + (60 * 60 * 24);

  //
  // echo date if the next day has the same date('d') result
  //
  if(date('d',$time)==date('d',$tomorrowTime)){
    echo date('d-m-Y',$time)." was calculated twice... \n";
  }

  $time = $tomorrowTime;
}

?>

これは私が得るものです:

27-10-2013 was calculated twice... 
26-10-2014 was calculated twice... 
25-10-2015 was calculated twice... 
30-10-2016 was calculated twice... 
29-10-2017 was calculated twice... 
28-10-2018 was calculated twice... 
27-10-2019 was calculated twice... 
25-10-2020 was calculated twice... 
31-10-2021 was calculated twice... 
30-10-2022 was calculated twice... 

$timeとして定義すると0 (unix epoch)、同じ動作が得られません。を使用すると何か問題がありmktime()ますか? それとも11月は気まずいだけですか?

乾杯、ジェローン

4

3 に答える 3

2

当然のことながら、これらはうるう秒です。すべての日が 86400 秒かかるわけではありません。

これらの計算には午前 12 時ではなく、午後 12 時を使用してください。それは大いに役立ちます。

とはいえ、日付計算にはもっと良い方法があります。ただし、午後 12 時の計算は、UTC タイムゾーン (または CET) では問題なく機能します。

于 2012-12-26T13:40:46.733 に答える
2

このステートメントは、うるう秒などに対してより適切に保護する必要があります。

$tomorrowTime = strtotime('+1 days', $time);
于 2012-12-26T13:45:04.513 に答える
1

時間を計算するために秒を追加しないのはまさにそのためです。DST とうるう秒により、1 日に正確な秒数が常にあるとは限りません。正しい計算に60 * 60 * 24使用できます。mktime

for ($i = 0; $i < 3650; $i++) { 
    $time = mktime(0, 0, 0, $m, $d + $i, $y);
    //                          ^^^^^^^

    ...
}
于 2012-12-26T13:43:48.960 に答える