人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

phpで1月1日からカウントして現在の週番号(第何周か、2月の第三週目だと4+3で7週目)を習得するアルゴリズムをphpで書いて下さい。


●質問者: kichitaka
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● a-kuma3
●50ポイント

色々とやり方はありそうですが、例えばこんな感じ。
日曜日を週の始まりとしてます。

<?php
 /*
 その年の第何週かを求める
 */
 function get_nth_week($d) {
 // その年の 1月1日
 $d0 = new DateTime($d->format('Y') . '-1-1');

 // 1月1日の週の日曜日にする
 $d0->sub(new DateInterval('P' . $d0->format('w') . 'D'));

 // 1月1日の週の日曜日から、何週間離れているか
 $diff = ($d->getTimestamp() - $d0->getTimestamp()) / 60 / 60 / 24 / 7;

 // 整数化
 $diff = floor($diff);

 // ゼロ始まりなので、+1 して返す
 return $diff + 1;
 }


 // 確認(その1)
 $d = new DateTime('now');
 $w = get_nth_week($d);
 echo $d->format(DateTime::ATOM) . ' ' . $w . "\n";

 // 確認(その2):バレンタインデー
 $d = new DateTime('2014-2-14');
 $w = get_nth_week($d);
 echo $d->format(DateTime::ATOM) . ' ' . $w . "\n";

 // 確認(その3):去年
 $d = new DateTime('2013-2-14');
 $w = get_nth_week($d);
 echo $d->format(DateTime::ATOM) . ' ' . $w . "\n";

?>


ideone.com で確認した結果が、こちら。
http://ideone.com/LZffph

# 「W ISO-8601 月曜日に始まる年単位の週番号 (PHP 4.1.0 で追加)」を
# 知らなかったのは、内緒だ :-)


ぽけっとしすてむさんのコメント
>#「W ISO-8601 月曜日に始まる年単位の週番号 (PHP 4.1.0 で追加)」 「(仕様として正しいが)一定の条件で53週目が第1週になってしまう」と、気になる場合は http://ryo511.blog.jp/archives/35475838.html このような方法もあるようです。 #多分これで解決できるかと思います:)

2 ● snow0214
●50ポイント

PHPのDateTime型は西暦2038年1月20日以降または西暦10000年以降が正常に計算されません。(環境に左右されます)
そこで、西暦(グレゴリオ暦)なら何年であっても計算できるプログラムを作ってみました。曜日を計算するのにツェラーの公式を使っています。
週のはじまりは月曜日としてカウントしていますが、途中のコメントを外すと日曜日はじまりでカウントします。

<?php
//ツェラーの公式
function zeller($y, $m, $d) {
 if ($m <= 2) {
 $m += 12;
 $y--;
 }
 $c = (int)($y / 100);
 $y2 = $y % 100;
 return ($d + (int)(26 * ($m + 1) / 10) + $y2 + (int)($y2 / 4) - 2 * $c + (int)($c / 4)) % 7;
}

//うるう年かどうか
function isleap($y) {
 if ($y % 400 == 0) return TRUE;
 if ($y % 100 == 0) return FALSE;
 if ($y % 4 == 0) return TRUE;
 return FALSE;
}

//月の日数
function month_days($y, $m) {
 $tbl = array(0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
 $tbl[2] = isleap($y) ? 29 : 28;
 return $tbl[$m];
}

//何週か
function num_week($y, $m, $d) {
 $dd = 0;
 $i = 1;
 while ($i < $m) {
 $dd += month_days($y, $m);
 $i++;
 }
 $w = zeller($y, $m, 1);
 $w--;
// $w--; //日曜日スタートなら追加
 if ($w < 0) $w += 7;
 $dd = $dd + $d + $w - 1;
 return (int)($dd / 7) + 1;
}

echo num_week(2014, 6, 19);
?>
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ