Help us understand the problem. What is going on with this article?

現在の日付から週末、月末を計算するヘルパーを作成

はじめに

Laravelで自作アプリ(タスク管理アプリ)を開発する中で、現在日付から今週末、今月末の日付を計算する必要が出てきたので、ヘルパー関数として実装してみました。

関数を作成

\$date_typeを引数とし、引数によって返す日付を変えています。
1 :現在の日付
2 :週末(日曜日)
3 :月末

1, 3については割合簡単に実装できましたが、2は少しややこしいことになっています。

helpers.php
<?php

// 引数$date_typeから現在の日付/週末/月末の値を返す。
// $date_type = 1 :現在の日付
//              2 :週末(日曜日)
//              3 :月末
function limit_date(int $date_type) {
    $now = new DateTimeImmutable(); // 現在の日付
    switch ($date_type) {
        case 1: // 現在の日付
            return (string)$now->format('Y/m/d');
            break;
        case 2: // 週末(日曜日)
            return (string)next_weekend($now)->format('Y/m/d');
            break;
        case 3: // 月末
            return (string)$now->format('Y/m/t');
            break;
        default:
            return "ERROR_DATE_TYPE";
    }
}

// 日付から次の週末(日曜日)を返す関数
// 日付の曜日が日曜日の場合、現在の日付を返す。
function next_weekend(DateTimeImmutable $now) {
    $w = (int)$now->format('w');        // 日~土を0~6として返す。
    // 月~土の場合6~1に変換。
    if ( $w != 0 ) {
        $w = 7 - $w;
    }
    $weekend = $now->add(new DateInterval('P' . ($w)  . 'D'));
    return $weekend;
}

概要

初めに現在時刻を持つDateTimeImmutableオブジェクトを生成しています。

$now = new DateTimeImmutable()

日付に関するクラスはDateTimeなど他にもありましたが、参考記事によればDateTimeImmutableクラスを使うのが良いらしいです。

参考:
https://qiita.com/ndxbn/items/55a9bb057da954be322c

その後、DateTimeImmutableクラスのformatメソッドで日付情報をreturnしています。その際、string型にキャストしています。

return (string)$now->format('Y/m/d');

もしかしたら必要ないかもしれませんが、自分がC出身なのもあり、良く分からないオブジェクトをそのまま返すより、型は指定してやった方が安心します。

実装

Laravelのヘルパーとして、composerを利用した方法で実装しました。

まずcomposer.json内の"autoload"オブジェクトに"files"配列を追加します。内容はヘルパー関数を書いたファイルのアドレスです。今回はapp/helpers。
(jsonのオブジェクトと配列の違いがイマイチ分かってない)

composer.json
~~~~~~~~~~
    "autoload": {
        "psr-4": {
            "App\\": "app/"
        },
        "classmap": [
            "database/seeds",
            "database/factories"
        ],
        "files": [ 
            "app/helpers.php"
        ]
    },
~~~~~~~~~~

その後、ターミナルで以下のコマンドを実行します。

composer dump-autoload

実行後、アプリケーション内で自作のヘルパー関数が利用可能になっています。
コマンドにより内部でどういう処理がされているかが良く分かりませんでしたが、メッセージを見る限りヘルパーファイルをライブラリにリンクしてるんでしょうか。
教えてエロい人

参考:
https://qiita.com/kazuhei/items/40d08b7356de8af5f427

ソースのミソについて

串カツに合いそう

ではなく、個人的にハマった部分、面白いと思った部分についてです。
まずはこちら。

return (string)$now->format('Y/m/t');

formatメソッドの引数に'Y/m/t'と入力することで、月末の日付を出力できます。
php公式ドキュメントによれば、tは「指定した月の日数」を示すそうです。
おかげで閏年を考慮せずに月末の日付を出力できました。

一方で困ったのは週末の日付を取り出す部分。
曜日についてはformatメソッドの引数に'w'を設定することで取り出せます。

(int)$now->format('w');

format('w')の出力は日曜日~土曜日に対し0~6が出力されるので、現在の日付に(7 - format('w') )の日を加えた日付が今週末日付となります。
日曜日の場合は丸1週間先を示すので少し不自然。というわけで専用に関数を作成して出力を調整しています。
これで日曜日の場合は現在日付と同日を返すようになりました。

参考:
https://php-archive.net/php/php-weekend/

('w')

かわいい

Shaxon1075
関西でカタカタやってるクソザコエンジニア。 WEB系企業に転職しようとしたのになぜかSESで一人常駐やってる土方作業員。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away