-2

日付に 3 日と 4 日を追加しようとしました。問題は、両方のケースで date() が同じ日付を返すことです。なんで?

$intTime = strtotime('2012-10-25')+(3*86400);
date('Y-m-d', $intTime );

$intTime = strtotime('2012-10-25')+(4*86400);
date('Y-m-d', $intTime );

2012-10-28 を返します

PHP 5.2.6-1

タイムゾーン: ヨーロッパ/ワルシャワ、PHP: 5.2.17

しかし

$intTime = strtotime('2012-10-25 +3 days'); 
echo date('Y-m-d', $intTime );

$intTime = strtotime('2012-10-25 +4 days'); 
echo date('Y-m-d', $intTime );

有効な日付を返します。

4

5 に答える 5

2

1日の追加には別の方法を使用することをお勧めします - これは理解しやすいです:

$time = strtotime('+3 day',strtotime('2012-10-25'));
$data = date('Y-m-d', $time);

ただし、Michael Berkowski が述べたように、上記が夏時間を考慮に入れるかどうかはわかりません。

于 2012-10-25T13:11:03.227 に答える
2

いいえ、これは PHP のバグではありません。夏時間に違反しています。

使用して作成している日付strtotime()は時刻を指定しないため、デフォルトは午前 0 時 (つまり 00:00:00) です。

タイムスタンプに 24 時間を追加すると、通常は翌日の同じ時刻になります。ただし、今週末は一部の国でサマータイムが終了するため、その特定の日は 1 時間長くなります。したがって、24 時間を追加すると、同じ日の 23h00 にマップされるタイムスタンプになります。

これが、この奇妙な効果を得ている理由です。

解決策は次のとおりです。

  1. システムを現地時間ではなく、UCT 時間でのみ動作させます。UCT にはサマータイムがないため、この影響を受けません。時刻をローカル形式で入力または出力する必要がある場合は、他の処理を行う前に変換してください。PHP.ini ファイルで、またはdate_default_timezone_set()関数を使用して、システムを UCT に設定できます。

  2. 古いスタイルの日付関数の代わりにPHP のDateTimeクラスを使用します。このクラスはデフォルトで UCT で機能し、date_add()この問題全体を完全に回避して日数を指定できるメソッドが含まれています。(このクラスには、古いスタイルの関数よりもはるかに優れた使いやすい他の多くの優れた機能もあります)。
    **注:DateTime::add()メソッドは PHP 5.3 以降でのみ使用できます。もしあなたが 5.2 で立ち往生しているなら、それを使うことはできません (しかし、もしそうなら、私はあなたがアップグレードすることを強くお勧めします。あなたはひどく時代遅れです)

それが役立つことを願っています。

于 2012-10-25T13:11:46.533 に答える
0

タイムゾーン、日付、DST、ムーンフェイズ、およびその朝黒猫を見たかどうかによっては、両方のタイムスタンプが同じ日に、一方が早朝で、もう一方が深夜になる場合があります。1 日の長さが常に 86400 秒というわけではありません。

適切な日付/時刻処理関数を使用してください。構文strtotimeを使用して時間を追加したり、いくつかの関連する数学を使用して新しいタイムスタンプを作成したりするために使用できますが、クラスはタイムスタンプを操作するための最も堅牢で用途の広い方法です。+3 daysmktimeDateTime

于 2012-10-25T13:12:04.087 に答える
0

通常、これは、これらの日付に夏時間が適用されるタイムゾーンにいる場合に発生します。86400その場合、 1 日は 86400 秒ではなくなるため、加算は誤りです。

日付生成を次のように変更してみてください。

$intTime = strtotime('2012-10-25 +3 days');
于 2012-10-25T13:12:49.427 に答える
0

追加してみてください:

date_default_timezone_set('UTC');
于 2012-10-25T13:12:55.303 に答える