11

たとえば、2つの日付の間のランダムな時刻と日付をエコーするphpスクリプト(またはコード行)を作成しようとしています

2012-12-24 13:03

これは、2012 年 10 月 1 日から 2013 年 1 月 1 日までの間でした。

これを行う最善の方法はありますか?前もって感謝します。

4

6 に答える 6

34

簡単 :) 2 つのランダムな日付を選択し、EPOCH に変換し、これら 2 つの値の間でランダムにするだけです :)

EPOCH - 1970 年 1 月 1 日からの時間 (秒単位)。
関数を使用strtotime()して日付文字列をエポック時間に変換し、date()関数を使用して逆に戻すことができます。

function rand_date($min_date, $max_date) {
    /* Gets 2 dates as string, earlier and later date.
       Returns date in between them.
    */

    $min_epoch = strtotime($min_date);
    $max_epoch = strtotime($max_date);

    $rand_epoch = rand($min_epoch, $max_epoch);

    return date('Y-m-d H:i:s', $rand_epoch);
}
于 2013-01-06T21:15:41.977 に答える
4

たとえば、1分、3分、15秒、1日半などの解像度を定義する必要があります。ランダム性は期間全体に適用する必要があります。ここでは、例として1分を選択しました(期間には132480分があります)。

$start    = new Datetime('1st October 2012');
$end      = new Datetime('1st Jan 2013');
$interval = new DateInterval('PT1M'); // Resolution: 1 Minute
$period   = new DatePeriod($start, $interval, $end);
$random   = new RandomIterator($period);

list($result) = iterator_to_array($random, false) ? : [null];    

たとえば、これは次のようになります。

class DateTime#7 (3) {
  public $date =>
  string(19) "2012-10-16 02:06:00"
  public $timezone_type =>
  int(3)
  public $timezone =>
  string(13) "Europe/Berlin"
}

あなたはここで見つけるRandomIteratorことができます。これがないと、次のように使用すると少し時間がかかります(上記の例と比較して約1.5回の反復回数)。

$count    = iterator_count($period);
$random   = rand(1, $count);

$limited = new LimitIterator(new IteratorIterator($period), $random - 1, 1);
$limited->rewind();
$result = $limited->current();

私も数秒で試しましたが、それはかなり時間がかかります。おそらく、最初にランダムな日(92日)を見つけてから、その中のランダムな時間を見つけたいと思うでしょう。

また、私はいくつかのテストを実行しましたが、DatePeriod秒などの一般的な解像度を使用している限り、使用するメリットは見つかりませんでした。

$start    = new Datetime('1st October 2012');
$end      = new Datetime('1st Jan 2013');

$random   = new DateTime('@' . mt_rand($start->getTimestamp(), $end->getTimestamp()));

または分:

/**
 * @param DateTime $start
 * @param DateTime $end
 * @param int|DateInterval $resolution in Seconds or as DateInterval
 * @return DateTime
 */
$randomTime = function (DateTime $start, DateTime $end, $resolution = 1) {

    if ($resolution instanceof DateInterval) {
        $interval   = $resolution;
        $resolution = ($interval->m * 2.62974e6 + $interval->d) * 86400 + $interval->h * 60 + $interval->s;
    }

    $startValue = floor($start->getTimestamp() / $resolution);
    $endValue   = ceil($end->getTimestamp() / $resolution);
    $random     = mt_rand($startValue, $endValue) * $resolution;

    return new DateTime('@' . $random);
};

$random = $randomTime($start, $end, 60);
于 2013-01-06T21:31:06.613 に答える
3

10 月 1 日を含めたいが、1 月 1 日は含めないとします...

$start = strtotime("2012-10-01 00:00:00");
$end =  strtotime("2012-12-31 23:59:59");

$randomDate = date("Y-m-d H:i:s", rand($start, $end));

echo $randomDate;
于 2013-01-06T21:20:19.437 に答える
2

とてもクレイジーで、うまくいくかもしれません

function randomDate($start_date, $end_date)
{
//make timetamps
$min = strtotime($start_date);
$max = strtotime($end_date);

//random date
$rand_date = rand($min, $max);

//format it
return date('Y-m-d H:i:s', $rand_date);
}
于 2013-01-06T21:20:56.760 に答える
1

これを実現するためのコードを次に示します。

$randDate=date('Y-m-d', mt_rand(strtotime('2012-10-01'), strtotime('2013-01-01')));
于 2013-01-06T21:21:25.093 に答える
0

さて、ここに何かがあります

$date_start = strtotime('1 October 2012');
$date_end = strtotime('1 January 2013');
$rand_date = rand($date_start, $date_end);
echo(date('d.m.Y H:i', $rand_date));
于 2013-01-06T21:19:04.470 に答える