テストデータ用にランダムな日付を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使ってる感ちょっと出た