Php 两个日期值之间的随机时间和日期

Php 两个日期值之间的随机时间和日期,php,Php,我正试图编写一个php脚本(或一行代码)来响应两个日期之间的随机时间和日期,例如 2012-12-24 13:03 在我选择的2012年10月1日和2013年1月1日之间 有什么好办法吗?提前感谢。简单:)只需选择两个随机日期,转换为历元,并在这两个值之间随机:) -自1970年1月1日以来的时间,以秒为单位。 您可以使用该函数将日期字符串转换为历元时间,并使用该函数将日期字符串转换为历元时间 function rand_date($min_date, $max_date) { /* G

我正试图编写一个php脚本(或一行代码)来响应两个日期之间的随机时间和日期,例如

2012-12-24 13:03

在我选择的2012年10月1日和2013年1月1日之间

有什么好办法吗?提前感谢。

简单:)只需选择两个随机日期,转换为历元,并在这两个值之间随机:)

-自1970年1月1日以来的时间,以秒为单位。
您可以使用该函数将日期字符串转换为历元时间,并使用该函数将日期字符串转换为历元时间

function rand_date($min_date, $max_date) {
    /* Gets 2 dates as string, earlier and later date.
       Returns date in between them.
    */

    $min_epoch = strtotime($min_date);
    $max_epoch = strtotime($max_date);

    $rand_epoch = rand($min_epoch, $max_epoch);

    return date('Y-m-d H:i:s', $rand_epoch);
}
好吧,有件事

$date_start = strtotime('1 October 2012');
$date_end = strtotime('1 January 2013');
$rand_date = rand($date_start, $date_end);
echo(date('d.m.Y H:i', $rand_date));

假设您希望包括10月1日,但不包括1月1日

$start = strtotime("2012-10-01 00:00:00");
$end =  strtotime("2012-12-31 23:59:59");

$randomDate = date("Y-m-d H:i:s", rand($start, $end));

echo $randomDate;

太疯狂了,它可能会奏效

function randomDate($start_date, $end_date)
{
//make timetamps
$min = strtotime($start_date);
$max = strtotime($end_date);

//random date
$rand_date = rand($min, $max);

//format it
return date('Y-m-d H:i:s', $rand_date);
}

这里有一些代码可以实现这一点:

$randDate=date('Y-m-d', mt_rand(strtotime('2012-10-01'), strtotime('2013-01-01')));

您可能想要定义一个分辨率,例如一分钟、三分钟、15秒、一天半等等。随机性应该应用于整个周期,我在这里选择一分钟作为示例(您的周期中有132480分钟)

例如,该示例给出:

class DateTime#7 (3) {
  public $date =>
  string(19) "2012-10-16 02:06:00"
  public $timezone_type =>
  int(3)
  public $timezone =>
  string(13) "Europe/Berlin"
}
你可以。如果没有它,则需要更长的时间(与上述示例相比,迭代次数约为1.5),使用:

我也试了几秒钟,但那需要很长时间。您可能希望首先找到一个随机的日期(92天),然后在其中找到一些随机的时间

此外,我还运行了一些测试,我发现使用
DatePeriod
没有任何好处,只要您使用的是常见的分辨率,如秒:

$start    = new Datetime('1st October 2012');
$end      = new Datetime('1st Jan 2013');

$random   = new DateTime('@' . mt_rand($start->getTimestamp(), $end->getTimestamp()));
或分钟:

/**
 * @param DateTime $start
 * @param DateTime $end
 * @param int|DateInterval $resolution in Seconds or as DateInterval
 * @return DateTime
 */
$randomTime = function (DateTime $start, DateTime $end, $resolution = 1) {

    if ($resolution instanceof DateInterval) {
        $interval   = $resolution;
        $resolution = ($interval->m * 2.62974e6 + $interval->d) * 86400 + $interval->h * 60 + $interval->s;
    }

    $startValue = floor($start->getTimestamp() / $resolution);
    $endValue   = ceil($end->getTimestamp() / $resolution);
    $random     = mt_rand($startValue, $endValue) * $resolution;

    return new DateTime('@' . $random);
};

$random = $randomTime($start, $end, 60);

这很简单-你需要一个随机的时间戳。然后,从随机时间戳中,您将能够提取时间…您尝试过什么吗?您想在随机日期中包括10月1日和1月1日,还是仅在两者之间?这应该是一个注释。答案应该有更多的“肉”@Infinity这就是我最后的做法,谢谢所有的答案。哈哈!为什么我没有先想到。太棒了+1当我想让它运行两周时,我只能让它回到7秒。为什么会发生这种情况?+很好的黑客攻击在
可遍历的
上创建自己的
seek
,使用
iteratoriator
+
LimitIterator
@Baba:是的,但这会迭代两次。也许你知道一些kewl算法,可以在不知道集合大小的情况下从一组未知元素中获取一个随机值。如果没有
循环
,这是不可能的。可以做的是通过扩展
DatePeriod
来实现
ArrayIterator
,从而消除重复循环只需使用
rand
ArrayIterator::seek
即可获得randdate@Baba然后我拥有所有DateTime对象的完整副本(检查:也设置了完整缓存标志)。难道没有一些聪明的数学公式吗?比如只存储集合中所有元素的一半或是某种程度的?它们可能是我可以实现的算法,但它们都需要长度。。。但是我想我会想出一个清晰的方法来解决上面的代码,而不需要多个循环。。。等一下
$start    = new Datetime('1st October 2012');
$end      = new Datetime('1st Jan 2013');

$random   = new DateTime('@' . mt_rand($start->getTimestamp(), $end->getTimestamp()));
/**
 * @param DateTime $start
 * @param DateTime $end
 * @param int|DateInterval $resolution in Seconds or as DateInterval
 * @return DateTime
 */
$randomTime = function (DateTime $start, DateTime $end, $resolution = 1) {

    if ($resolution instanceof DateInterval) {
        $interval   = $resolution;
        $resolution = ($interval->m * 2.62974e6 + $interval->d) * 86400 + $interval->h * 60 + $interval->s;
    }

    $startValue = floor($start->getTimestamp() / $resolution);
    $endValue   = ceil($end->getTimestamp() / $resolution);
    $random     = mt_rand($startValue, $endValue) * $resolution;

    return new DateTime('@' . $random);
};

$random = $randomTime($start, $end, 60);