ユーティリティ系の操作でよく出てくる日付の頻出処理をまとめておこうかと思います。
PHPを例に取りますが、今であれば生成AIを使って他の言語で置き換えが可能になると思われます。
PHPだとCarbon使う人が多いかもですが、基本的な考えは変わらないかと。
DateTimeImmutableを使うのは、オブジェクトの変更を気にしてです。
通常のインスタンス生成
// タイムゾーンを設定(推奨)
date_default_timezone_set('Asia/Tokyo');
echo "=== 1. 通常のインスタンス作成 ===\n";
// DateTimeImmutableの使用を推奨(不変オブジェクト)
$day1 = new DateTimeImmutable();
var_dump($day1);
echo "\n=== 2. 一般的な形式からの取り込み ===\n";
// スラッシュ区切り
$day1 = new DateTimeImmutable('1980/05/13');
var_dump($day1);
// ハイフン区切り(ISO 8601形式推奨)
$day1 = new DateTimeImmutable('1980-05-13');
var_dump($day1);
// より明確なタイムゾーン指定
$day1 = new DateTimeImmutable('1980-05-13', new DateTimeZone('Asia/Tokyo'));
var_dump($day1);
年月日時分秒の設定
echo "\n=== 3. 年月日時分秒を独自に設定 ===\n";
$day1 = new DateTimeImmutable();
// DateTimeImmutableはメソッドチェーンで新しいオブジェクトを返す
$day1 = $day1->setDate(1980, 5, 13)->setTime(11, 55, 22);
var_dump($day1);
先週、先月、月末など
echo "\n=== 4. 先週・先月・月末などの設定 ===\n";
// 今月の最終日
$day1 = new DateTimeImmutable('last day of this month');
var_dump($day1);
// 先週の日曜日
$day1 = new DateTimeImmutable('last sunday');
var_dump($day1);
// 来月の最初の日
$day1 = new DateTimeImmutable('first day of next month');
var_dump($day1);
任意のフォーマットでの出力(タイムスタンプも)
echo "\n=== 5. 任意フォーマットへの出力 ===\n";
$day1 = new DateTimeImmutable();
echo "基本形式: " . $day1->format('Y-m-d H:i:s') . "\n";
echo "日本語形式: " . $day1->format('Y年m月d日 H時i分s秒') . "\n";
echo "曜日付き: " . $day1->format('Y-m-d (D)') . "\n";
// 個別要素の取得
echo "年: " . $day1->format('Y') . "\n";
echo "月: " . $day1->format('m') . "\n";
echo "日: " . $day1->format('d') . "\n";
echo "\n=== 6. タイムスタンプの出力 ===\n";
$day1 = new DateTimeImmutable('1980-05-13');
echo "Unix timestamp: " . $day1->getTimestamp() . "\n";
加算、減算
echo "\n=== 7. 加算・減算 ===\n";
$day1 = new DateTimeImmutable();
// modify メソッドを使用
$day1_modified = $day1->modify('+1 months');
echo "1ヶ月後: " . $day1_modified->format('Y-m-d H:i:s') . "\n";
// DateInterval を使用した加算
// P = Period, Y = Year, M = Month, D = Day, T = Time separator, H = Hour, M = Minute
$interval = new DateInterval('P1Y2M4DT6H8M'); // 1年2ヶ月4日6時間8分後
$day1_added = $day1->add($interval);
echo "1年2ヶ月4日6時間8分後: " . $day1_added->format('Y-m-d H:i:s') . "\n";
// 減算の例
$day1_subtracted = $day1->sub(new DateInterval('P1W')); // 1週間前
echo "1週間前: " . $day1_subtracted->format('Y-m-d H:i:s') . "\n";
差の判定
echo "\n=== 8. 差の判定 ===\n";
$day1 = new DateTimeImmutable('2011-11-10');
$day2 = new DateTimeImmutable('2011-11-15');
$diff = $day1->diff($day2);
var_dump($diff);
// フォーマット例
echo "日数の差: " . $diff->format('%R%a') . " 日\n";
echo "年月日で表示: " . $diff->format('%y年%m月%d日') . "\n";
echo "時間も含む: " . $diff->format('%R%a日 %H時間%I分') . "\n";
// 実用的な例
if ($diff->invert) {
echo "day1 の方が day2 より後の日付です\n";
} else {
echo "day1 の方が day2 より前の日付です\n";
}
echo "\n=== 9. 実用的な例 ===\n";
$now = new DateTimeImmutable();
$birthday = new DateTimeImmutable('1980-05-13');
// 年齢計算
$age = $birthday->diff($now);
echo "現在の年齢: " . $age->y . "歳\n";
// 次の誕生日
$nextBirthday = $birthday->setDate($now->format('Y'), 5, 13);
if ($nextBirthday < $now) {
$nextBirthday = $nextBirthday->modify('+1 year');
}
$daysUntilBirthday = $now->diff($nextBirthday);
echo "次の誕生日まで: " . $daysUntilBirthday->days . "日\n";