3

I'm trying to write a bit of php to determine the date (Y-m-d format) for the next occurrence of a given weekday.

date('Y-m-d', strtotime('next monday'));

is returning

2011-08-29

instead of

2011-08-22

on my server. Not sure why. My server is an EC2 instance in Amazon's US East-Coast data center and it's currently 2011-08-21 9:40:00.

EDIT 1 Also date('Y-m-d', strtotime('next sunday')); returns 2011-08-28 instead of today. I tried out this code on http://writecodeonline.com/php/ ... beginning to think that tester is inaccurate.

4

4 に答える 4

2

サーバーが特定のタイムゾーンに設定されているからといって、必ずしも PHP が同じタイムゾーンで動作するとは限りません。ヨーロッパではすでに 2011 年 8 月 22 日の月曜日であり、UTC も含まれています。PHP がこのタイムゾーンで動作している場合、「次の月曜日」8 月 29 日になります。

PHP のタイムゾーン設定を再確認する必要があります。実行date_default_timezone_get()して、インストールで使用されている設定を確認するか、期待するタイムゾーンを使用するように PHP スクリプトを強制して、期待date_default_timezone_set("America/New_York");する結果が得られるかどうかを確認してください。

私はこれをテストしました:

date_default_timezone_set("America/New York");
echo date('Y-m-d', strtotime('next monday')); // prints 2011-08-22
date_default_timezone_set("UTC");
echo date('Y-m-d', strtotime('next monday')); // prints 2011-08-29
于 2011-08-22T01:48:29.207 に答える
0

月曜日が過ぎていないので、 strtotime はそれを次の月曜日と見なすため、これは予想される動作だと思います。

于 2011-08-22T01:47:33.520 に答える
0

どのバージョンの PHP を使用していますか? PHP の一部のバージョンでstrtotimeは、動作にバグがあります。

私はstrtotimeマニュアルページでそれを見つけました:

5.0.2 PHP 5 から 5.0.2 まででは、「現在」およびその他の相対時刻が、今日の午前 0 時から誤って計算されます。これは、現在の時刻から正しく計算される他のバージョンとは異なります。

5.0.0 マイクロ秒が許可されるようになりましたが、無視されます。

4.4.0 4.4.0 より前のバージョンの PHP では、"next" が誤って +2 として計算されます。これに対する一般的な解決策は、「+1」を使用することです。

説明されている動作は、バージョンが5.0から5.0.2であることを示唆しています。

今日と計算された「次の月曜日」の差が 7 日よりも大きいかどうかを確認することをお勧めします。そうであれば、7 日を引くと実際の日付が得られます。

そのコードを使用してみてください:

$days = ((strtotime('next monday') - time()) / 60 / 60 / 24);
if ($days >= 8) {
  $days -= 7;
}

date_diff関数があることは知っていますが、PHP のバージョンが私が思うほど低い場合は利用できません (申し訳ありませんが、5.3.0 以降のみです)。

于 2011-08-22T01:46:07.360 に答える
0

「次」は、平日で使用される場合、通常、次に近い曜日の次の曜日を意味します。たとえば、今日が 21 日の日曜日の場合、「次の」月曜日は明日の 22 日ではなく、次の 29 日の月曜日になります。

これは必ずしも直感的ではなく、普遍的に認識されているわけではありませんが、それがstrtotime()「次」を解釈する方法であると信じています.

編集: 私自身のテストで、私が間違っていること、および「次の」は最初の次の平日 (上記の例では 22 日) を返す必要があることを確認しました。この回答は編集せずにここに残します。以下のコメントは他の人に役立つ可能性があります。

于 2011-08-22T03:22:01.287 に答える