Я пытаюсь написать php-скрипт (или строку кода), чтобы повторить случайное время и дату между двумя датами, например
2012-12-24 13:03
который был бы между моими выбранными датами с 1 октября 2012 года и 1 января 2013 года.
Любые идеи, как лучше всего это сделать? Заранее спасибо.
Легко 🙂 Просто выберите 2 случайные даты, конвертируйте в EPOCH и производителю между этими двумя значениями 🙂
EPOCH – Время с 01.01.1970, в секундах.
Вы можете использовать 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('Ymd H:i:s', $rand_epoch); }
Вероятно, вы хотите определить разрешение, например, одну минуту или три минуты или 15 секунд или полтора дня, а что нет. Случайность должна применяться на весь период, я выбрал одну минуту здесь для образцовых целей (в вашем периоде есть 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);
так сумасшедший, это просто может
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('Ymd H:i:s', $rand_date); }
Предполагая, что вы хотите включить 1 октября, но не включать 1 января …
$start = strtotime("2012-10-01 00:00:00"); $end = strtotime("2012-12-31 23:59:59"); $randomDate = date("Ymd H:i:s", rand($start, $end)); echo $randomDate;
Вот какой код для этого:
$randDate=date('Ym-d', mt_rand(strtotime('2012-10-01'), strtotime('2013-01-01')));
Хорошо, вот что-то
$date_start = strtotime('1 October 2012'); $date_end = strtotime('1 January 2013'); $rand_date = rand($date_start, $date_end); echo(date('dmY H:i', $rand_date));