2013-01-06 116 views
4

我想写一个PHP脚本(或一行代码)来回显两个日期之间的随机时间和日期,例如2日期值之间的随机时间和日期

2012-12-24 13:03

这将是第一次我选择的日期2012年10月1日和任何想法之间一月2013

如何最好地做到这一点?提前致谢。

+0

这很简单 - 你需要一个随机的时间戳。然后从随机时间戳,你将能够提取时间... – Yang

+0

你有没有尝试过什么? –

+1

你想在随机日期中包括10月1日和1月1日,还是只在它们之间? – Ray

回答

21

容易:)只要选择2个随机日期,转换为时代,而这些2个值:)之间的随机

EPOCH - 一直以来1/1/1970,单位为秒。
您可以使用strtotime()函数使日期字符串变为纪元时间,并使用date()函数使其成为另一种方式。

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); 
} 
+0

这应该是一个评论。答案应该有更多'肉' – 2013-01-06 21:24:27

+0

希望我做得更好:) – Infinity

+0

@Infinity这是我最后的方式,感谢所有的答案。 – Sara44

0

好了,这里的东西

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

假设你要包括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; 
2

那么疯狂,它只是可以工作

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

下面是一些代码来完成th是:

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

你可能要定义的分辨率,例如一分钟,三分钟或15秒或一个半一天或什么不是。随机性应用于整个时期,我选择了一分钟作为示范目的(在您的时期内有132480分钟)。

$start = new Datetime('1st October 2012'); 
$end  = new Datetime('1st Jan 2013'); 
$interval = new DateInterval('PT1M'); // Resolution: 1 Minute 
$period = new DatePeriod($start, $interval, $end); 
$random = new RandomIterator($period); 

list($result) = iterator_to_array($random, false) ? : [null];  

例如,这给:

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" 
} 

你可以find the RandomIterator here。没有它,它会使用稍长(约1.5比上面的例子迭代次数):

$count = iterator_count($period); 
$random = rand(1, $count); 

$limited = new LimitIterator(new IteratorIterator($period), $random - 1, 1); 
$limited->rewind(); 
$result = $limited->current(); 

我也试图与秒,但是这将需要相当长。你可能首先想要找到一个随机的一天(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); 
+0

+漂亮的黑客用'IteratorIterator' +'LimitIterator'在'Traversable'上创建自己的'seek'# – Baba

+0

@Baba:是的,但是这个迭代次数是两次。也许你知道一些kewl算法从一组未知元素中获得一个随机值,而不知道预先设置的大小。 – hakre

+0

没有'loop'就不可能实现它可以做的是通过扩展'DatePeriod'来实现'ArrayIterator',这样就可以消除重复的循环,只需要'''''ArrayIterator :: seek '得到rand日期 – Baba