- カテゴリ: helper
 - 掲載バージョン: Laravel 12・PHP 8.4
 - 名前空間 / FQCN / コマンド: 
now(): Illuminate\Support\Carbon(※ Date::use によりCarbonImmutableになる場合あり) - 関連: today / yesterday / tomorrow / Carbon::now / Date::now
 - 変更履歴: —
 
要点(TL;DR)
- アプリのタイムゾーンに基づく現在日時(
Carbon)を取得する now()->addDays(1)/now('UTC')->toIso8601String()- 罠:DBのタイムゾーンとの差/テストでの時間固定を忘れがち/
DB::raw('NOW()')と混用 
概要
now() はグローバルヘルパーで、アプリ設定(config('app.timezone'))に従った現在日時の Illuminate\Support\Carbon インスタンスを返します。チェーン操作(加算・比較・フォーマット)に向き、Blade/コントローラ/モデルのどこでも即利用できます。テストでは Date::setTestNow() で固定し、時間依存のロジックを安定化できます。
構文 / シグネチャ
function now(?DateTimeZone|string $tz = null): Illuminate\Support\Carbon /* or CarbonImmutable via Date::use */
- 引数(表) 引数 型 必須 既定値 説明 $tz `DateTimeZone string null` いいえ
 - 戻り値:
Illuminate\Support\Carbon(Date::use(CarbonImmutable::class)設定時はCarbonImmutable) - 例外/副作用:無効なタイムゾーン文字列で 
InvalidArgumentExceptionになり得る。アプリのタイムゾーン設定に依存。 
使用例
最小例
<?php
use Illuminate\Support\Facades\Route;
Route::get('/now', function () {
    // 例: "2025-09-06 20:15:03"
    return now()->toDateTimeString();
});
実務例
<?php
use App\Models\Session;
use Illuminate\Support\Facades\Date;
// 直近7日以内に作成されたレコードを取得
$recent = Session::where('created_at', '>=', now()->subDays(7))->get();
// 期限切れを一括無効化(UTCで比較したい場合)
$expired = Session::where('expires_at', '<=', now('UTC'))->update(['active' => false]);
// テスト時:時間を固定して確認
Date::setTestNow(now()->startOfDay()->addHours(9)); // 09:00固定(JSTの営業開始など)
よくある落とし穴・注意
- アプリTZとDB TZの不一致:
now()はアプリTZ。MySQLのNOW()やCURRENT_TIMESTAMPはサーバTZ/UTCのことがある。比較はCarbonに揃える(where(..., now()))か、DB側TZを明示。 - テストが不安定:時間依存ロジックは 
Date::setTestNow()/freezeTime()/travel()を使って固定・移動。 - ミリ秒精度:MySQLの 
DATETIME(6)でないとミリ秒は落ちる。精度が必要なら列定義を見直す。 - キャッシュキーに生時刻:
now()をそのまま含めると毎回ミスヒット。丸め(floorMinute()など)や粒度指定を。 
代替・関連APIとの比較
Carbon::now($tz):クラスメソッド。用途は同等だが、Laravel的にはnow()が簡潔。Date::now($tz):Facade。Date::use(CarbonImmutable::class)による 不変日付 切替やマクロ活用を考えるならこちら。time()(PHP):UNIXタイム(秒)。演算は軽いが可読性/タイムゾーン対応は乏しい。DateTimeImmutable('now', $tz)(PHP):フレームワーク非依存で不変。Laravel内ならnow()/Date::now()が一貫。
選定基準:
Laravel内での可読性・チェーン操作重視 → now()/不変運用・日付戦略を全体制御 → Date::now()+Date::use()/低レベル計測 → microtime(true)。
テスト例(Pest)
<?php
use Illuminate\Support\Facades\Date;
it('expires sessions after 30 minutes', function () {
    Date::setTestNow('2025-09-06 10:00:00');
    // ... セッション作成(created_at = now()) ...
    Date::setTestNow('2025-09-06 10:31:00');
    // ... 期限切れ処理を実行 ...
    // 30分超で期限切れになっていることを検証
    expect(/* 対象 */)->toBeFalse(); // サンプル
});
トラブルシュート(エラー別)
| 症状/エラー | 原因 | 対処 | 
|---|---|---|
InvalidArgumentException: Unknown or bad timezone | $tz に不正な文字列 | 正しい IANA TZ(例:Asia/Tokyo, UTC)を指定 | 
| DB比較がずれる | DB側TZとアプリTZが不一致 | where(..., now()) を使う。必要なら DB接続の timezone を設定 | 
| テストが通ったり落ちたりする | システム時刻に依存 | Date::setTestNow() / freezeTime() で固定し、後始末で Date::setTestNow() を null に戻す | 

  
  
  
  