LoginSignup
3
3

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-05-18

メモ。
ちゃんとテストを書けばよいのだけど、ちゃちゃっと動作テストをしたい時に。
例えば、ある処理の間だけ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 [] []

ブラウザ

carbon.png

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3