now — 現在時刻の Carbon インスタンスを返す

helper
  • カテゴリ: 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\CarbonDate::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 に戻す

参考リンク

長野県・北アルプス地方在住のフリーランスWebプログラマー。
「落ち着くためのWeb開発」をテーマに、訪れる人が安心して使えるサービスづくりを心がけています。

LaravelやWordPressなどのWebアプリケーション開発を得意とし、技術面の安定性はもちろん、運用後も長く活用できる設計を大切にしています。
静かな山間の暮らしから生まれる視点で、シンプルかつ本質的な解決策をご提案します。

野鳥観察も趣味のひとつで、特にミソサザイ(Wren)に魅力を感じています。
小さな体に反して力強く上向きの尾羽、そして澄んだ鳴き声が遠くまで響く姿に、静かな存在感と芯の強さを感じます。
このサイト名「Laravel Wren」には、そんなミソサザイのように、小さくても確かな価値を届けたいという想いを込めています。

信頼できるパートナーとして、そして気軽に相談できる存在として、あなたのWebプロジェクトをサポートします。

Yudai Tsuyuzakiをフォローする