Я кодирую приложение, где мне нужно назначить случайную дату между двумя фиксированными метками времени
как я могу достичь этого, используя 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=""
кроме отладки в процессе производства.
Функция принимает:
выход в режиме не отладки – это случайное число в соответствии с дополнительными спецификациями.
проверено с помощью 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);
Полная случайная дата и время