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

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2014/06/19 13:58:13
  • 終了:2014/06/26 14:00:09

回答(2件)

id:a-kuma3 No.1

a-kuma3回答回数4557ベストアンサー獲得回数19032014/06/19 14:38:02

ポイント50pt

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

<?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 で追加)」を
# 知らなかったのは、内緒だ :-)

id:psne

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

#多分これで解決できるかと思います:)

2014/06/19 14:42:12
id:snow0214 No.2

snow0214回答回数470ベストアンサー獲得回数1162014/06/19 21:40:05

ポイント50pt

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

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません