Как создать случайную дату между двумя датами, используя php?
Я кодирую приложение, где мне нужно назначить случайную дату между двумя фиксированными отметками времени
как я могу достичь этого, используя php, я сначала искал, но нашел ответ только для Java, а не php
например:
$string = randomdate(1262055681,1262055681);
Ответы
Ответ 1
Другое решение с использованием 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;
}
Ответ 2
В PHP есть функция rand():
$int= rand(1262055681,1262055681);
Он также имеет mt_rand(), который, как правило, имеет лучшую случайность в результатах:
$int= mt_rand(1262055681,1262055681);
Чтобы превратить метку времени в строку, вы можете использовать date(), то есть:
$string = date("Y-m-d H:i:s",$int);
Ответ 3
Если заданные даты указаны в формате даты, тогда использовать этот самый простой способ сделать это - преобразовать оба числа в метки времени, а затем установить их как минимальную и максимальную границы для генератора случайных чисел.
Быстрый пример 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(), чтобы сделать допустимую дату из созданная случайная временная метка.
Ответ 4
Вы можете просто использовать случайное число для определения случайной даты. Получите случайное число между 0 и числом дней между датами. Затем просто добавьте это число к первой дате.
Например, чтобы получить дату в случайных числах дней между 30 и 30 днями.
echo date('Y-m-d', strtotime( '+'.mt_rand(0,30).' days'));
Ответ 5
Вот еще один пример:
$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";
Ответ 6
Лучший способ:
$timestamp = rand( strtotime("Jan 01 2015"), strtotime("Nov 01 2016") );
$random_Date = date("d.m.Y", $timestamp );
Ответ 7
Используя carbon и php rand между двумя датами
$startDate = Carbon::now();
$endDate = Carbon::now()->subDays(7);
$randomDate = Carbon::createFromTimestamp(rand($endDate->timestamp, $startDate->timestamp))->format('Y-m-d');
ИЛИ
$randomDate = Carbon::now()->subDays(rand(0, 7))->format('Y-m-d');
Ответ 8
Сумма 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
.
Ответ 9
Другое решение, в котором мы можем использовать date_format:
/**
* Method to generate random date between two dates
* @param $sStartDate
* @param $sEndDate
* @param string $sFormat
* @return bool|string
*/
function randomDate($sStartDate, $sEndDate, $sFormat = 'Y-m-d H:i:s') {
// Convert the supplied date to timestamp
$fMin = strtotime($sStartDate);
$fMax = strtotime($sEndDate);
// Generate a random number from the start and end dates
$fVal = mt_rand($fMin, $fMax);
// Convert back to the specified date format
return date($sFormat, $fVal);
}
Источник: https://gist.github.com/samcrosoft/6550473
Вы можете использовать, например:
$date_random = randomDate('2018-07-09 00:00:00','2018-08-27 00:00:00');
Ответ 10
У меня была такая же ситуация, и ни один из приведенных выше ответов не помог мне
Пришел с новой функцией
function randomDate($startDate, $endDate, $count = 1 ,$dateFormat = 'Y-m-d H:i:s')
{
//inspired by
// https://gist.github.com/samcrosoft/6550473
// Convert the supplied date to timestamp
$minDateString = strtotime($startDate);
$maxDateString = strtotime($endDate);
if ($minDateString > $maxDateString)
{
throw new Exception("From Date must be lesser than to date", 1);
}
for ($ctrlVarb = 1; $ctrlVarb <= $count; $ctrlVarb++)
{
$randomDate[] = mt_rand($minDateString, $maxDateString);
}
if (sizeof($randomDate) == 1)
{
$randomDate = date($dateFormat, $randomDate[0]);
return $randomDate;
}elseif (sizeof($randomDate) > 1)
{
foreach ($randomDate as $randomDateKey => $randomDateValue)
{
$randomDatearray[] = date($dateFormat, $randomDateValue);
}
//return $randomDatearray;
return array_unique($randomDatearray);
}
}
Теперь часть тестирования (данные могут изменяться во время тестирования)
$fromDate = '2012-04-02';
$toDate = '2018-07-02';
print_r (randomDate ($ FromDate, $ Todate, 1));
результат будет
2016-01-25 11:43:22
print_r (randomDate ($ FromDate, $ Todate, 1));
array:10 [▼
0 => "2015-08-24 18:38:26"
1 => "2018-01-13 21:12:59"
2 => "2018-06-22 00:18:40"
3 => "2016-09-14 02:38:04"
4 => "2016-03-29 17:51:30"
5 => "2018-03-30 07:28:48"
6 => "2018-06-13 17:57:47"
7 => "2017-09-24 16:00:40"
8 => "2016-12-29 17:32:33"
9 => "2013-09-05 02:56:14"
]
Но после нескольких тестов я думал о том, что если входные данные будут похожи
$fromDate ='2018-07-02 09:20:39';
$toDate = '2018-07-02 10:20:39';
Таким образом, дубликаты могут возникать при создании большого числа дат, например, 10,000
поэтому я добавил array_unique
и это будет возвращать только не дубликаты
Ответ 11
Проще всего, эта небольшая функция работает для меня
Я написал его в классе-помощнике 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);
}
Ответ 12
Довольно хороший вопрос; необходимо создать некоторые выборочные данные для приложения.
Вы можете использовать следующую функцию с необязательными аргументами для генерации случайных дат:
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 формат для даты и времени
- часовой пояс: имя или номер смещения
- режим: debug, epoch, verbose epoch или verbose
вывод в режиме не отлаживается - это случайное число в соответствии с дополнительными спецификациями.
протестирован с PHP 7.x
Ответ 13
$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);
Полные случайные дата и время