PHP Carbonを使って現在時刻を固定する


メモ。
ちゃんとテストを書けばよいのだけど、ちゃちゃっと動作テストをしたい時に。
例えば、ある処理の間だけCarbon::now()を任意の時刻に固定したい。

Carbon::setTestNow() に引数を渡すと任意の時刻で固定できる。
引数なしで呼ぶとリセットされる。

事前準備

$ composer require nesbot/carbon

// 必要があればMonologやDebugbarを入れると良い
$ composer require monolog/monolog
$ composer require maximebf/debugbar

サンプルコード

index.php
<?php

require 'vendor/autoload.php';

use Carbon\Carbon;
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use DebugBar\StandardDebugBar;

$debugbar = new StandardDebugBar();
$debugbarRenderer = $debugbar->getJavascriptRenderer();

$logger = new Logger('my_logger');
$logger->pushHandler(new StreamHandler('./debug.log', Logger::INFO));

Carbon::setTestNow(Carbon::parse('2019-05-20 00:00:00'));
$logger->info(Carbon::now());

Carbon::setTestNow();
$logger->info(Carbon::now());

Carbon::setTestNow(Carbon::parse('2019-05-01 00:00:00'));
$debugbar['messages']->addMessage('Now is ' . Carbon::now()->toDateTimeString());

?>

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>テスト</title>
    <?= $debugbarRenderer->renderHead(); ?>
</head>
<body>
    <?= $debugbarRenderer->render(); ?>
</body>
</html>

実行

$ php index.php

or

$ php -S localhost:8000
$ open http://localhost:8000 # ブラウザアクセス

実行結果

ログ

debug.txt
[2019-05-18 01:59:49] my_logger.INFO: 2019-05-20 00:00:00 [] []
[2019-05-18 01:59:49] my_logger.INFO: 2019-05-18 01:59:49 [] []

ブラウザ