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


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

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

Например:

$string = randomdate(1262055681,1262055681);
Author: Rishabh, 2009-12-29

11 answers

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

$int= rand(1262055681,1262055681);

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

$int= mt_rand(1262055681,1262055681);

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

$string = date("Y-m-d H:i:s",$int);
 83
Author: zombat, 2009-12-29 03:10:19

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

Быстрым примером 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(), чтобы сделать допустимую дату из случайной метки времени, которая была сгенерирована.

 35
Author: Somnath Muluk, 2012-04-11 10:10:50

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

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

echo date('Y-m-d', strtotime( '+'.mt_rand(0,30).' days'));
 25
Author: Brent Baisley, 2009-12-29 03:11:16

Другое решение с использованием 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;
}
 9
Author: Sam, 2018-03-22 08:58:37

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

$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";
 8
Author: ariefbayu, 2009-12-29 03:15:27

Лучший способ:

$timestamp = rand( strtotime("Jan 01 2015"), strtotime("Nov 01 2016") );
$random_Date = date("d.m.Y", $timestamp );
 4
Author: Максим С, 2016-11-20 11:32:40

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

$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');
 3
Author: vijaykumar, 2017-12-04 06:52:41

Количество 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.

 2
Author: neokio, 2017-03-16 19:08:37

Проще всего, эта небольшая функция работает для меня Я написал это в вспомогательном классе 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);

}
 0
Author: Kuldeep Dangi, 2016-05-12 10:34:18

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

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

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="", отличный от отладки в рабочей среде.

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

  1. дата начала
  2. дата окончания
  3. формат: любой принятый php формат даты или времени
  4. часовой пояс: имя или номер смещения
  5. режим: отладка, эпоха, подробная эпоха или подробная

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

Протестировано с PHP 7.x

 -1
Author: wpcoder, 2017-10-16 16:24:31
$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);

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

 -3
Author: alpc, 2016-06-29 14:40:28