11

を使用して特定の月の最初の水曜日を把握しようとしていstrtotimeますが、最初の水曜日がたまたま 1 日に当たると、「最初の水曜日」引数は失敗します。

この問題のより一般的な図については、次のコードと結果を参照してください。

$mon = strtotime("December 2010 first monday");
$tue = strtotime("December 2010 first tuesday");
$wed = strtotime("December 2010 first wednesday");
$thu = strtotime("December 2010 first thursday");
$fri = strtotime("December 2010 first friday");
$sat = strtotime("December 2010 first saturday");
$sun = strtotime("December 2010 first sunday");

echo strftime("%m/%d/%y", $mon) . "<br>";
echo strftime("%m/%d/%y", $tue) . "<br>";
echo strftime("%m/%d/%y", $wed) . "<br>";
echo strftime("%m/%d/%y", $thu) . "<br>";
echo strftime("%m/%d/%y", $fri) . "<br>";
echo strftime("%m/%d/%y", $sat) . "<br>";
echo strftime("%m/%d/%y", $sun) . "<br>";

結果:

12/06/10
12/07/10
12/08/10
12/02/10
12/03/10
12/04/10
12/05/10

何か気づきましたか?週の 1 日は月の 1 日と一致するべきではありませんか? しかし、そうではなく、その日の 2 番目のインスタンスである 8 日が常に返されます。

誰でもこれについて説明がありますか?

4

6 に答える 6

10

提供された回答から構築すると、php 5.2 と php 5.3 の間の相対的な日付形式の違いに注意する必要があります。

テスト:

$date1 = strtotime("first wednesday of 2010-12");
$date2 = strtotime("first wednesday 2010-12");
$date3 = strtotime("wednesday 2010-12");

5.2 結果:

1969-12-31
2010-12-08
2010-12-01

5.3 結果:

2010-12-01
2010-12-08
2010-12-01

したがって、3 番目の方法のみが、PHP 5 バージョン全体で正しい結果を返します。

于 2010-12-07T17:40:26.890 に答える
8

私も目がくらむので説明はありませんが、次のように「最初」を省略して正しい日付を取得する方法を見つけることができました。

$ php -r 'echo date("m/d/y", strtotime("December 2010 Wednesday"));'
12/01/10

$ php -r 'echo date("m/d/y", strtotime("December 2010 Thursday"));'
12/02/10

$ php -r 'echo date("m/d/y", strtotime("December 2010 Friday"));'
12/03/10

$ php -r 'echo date("m/d/y", strtotime("December 2010 Saturday"));'
12/04/10

$ php -r 'echo date("m/d/y", strtotime("December 2010 Sunday"));'
12/05/10

$ php -r 'echo date("m/d/y", strtotime("December 2010 Monday"));'
12/06/10

$ php -r 'echo date("m/d/y", strtotime("December 2010 Tuesday"));'
12/07/10
于 2010-12-05T05:37:55.013 に答える
5

間違っているのはあなたのフォーマットだけです。以下を含める必要がありますof

echo strftime("%m/%d/%y", strtotime("first Monday of December 2010"));
echo strftime("%m/%d/%y", strtotime("first Tuesday of December 2010"));
echo strftime("%m/%d/%y", strtotime("first Wednesday of December 2010"));
echo strftime("%m/%d/%y", strtotime("first Thursday of December 2010"));
echo strftime("%m/%d/%y", strtotime("first Friday of December 2010"));
echo strftime("%m/%d/%y", strtotime("first Saturday of December 2010"));
echo strftime("%m/%d/%y", strtotime("first Sunday of December 2010"));

版画:

12/06/10
12/07/10
12/01/10
12/02/10
12/03/10
12/04/10
12/05/10

受け入れられた解決策は機能しますが、2 番目の平日を見つけたい場合は問題が発生します。

echo strftime("%m/%d/%y", strtotime("December 2010 second Wednesday"));

版画:

12/15/10

ドキュメントにいくつかの例が示されています。

http://www.php.net/manual/en/datetime.formats.relative.php

上記のドキュメントの 2 番目のメモ ブロックはof、日付計算プロセスにどのように影響するかを説明しています。

また、「ordinal space dayname space 'of'」および「'last' space dayname space 'of'」の「of」が何か特別なことをしていることにも注意してください。

  1. 日を 1 に設定します。
  2. 「' の序数日名 '」 は、別の日に進みません。(例: 「2008 年 7 月の第 1 火曜日」は「2008 年 7 月 1 日」を意味します)。
  3. "ordinal dayname" は別の日に進みます。(例: 「2008 年 7 月第 1 火曜日」は「2008 年 7 月 8 日」を意味します。上記のリストのポイント 4 も参照してください)。
  4. "'last' dayname 'of' " は、現在の月の最後の dayname を取ります。(例: 「2008 年 7 月の最終水曜日」は「2008 年 7 月 30 日」を意味します)
  5. 「'last' dayname」は、現在の日付から最後の dayname を取ります。(例: "last wed July 2008" は "2008-06-25" を意味します。"july 2008" は最初に現在の日付を "2008-07-01" に設定し、次に "last wed" を前の水曜日である "2008" に移動します。 -06-25")。
于 2010-12-05T08:55:23.950 に答える
1

PHPマニュアルでこのメモを見つけました。

「5.2.7 より前の PHP 5 では、その月の特定の曜日がその月の最初の日である場合にその特定の出現をリクエストすると、返されるタイムスタンプに誤って 1 週間が追加されました。これは 5.2.7 で修正され、それ以降のバージョン。」

于 2011-03-08T04:04:50.150 に答える
0

PHP 5.5.11

$firstWeekdayOfMonth = new DateTime('first weekday 0 jun 2016');

理由はわかりませんが、最初の日を考慮して、月の初めに strtotime パーサーを強制的に開始するようなものです。

于 2016-08-25T19:31:44.810 に答える