Как создать случайную дату между двумя датами, используя php?

Я кодирую приложение, где мне нужно назначить случайную дату между двумя фиксированными метками времени

как я могу достичь этого, используя php, я сначала искал, но нашел ответ только для Java, а не php

например :

$string = randomdate(1262055681,1262055681); 

PHP имеет функцию rand () :

 $int= rand(1262055681,1262055681); 

Он также имеет mt_rand () , который, как правило, имеет лучшую случайность в результатах:

 $int= mt_rand(1262055681,1262055681); 

Чтобы повернуть метку времени в строку, вы можете использовать date () , то есть:

 $string = date("Ymd H:i:s",$int); 

Если заданные даты указаны в формате даты, то использовать этот самый простой способ сделать это – преобразовать оба числа в метки времени, а затем установить их как минимальную и максимальную границы для генератора случайных чисел.

Быстрый пример PHP:

 // Find a randomDate between $start_date and $end_date function randomDate($start_date, $end_date) { // Convert to timetamps $min = strtotime($start_date); $max = strtotime($end_date); // Generate random number using above bounds $val = rand($min, $max); // Convert back to desired date format return date('Ymd H:i:s', $val); } 

Эта функция использует strtotime (), как было предложено zombat для преобразования описания даты и времени в временную метку Unix, и date (), чтобы сделать действительную дату из произвольной временной метки, которая была сгенерирована.

Вы можете просто использовать случайное число для определения случайной даты. Получите случайное число между 0 и числом дней между датами. Затем просто добавьте это число к первой дате.

Например, чтобы получить дату случайных чисел между днями и 30 днями.

 echo date('Ym-d', strtotime( '+'.mt_rand(0,30).' days')); 

Вот еще один пример:

 $datestart = strtotime('2009-12-10');//you can change it to your timestamp; $dateend = strtotime('2009-12-31');//you can change it to your timestamp; $daystep = 86400; $datebetween = abs(($dateend - $datestart) / $daystep); $randomday = rand(0, $datebetween); echo "\$randomday: $randomday\n"; echo date("Ymd", $datestart + ($randomday * $daystep)) . "\n"; 

Другое решение с использованием PHP DateTime

$start_date и $end_date – объекты DateTime

 private static function random_date_in_range($start_date, $end_date) { $new_date_timestamp = mt_rand($start_date->getTimestamp(), $end_date->getTimestamp()); $random_date = new DateTime(); $random_date->setTimestamp($new_date_timestamp); return $random_date; } 

Используя углерод и php rand между двумя датами

 $startDate = Carbon::now(); $endDate = Carbon::now()->subDays(7); $randomDate = Carbon::createFromTimestamp(rand($endDate->timestamp, $startDate->timestamp))->format('Ym-d'); 

ИЛИ

 $randomDate = Carbon::now()->subDays(rand(0, 7))->format('Ym-d'); 

Лучший путь :

 $timestamp = rand( strtotime("Jan 01 2015"), strtotime("Nov 01 2016") ); $random_Date = date("dmY", $timestamp ); 

Сумма strtotime здесь слишком высокая.
Для тех, чьи интересы занимают до 1971 года и после 2038 года, вот современное, гибкое решение:

 function random_date_in_range( $date1, $date2 ){ if (!is_a($date1, 'DateTime')) { $date1 = new DateTime( (ctype_digit((string)$date1) ? '@' : '') . $date1); $date2 = new DateTime( (ctype_digit((string)$date2) ? '@' : '') . $date2); } $random_u = random_int($date1->format('U'), $date2->format('U')); $random_date = new DateTime(); $random_date->setTimestamp($random_u); return $random_date->format('Ym-d') .'<br>'; } 

Назовите это любым количеством способов …

 // timestamps echo random_date_in_range(157766400,1489686923); // any date string echo random_date_in_range('1492-01-01','2050-01-01'); // English textual parsing echo random_date_in_range('last Sunday','now'); // DateTime object $date1 = new DateTime('1000 years ago'); $date2 = new DateTime('now + 10 months'); echo random_date_in_range($date1, $date2); 

Как и в случае, для функции требуется date1 <= date2 .

Довольно хороший вопрос; необходимо создать некоторые выборочные данные для приложения.

Вы можете использовать следующую функцию с необязательными аргументами для генерации случайных дат:

 function randomDate($startDate, $endDate, $format = "YMd H:i:s", $timezone = "gmt", $mode = "debug") { return $result; } 

ввод образца:

 echo 'UTC: ' . randomDate("1942-01-19", "2016-06-03", "YMd H:i:s", "utc") . '<br>'; //1942-Jan-19 07:00:00 echo 'GMT: ' . randomDate("1942-01-19", "2016-06-03", "Y/M/d H:i A", "gmt") . '<br>'; //1942/Jan/19 00:00 AM echo 'France: ' . randomDate("1942-01-19", "2016-06-03", "YF", "Europe/Paris") . '<br>'; //1942 January echo 'UTC - 4 offset time only: ' . randomDate("1942-01-19", "2016-06-03", "H:i:s", -4) . '<br>'; //20:00:00 echo 'GMT +2 offset: ' . randomDate("1942-01-19", "2016-06-03", "YMd H:i:s", 2) . '<br>'; //1942-Jan-19 02:00:00 echo 'No Options: ' . randomDate("1942-01-19", "2016-06-03") . '<br>'; //1942-Jan-19 00:00:00 

требования читателей могут отличаться от приложения к другому, в общем, надеюсь, что эта функция является удобным инструментом, где вам нужно создать некоторые случайные даты / примеры данных для вашего приложения.

Обратите внимание, что функция сначала в режиме отладки, поэтому измените ее на $mood="" кроме отладки в процессе производства.

Функция принимает:

  1. Дата начала
  2. Дата окончания
  3. формат: любой принятый php формат для даты или времени
  4. часовой пояс: имя или номер смещения
  5. mode: debug, epoch, verbose epoch или verbose

выход в режиме не отладки – это случайное число в соответствии с дополнительными спецификациями.

проверено с помощью PHP 7.x

Проще всего, эта небольшая функция работает для меня, я написал ее в вспомогательном классе datetime как статический метод

 /** * Return date between two dates * * @param String $startDate * @param String $endDate * @return String * * @author Kuldeep Dangi <kuldeepamy@gmail.com> */ public static function getRandomDateTime($startDate, $endDate) { $randomTime = mt_rand(strtotime($startDate), strtotime($endDate)); return date(self::DATETIME_FORMAT_MYSQL, $randomTime); } 
 $yeni_tarih = date('Ym-d', strtotime( '+'.mt_rand(-90,0).' days'))." ".date('H', strtotime( '+'.mt_rand(0,24).' hours')).":".rand(1,59).":".rand(1,59); 

Полная случайная дата и время