2010-12-05 3 views
10

strtotimeを使用して、指定された月の最初の水曜日を把握しようとしていますが、最初の水曜日が1日目に降りるたびに "最初の水曜日"strtotimeで月の最初の平日を取得

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

お知らせ何か:中

$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>"; 

結果:この問題のより一般的な説明のため

は、次のコードと結果を参照してください?月の1日と1週間の1日が一致してはいけませんか?しかし、それは決してしません。代わりに、8日には、その日の2番目のインスタンスが常に返されます。

誰でも説明がありますか?

答えて

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 
+0

確かに、これは動作します。理由を聞かないようにしましょう... – Yarin

+0

の場合、私にとっては、本当に興味があります.D –

+0

完全に動作していないようです。私は6月12日にこのソリューションを利用しています。私は '12/15/2014'を取得します。おそらくそれは現在の月の週に相対的ですか? – Webnet

5

それはちょうどあなたを書式設定が間違っています。

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")); 

版画:あなたはofを含める必要が

12/15/10 

ドキュメントに与えられたいくつかの例があります。

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

は、上記のドキュメントにノートの第2のブロックはofは、日付計算処理をどのように影響するかについて説明します。

はまた、「のことを観察します"の" ordinal space dayname space ''と 'last' space dayname space 'of' 'は 何か特別なことをします。

  1. は、それは別の日には進まない日の-月1
  2. 「『の』序DAYNAME」に設定します。 (例: 「2008年7月の第1火曜日」とは、 「2008-07-01」を意味します)。
  3. "ordinal dayname"は別の日に進みます。 (例:「最初の 火曜日は2008年7月です」とは、「2008-07-08」、 を意味します)。
  4. '' 'last' dayname 'of' 'は、現在の月の最後の曜日をとります。 (例:「2008年7月の最後の月」 は「2008-07-30」を意味します)
  5. 「last 'dayname」は、当日の最後の曜日をとります。 (例:「last wed July 2008」は 「2008-06-25」を意味し、「2008年7月」は現在の日付を「2008-07-01」および に最初に設定し、 に移動します水曜日は "2008-06-25")。回答をオフに構築
+1

'of'形式は、PHP> = 5.3でのみ動作し、5.2では失敗します。テスト結果については私の答えを参照してください。 – Yarin

+1

@ヤリン:まあまあです。 > = 5.3の日付処理は、以前のバージョンよりもはるかに信頼性が高いようです。非常に多くの潜在的な落とし穴があるのは残念です。 – Mike

10

、一つはPHP 5.2とPHP 5.3の間の相対的な日付フォーマットの違いを意識する必要があります。

TEST:

$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 

ためだけ番目eの3番目のメソッドは、PHP 5バージョン間で正しい結果を返します。

1

このマニュアルは、PHPマニュアルで見つかりました。

"5.2.7より前のPHP 5では、その平日がその月の最初の日であった月の特定の曜日を要求すると、誤って返されたタイムスタンプに1週間が追加されます。 5.2.7以降のバージョン。

0

PHPは5.5.11

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

私はなぜ知らないが、力のゼロ種類のstrtotimeパーサーは初日考慮月の初めに開始します。

関連する問題