Как сгенерировать случайную дату между двумя датами с помощью php?
Я кодирую приложение, в котором мне нужно назначить случайную дату между двумя фиксированными метками времени
Как я могу добиться этого с помощью php я сначала искал, но нашел ответ только для Java, а не для php
Например:
$string = randomdate(1262055681,1262055681);
11 answers
PHP имеет функцию rand():
$int= rand(1262055681,1262055681);
У него также есть mt_rand(), который, как правило, предполагает лучшую случайность в результатах:
$int= mt_rand(1262055681,1262055681);
Чтобы превратить метку времени в строку, вы можете использовать дату(), т.Е.:
$string = date("Y-m-d 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('Y-m-d H:i:s', $val);
}
Эта функция использует strtotime(), как предложено zombat, для преобразования описания даты и времени в метку времени Unix, и date(), чтобы сделать допустимую дату из случайной метки времени, которая была сгенерирована.
Вы можете просто использовать случайное число для определения случайной даты. Получите случайное число от 0 до количества дней между датами. Затем просто добавьте это число к первой дате.
Например, чтобы получить дату со случайными числами дней между настоящим моментом и 30 днями.
echo date('Y-m-d', strtotime( '+'.mt_rand(0,30).' days'));
Другое решение с использованием PHP DateTime
$start
и $end
являются DateTime
объекты и мы преобразуем в метку времени. Затем мы используем mt_rand
способ получить случайную временную метку между ними. Наконец, мы воссоздаем DateTime
объект.
function randomDateInRange(DateTime $start, DateTime $end) {
$randomTimestamp = mt_rand($start->getTimestamp(), $end->getTimestamp());
$randomDate = new DateTime();
$randomDate->setTimestamp($randomTimestamp);
return $randomDate;
}
Вот еще один пример:
$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("Y-m-d", $datestart + ($randomday * $daystep)) . "\n";
Лучший способ:
$timestamp = rand( strtotime("Jan 01 2015"), strtotime("Nov 01 2016") );
$random_Date = date("d.m.Y", $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('Y-m-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.
Проще всего, эта небольшая функция работает для меня
Я написал это в вспомогательном классе datetime
как статический метод
/**
* Return date between two dates
*
* @param String $startDate
* @param String $endDate
* @return String
*
* @author Kuldeep Dangi <[email protected]>
*/
public static function getRandomDateTime($startDate, $endDate)
{
$randomTime = mt_rand(strtotime($startDate), strtotime($endDate));
return date(self::DATETIME_FORMAT_MYSQL, $randomTime);
}
Довольно хороший вопрос; необходимо сгенерировать некоторые данные случайной выборки для приложения.
Вы можете использовать следующую функцию с необязательными аргументами для генерации случайных дат:
function randomDate($startDate, $endDate, $format = "Y-M-d H:i:s", $timezone = "gmt", $mode = "debug")
{
return $result;
}
Пример ввода:
echo 'UTC: ' . randomDate("1942-01-19", "2016-06-03", "Y-M-d 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", "Y F", "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", "Y-M-d 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 формат даты или времени
- часовой пояс: имя или номер смещения
- режим: отладка, эпоха, подробная эпоха или подробная
Вывод в режиме не отлаживать является случайным числом в соответствии с дополнительными спецификациями.
Протестировано с PHP 7.x
$yeni_tarih = date('Y-m-d', strtotime( '+'.mt_rand(-90,0).' days'))." ".date('H', strtotime( '+'.mt_rand(0,24).' hours')).":".rand(1,59).":".rand(1,59);
Полная случайная дата и время