2009-12-29 41 views
44

我編碼的應用程序,我需要分配兩個固定的時間戳如何使用php在兩個日期之間生成隨機數據?

我怎樣才能做到這一點使用PHP我搜索第一但只找到Java的答案不是PHP

例如之間的隨機日期:

$string = randomdate(1262055681,1262055681); 
+2

難道是我還是限制相同? :) – PJunior 2015-03-31 16:12:18

+0

截至2016 @Sam的答案應該是公認的答案,因爲我們都應該轉向'DateTime'而不是'date'-函數。 – Hafenkranich 2016-08-16 17:58:18

+0

-1:兩個估算的時間戳相等嗎?你不會隨意的! +1因爲它是一個很好的問題。 – wpcoder 2017-10-16 12:36:52

回答

76

PHP有rand()功能:

$int= rand(1262055681,1262055681); 

它也有mt_rand(),通常聲稱有更好的隨機性結果:

$int= mt_rand(1262055681,1262055681); 

要打開一個時間戳成一個字符串,你可以使用date(),即:

$string = date("Y-m-d H:i:s",$int); 
+4

爲了補充一點,一旦你的隨機數字出來,把它當作一個新的時間戳,並從中構建一個日期。 – 2009-12-29 03:06:31

+1

@Sudhir - 絕對。 @NetCaster - 您可以使用'date()'函數非常輕鬆地從時間戳創建日期字符串。 – zombat 2009-12-29 03:08:18

+2

例如:date('Y-m-d',$ int); – gahooa 2009-12-29 03:08:43

23

你可以只使用一個隨機數確定一個隨機日期。獲取0和日期之間的天數之間的隨機數。然後只需將該號碼添加到第一個日期。

例如,從現在開始到30天之間的某個日期爲一個隨機數。

echo date('Y-m-d', strtotime('+'.mt_rand(0,30).' days')); 
+1

這樣一個很酷的小函數「黑客」!非常好... – krembo99 2012-07-04 07:22:44

8

再舉一例:

$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"; 
32

如果給定日期在日期時間格式,然後利用這樣做是爲了兩個數字轉換爲時間戳的這種最簡單的方法,然後將這些作爲最小和最大一個隨機數發生器的邊界。

一個快速的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時間戳和日期()作出有效日期出來的隨機時間戳已經生成。

6

使用PHP的日期時間的另一個解決方案

$start_date$end_date是datetime對象所有的

private static function random_date_in_range($start_date, $end_date) { 
    $new_date_timestamp = mt_rand($start_date->getTimestamp(), $end_date->getTimestamp()); 
    $random_date = new DateTime(); 
    $random_date->setTimestamp($new_date_timestamp); 
    return $random_date; 
} 
+0

我們應該全部移到'DateTime'而不是'date()' - 函數。這就是說,這是最好的解決方案。 – Hafenkranich 2016-08-16 17:54:59

-1

簡單地說,這個小功能對我的作品 我寫的一個輔助類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); 

} 
-1
$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

的最佳方式:

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

通過使用carbon和PHP rand兩個日期

$startDate = Carbon::now(); 
$endDate = Carbon::now()->subDays(7); 

$randomDate = Carbon::createFromTimestamp(rand($endDate->timestamp, $startDate->timestamp))->format('Y-m-d'); 

OR

$randomDate = Carbon::now()->subDays(rand(0, 7))->format('Y-m-d'); 
2

量之間Ø f 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

0

很好的問題;需要爲應用程序生成一些隨機樣本數據。

您可以使用following function與可選參數生成隨機日期:

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. 格式:名稱或偏移數
  4. 模式:爲日期或時間
  5. 時區的任何PHP接受的格式調試時代,詳細時代或詳細

輸出不調試模式是根據可選規範的隨機數。

使用PHP 7.x測試

相關問題