如何使用PHP生成两个日期之间的随机日期?

2020/11/02 21:21 · php ·  · 0评论

我正在编写一个需要在两个固定时间戳之间分配随机日期的应用程序

我如何使用php实现此目的,我首先进行了搜索,但仅找到Java的答案,而不是php

例如 :

$string = randomdate(1262055681,1262055681);

PHP具有rand()函数:

$int= rand(1262055681,1262055681);

它还具有mt_rand(),通常据称在结果中具有更好的随机性:

$int= mt_rand(1262055681,1262055681);

要将时间戳转换为字符串,可以使用date(),即:

$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);
}

此函数利用zombat建议strtotime()将日期时间描述转换为Unix时间戳,并使用date()从已生成的随机时间戳中提取有效日期。

使用PHP的另一种解决方案 DateTime

$start并且$endDateTime对象,而且转换成时间戳。然后,我们使用mt_rand方法获取它们之间的随机时间戳。最后,我们重新创建一个DateTime对象。

function randomDateInRange(DateTime $start, DateTime $end) {
    $randomTimestamp = mt_rand($start->getTimestamp(), $end->getTimestamp());
    $randomDate = new DateTime();
    $randomDate->setTimestamp($randomTimestamp);
    return $randomDate;
}

您可以使用随机数来确定随机日期。获取介于0和日期之间的天数之间的随机数。然后只需将该数字添加到第一个日期即可。

例如,要获取一个从现在到30天之间的随机数天的日期。

echo date('Y-m-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("Y-m-d", $datestart + ($randomday * $daystep)) . "\n";

最好的办法 :

$timestamp = rand( strtotime("Jan 01 2015"), strtotime("Nov 01 2016") );
$random_Date = date("d.m.Y", $timestamp );

通过在两个日期之间使用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');

这里的数量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

我们可以使用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');

我之前也有同样的情况,以上答案都无法解决我的问题,所以我

带来了新功能

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_values(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,这只会返回非重复项

最简单的是,这个小功能对我有用,我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);

}

很好的问题;需要为应用生成一些随机样本数据。

您可以将以下函数与可选参数一起使用以生成随机日期:

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. 模式:debug,epoch,verbose epoch或verbose

根据可选规范非调试模式下的输出为随机数。

用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);

完全随机的日期和时间

本文地址:http://php.askforanswer.com/ruheshiyongphpshengchenglianggeriqizhijiandesuijiriqi.html
文章标签: ,   ,   ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!