LoginSignup
3
1

More than 5 years have passed since last update.

テストデータ用にランダムな日付をn個生成する その2

Last updated at Posted at 2016-11-06

テストデータ用にランダムな日付をn個生成する その2

前回

読み飛ばしていい前置き

  • MacBook Pro 2016 Late買った
    • キーボードが打ちづらく感じたのでとりあえずなんかコード書いてみたくなった
  • DateTimeを返す関数にして呼び出し側で出力フォーマットよしなにしてもらうようにした
    • 意味もなくChronos使った
    • なんとなくImmutableにした
    • 意味もなくgenerator使った

結論

  • やっぱりキーボード打ちづらい
  • コードはかなり微妙
    • ランダムな日付を作るのにmt_rand以外の最良手が見つからない

環境

  • PHP 5.6.25

実装

カンスー

random_datetime.php
<?php
date_default_timezone_set('Asia/Tokyo');
require_once 'vendor/autoload.php';

use Cake\Chronos\MutableDateTime;

function createRandomMutableDateTime($count) {
    for ($i = 0;$i < $count;$i++) {
        yield MutableDateTime::createFromTimestamp(mt_rand(0, 2147483647));
    }
};

呼び出し側

out.php
<?php
require_once 'random_datetime.php';

foreach (createRandomMutableDateTime(5) as $dateTime) {
    echo $dateTime->toDateTimeString() . PHP_EOL;
}

出力結果

% php out.php
2034-12-30 01:08:23
1997-06-06 11:41:01
2030-04-07 01:28:20
1975-11-11 00:06:48
1990-07-25 02:45:11

まとめ

  • 肩凝った

追記

追加仕様

  • 20歳以上40歳 以下とか指定できるようにしてみた

実装

random_datetime.php
<?php
date_default_timezone_set('Asia/Tokyo');
require_once 'vendor/autoload.php';

use Cake\Chronos\Chronos;
use Cake\Chronos\MutableDateTime;

function createRandomMutableDateTimeGenerator($count, $overAge, $underAge) {
    $i = 1;
    $over = Chronos::now()->subYear($overAge);
    $under = Chronos::now()->subYear($underAge);
    while (true) {
        if ($count === $i) {
            break;
        }

        $d = MutableDateTime::createFromTimestamp(mt_rand(0, 2147483647));
        if ($d->between($under, $over)) {
            yield $d;
            $i++;
        }
    }
}

まとめ

  • Chronos使ってる感ちょっと出た
3
1
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
1