こんにちは、せぃゆーです。
datetime型を登録するときに30分区切りで登録したいなんて時ないですか?
- 30分単位だけど入力欄が1分単位とか
- 前の作業の終了から次の作業の開始まで何分かかるかわからないけど30分単位にしたいとか
こんな機会があるかどうかわからないけど、なるほどと思ったの共有です。
実装方法
今回はPHなのでCarbonを利用します。
切り上げの場合
$separator_time = 30;
$date = new Carbon('2021-05-13 17:44:00');
$date->addMinutes($separator_time - $date->minute % $separator_time);
dd($date);
date: 2021-05-13 18:00:00.0 Asia/Tokyo (+09:00)
これだけです。
まず現在の時間(上では44)を区切りたい時間( separator_time = 30)で割った余りを取得します。
区切りたい時間 – (引く) 余りを加算することで30分区切りにすることが可能です。
44 % 30 = 14 (現在の時間 % 区切り時間 = 余り)
30 - 14 = 16 (区切り時間 - 余り = 何分足せばいいか)
44 + 16 = 00 (現在の分に時間を足す)
切り下げの場合
$separator_time = 30;
$date = new Carbon('2021-05-13 17:44:00');
$date->subMinutes($date->minute % $separator_time);
dd($date);
date: 2021-04-20 16:30:00.0 Asia/Tokyo (+09:00)
こちらの場合は
現在の時間を区切りたい時間( separator_time = 30 )で割った余りを取得します。
その値を引いてあげることで切り捨てになります。
44 % 30 = 14 (現在の時間 % 区切り時間 = 余り)
44 - 14 = 30 (現在の分から時間を引く)
まとめ
どうでしょう。言われてみれば簡単ですが、意外と自分では思いつかないです。
ちなみに30分区切りではなく10分区切りなどにする場合は $separator_time を変更するだけで可能です。
自分でこれを思いつけるほど頭が柔軟ではないみたいです。
ただコードが書けるだけで、効率のいいコードはまだまだ書けていなさそうなので
効率のいいコードを書けるようになりたいです。
コメント