ブログが続かないわけ

この日記のはてなブックマーク数
Webエンジニアが思うこと by junichiro on Facebook

[PHP]カレンダーの左上と右下の日付を取得する

このエントリーを含むはてなブックマーク hateb

カレンダーの左上と右下は、それぞれ前月と翌月の日付でうっすらと埋められているじゃないですか。あれ、表現しようと思うとなかなか面倒ですよね。というか、面倒でした。どこかにロジックが転がっているだろうと思いながらも、探す手間と書く手間を天秤にかけ、書くほうを選びました。

カレンダーの左上の日付を取得する。

function getCalendarStartDate($date = null, $format = 'Ymd') {
    if (!$date) $date = date('Ymd');
    return date(
        $format,
        strtotime(
            sprintf(
                "%d01 -%d days",
                date('Ym', strtotime($date)),
                date('w', strtotime(date('Ym', strtotime($date)).'01'))
            )
        )
    );
}

カレンダーの右下の日付を取得する。

function getCalendarEndDate($date = 
null, $format = 'Ymd') {
    if (!$date) $date = date('Ymd');
    return date(
        $format,
        strtotime(
            sprintf(
                "%d +%d days",
                date('Ymt', strtotime($date)),
                6 - date('w', strtotime(date('Ymt', strtotime($date))))
            )
        )
    );
}

strtotime とdate を使い過ぎなような気もしますが、パッと思いついたのはこの程度でしたし、とりあえず動いているので問題ないです。それにしても、strtotime の、'+2 days' とか '-3 days' とか '4 days ago' みたいな書式は便利ですよね。

[追記]コメントで教えて頂いたDateTime版

カレンダーの左上の日付を取得する。

public static function getCalendarStartDate($date = null, $format = 'Ymd') {
    if ($date instanceof DateTime === false) {
        $date = new DateTime($date);
    }

    $date->modify('first day of');
    if ($date->format('w')) {
        $date->modify('last sunday');
    }
    return $date->format($format);
}

カレンダーの右下の日付を取得する。

public static function getCalendarEndDate($date = null, $format = 'Ymd') {
    if ($date instanceof DateTime === false) {
        $date = new DateTime($date);
    }

    $date->modify('last day of');
    if ($date->format('w') != 6) {
        $date->modify('next saturday');
    }
    return $date->format($format);
}

こっちのほうが全然Cool じゃん!

この記事のトラックバックURL
http://en.yummy.stripper.jp/trackback/1418104
トラックバック
コメント
おいらは前にこんなの書きました。

https://gist.github.com/863507
| riaf | 2012/01/17 11:18 AM |
おいおい、やべーじゃん。
このあと、いろいろな解法がでてきてフルボッコされる流れじゃん!

DateTime つかうわ。
ありがと!
| junichiro | 2012/01/17 11:33 AM |









関連情報