はじめに
こんばんは。
1月は体調不良のツケでめっちゃ忙しく、2月は契約の切れ目で更に忙しく、ヘロヘロの僕です。
運悪く3〜4件くらいの案件がかぶってしまって、てんやわんやしております。
どれもPHP案件ですが、日付を扱うときに datetime
だったり carbon
だったり chronos
だったりを使っていてこんがらがってきます。
carbon
と chronos
はそんな変わんないんですけど、、、
というわけでよく使うやつを備忘録として少しだけまとめてました。
本題
format
DateTime |
Carbon |
Chronos |
format('Y-m-d') |
format('Y-m-d') |
format('Y-m-d') |
一月前
DateTime |
Carbon |
Chronos |
subMonthNoOverflowByDateTime(自作関数) |
subMonthNoOverflow() |
subMonth() |
function subMonthNoOverflowByDateTime(\DateTimeImmutable $dateTimeImmutable) {
$day = (int)$dateTimeImmutable->format('j');
$targetDate = $dateTimeImmutable->modify("-1 month");
if ($day !== (int)$targetDate->format('j')) {
$targetDate = $targetDate->modify('last day of last month');
}
return $targetDate;
}
一月後
DateTime |
Carbon |
Chronos |
addMonthNoOverflowByDateTime(自作関数) |
addMonthNoOverflow() |
addMonth() |
function addMonthNoOverflowByDateTime(\DateTimeImmutable $dateTimeImmutable) {
$day = (int)$dateTimeImmutable->format('j');
$targetDate = $dateTimeImmutable->modify("+1 month");
if ($day !== (int)$targetDate->format('j')) {
$targetDate = $targetDate->modify('last day of last month');
}
return $targetDate;
}
先月頭
DateTime |
Carbon |
Chronos |
modify('first day of last month') |
subMonthNoOverflow()->firstOfMonth() |
subMonth()->firstOfMonth() |
来月頭
DateTime |
Carbon |
Chronos |
modify('first day of next month') |
addMonthNoOverflow()->firstOfMonth() |
addMonth()->firstOfMonth() |
先月末
DateTime |
Carbon |
Chronos |
modify('last day of last month') |
subMonthNoOverflow()->lastOfMonth() |
subMonth()->lastOfMonth() |
来月末
DateTime |
Carbon |
Chronos |
modify('last day of next month') |
addMonthNoOverflow()->lastOfMonth() |
addMonth()->lastOfMonth() |
同じかどうかの比較
DateTime |
Carbon |
Chronos |
$date === $date |
eq() |
eq() |
違うかどうかの比較
DateTime |
Carbon |
Chronos |
$date !== $date |
ne() |
ne() |
比較(>=)
DateTime |
Carbon |
Chronos |
$date >= $date |
gte() |
gte() |
比較(<=)
DateTime |
Carbon |
Chronos |
$date <= $date |
lte() |
lte() |
土日かどうか
DateTime |
Carbon |
Chronos |
in_array((int)$dateByWeekEnd->format('w'), [0, 6], true) |
isWeekend() |
isWeekend() |
終わりに
オーバーフローするかどうかで処理は変わりますが、今ん所オーバーフローする処理しか書いたことないのでこれで備忘録とっておきます。
来月も干からびるほどに忙しいけど、がんばります...