タイムスタンプに日数を追加する 質問する

タイムスタンプに日数を追加する 質問する

開始日を指定して、7 日を 4 回追加し、それぞれちょうど 1 週間離れた 5 つの異なる日付を取得します。

//$date = '28-10-2010';
$timestamp = mktime( 0, 0, 0, 10, 01, 2010 );
echo "Date=".date( 'd-m-Y', $timestamp )."<br>";

$timestamp += (60*60*24*7);
echo "Date=".date( 'd-m-Y', $timestamp )."<br>";

$timestamp += (60*60*24*7);
echo "Date=".date( 'd-m-Y', $timestamp )."<br>";

$timestamp += (60*60*24*7);
echo "Date=".date( 'd-m-Y', $timestamp )."<br>";

$timestamp += (60*60*24*7);
echo "Date=".date( 'd-m-Y', $timestamp )."<br>";

コードの出力は次のようになります:

Date=01-10-2010 Friday
Date=08-10-2010 Friday
Date=15-10-2010 Friday
Date=22-10-2010 Friday
Date=29-10-2010 Friday

私が知る限り、それは正しい。しかし、2010-10-31と2010-11-01を調べると何が起こるか見てみましょう

$timestamp = mktime( 0, 0, 0, 10, 28, 2010 ); [...]

興味深いことに、次のように出力されます:

Date=28-10-2010 Thursday
Date=03-11-2010 Wednesday
Date=10-11-2010 Wednesday
Date=17-11-2010 Wednesday
Date=24-11-2010 Wednesday

何が起こっているのでしょうか? 2 番目の日付は 04-11-2010 のはずです。また、この「失敗」は 10 年ごとに発生することがわかりました。これは夏時間に関連するものでしょうか? そうであれば、どのように解決すればよいでしょうか? 見落としているものはありますか?

編集:さて、何が起こるかを確認するために時間を出力したところ、次のような結果になりました。

Date=28-10-2010 Thursday :: 00:00:00
Date=03-11-2010 Wednesday :: 23:00:00
Date=10-11-2010 Wednesday :: 23:00:00
Date=17-11-2010 Wednesday :: 23:00:00
Date=24-11-2010 Wednesday :: 23:00:00

どうやら時間に関係があるようです、2010-11-31 に何かが起こります...

ベストアンサー1

一度もない60*60*24*7 のような数式を使用して日数を加算/減算します (夏時間のため)。代わりにstrtotimeまたは を使用しますmktime

$timestamp = strtotime('+7 days', $timestamp);

// Or something like this (it's OK to have day parameter <= 0 or > 31)
$timestamp = mktime(0, 0, 0, $month, $day + 7, $year);

時間も出力すれば、例はより明確になります。

$timestamp = mktime(0, 0, 0, 10, 28, 2010);
echo date('Y-m-d H:i:s', $timestamp) . "\n";

$timestamp += 60*60*24*7;
echo date('Y-m-d H:i:s', $timestamp) . "\n";

出力:

2010-10-28 00:00:00
2010-11-03 23:00:00

ここでは、2010-11-03 23:00:00102010-11-04 00:00:00月31日が2524時間ではなく1時間長くなりました。

おすすめ記事