8

見出しにあるように、PHP の date("W") 関数は (現在の日付の) 暦週を返します。残念ながら、ほとんどの年の最初の日に 52 または 53 が返されます。これは、単純な考え方では正しいのですが、2012 年 1 月 1 日は暦週 52 ではなく、今年の暦週ではないため、非常に厄介です。ほとんどのカレンダーでは、これを前年の第 0 週または第 52 週と定義しています。

1 年の各日を暦週でグループ化する場合、これは非常に注意が必要です。2012 年 1 月 1 日と 2012 年 12 月 31 日は両方とも同じ暦週グループに入れられます。

私の質問は次のとおりです。PHPの date("W") に代わる(ネイティブの)年に敏感な代替手段はありますか?

編集:私はこの質問の最初のバージョンを非常に不明瞭な方法で書いたと思うので、これが私の編集です:年の最初の日の正しい暦週を返す関数を探しています。PHP の date("W") は 2012 年 1 月 1 日に 52 を返しますが、これは「間違っています」。0 または null にする必要があります。公式の情報源によると、年の最初の暦週はその年の最初の月曜日に始まります。したがって、年の最初の日が月曜日でない場合、それは週 1 ではありません。0週目です。ウィキペディアの記事によると

1 月 1 日が月曜日、火曜日、水曜日、または木曜日の場合は 01 週目です。1 月 1 日が金曜日、土曜日、または日曜日の場合は、前年の 52 週目または 53 週目です。

年の最後の日も 52/53 週にあるため、これは注意が必要です。date("W") は、今年と前年に分割されません。

4

3 に答える 3

11

このソリューションは、12 月の超過分を 53 週に変換し、1 月の 1 週より前のすべてを 0 週に変換します。

$w=(int)date('W');
$m=(int)date('n');
$w=$w==1?($m==12?53:1):($w>=51?($m==1?0:$w):$w);

echo "week $w in ".date('Y');

2013-12-31 ==> 2013 年第 53 週

2014-01-01 ==> 2014 年第 1 週

2015-12-31 ==> 2015 年第 52 週

2016-01-01 ==> 2016 年第 0 週

そして、小さなテストランなので、自分の目で確かめてください;-)

$id=array(25,26,27,28,29,30,31,1,2,3,4,5,6,7,8);        
for($iy=2013;$iy<2067;++$iy){foreach($id as $k=>$v){if($k<7){$im=12;}else{$im=1;}
if($k==7){++$iy;echo '====<br>';}$tme=strtotime("$im/$v/$iy");
echo date('d-m-Y',$tme),'  * *  ';
//THE ACTUAL CODE =================
    $w=(int)date('W',$tme);
    $m=(int)date('n',$tme);
    $w=$w==1?($m==12?53:1):($w>=51?($m==1?0:$w):$w);
//THE ACTUAL CODE =================
echo '<b>WEEK: ',$w,' --- ','YEAR: ',date('Y',$tme),'</b><br>';}--$iy;
echo '----------------------------------<br>';}
于 2013-12-30T16:42:43.267 に答える
2

PHP の date("W") に代わる (ネイティブの) 年に敏感な代替手段はありますか?

いいえ、ありません。

公式の情報源によると、年の最初の暦週はその年の最初の月曜日に始まります。

あなたが言及している公式情報源がわかりません。

PHPdate("W")は、ISO 8601 に従って週番号を返します。国際標準として、ISO 8601 はおそらく多くの「公式ソース」の 1 つとして数えられます。週番号の定義がアプリケーションに合わない場合は、他の好きなものを自由に使用できます。

「年の最初の週」の非標準的な定義を使用する場合、または広く認識されていない公式ソースを使用する場合は、独自の関数を記述してdate("W"). (関数を書く必要があると確信しています。)

2012 年 1 月 1 日は日曜日でした。ISO 8601、ウィキペディア、および php は、2012 年 1 月 1 日の ISO 週番号が 52 であることに同意しています。

ISO 8601 では週 0 は定義されていません。

したがって、年の最初の日が月曜日でない場合、それは週 1 ではありません。

ISOもWikipediaもそうは言っていません。ISO 8601 では、週番号 1 をその年の最初の木曜日を含む週として定義しています。2012 年の最初の木曜日は 1 月 5 日だったので、週番号 1 は 1 月 2 日から 1 月 8 日まででした。

何か違うものが必要な場合は、算術、除算などで遊ぶことができます。(たとえば、date("z") を 7 で割ってみてください。) または、そのデータをデータベースに保存して、週を好きなように設定することもできます。

会計期間を扱っている場合は、ほぼ確実にそのデータをデータベースのテーブルに格納します。この種のデータは、スプレッドシートを使用して簡単に生成できます。

テーブル内のデータのテキストは、その関数がどれほど単純であっても、php 関数のテキストよりも監査がはるかに簡単です。また、データがどの言語で記述されていても、データにアクセスするすべてのプログラムでデータが同じであることは確実です。週番号を取得するために 5 つの異なる関数を維持します。)

于 2012-08-01T16:06:13.493 に答える
1
$d = new DateTime('first monday january '.date('Y'));
echo $d->format("W");
于 2012-07-26T13:57:49.267 に答える