2009-12-29 54 views
44

tôi mã hóa một ứng dụng mà tôi cần phải gán ngày ngẫu nhiên giữa hai timestamps cố địnhLàm thế nào để tạo ra ngày ngẫu nhiên giữa hai ngày bằng cách sử dụng php?

làm thế nào tôi có thể đạt được điều này bằng php i đã tìm kiếm đầu tiên nhưng chỉ tìm thấy câu trả lời cho Java không php

ví dụ:

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

Có phải tôi, hoặc giới hạn giống nhau không? :) – PJunior

+0

vào năm 2016 @Sam s trả lời phải là một trong những chấp nhận vì tất cả chúng ta nên chuyển sang 'DateTime' thay vì sử dụng' date'-chức năng. – Hafenkranich

+0

-1: Hai dấu thời gian tranh chấp bằng nhau? Bạn sẽ không nhận được bất kỳ ngẫu nhiên! +1 vì đó là một câu hỏi hay. – wpcoder

Trả lời

76

PHP có rand() chức năng:

$int= rand(1262055681,1262055681); 

Nó cũng có mt_rand(), mà nói chung là có mục đích xấu có tính ngẫu nhiên tốt hơn trong các kết quả:

$int= mt_rand(1262055681,1262055681); 

Để bật một dấu thời gian vào một chuỗi, bạn có thể sử dụng date(), ví dụ:

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

Để thêm vào đó, khi số ngẫu nhiên của bạn xuất hiện, hãy coi nó là dấu thời gian mới và tạo ngày tháng từ đó. –

+1

@Sudhir - chắc chắn. @NetCaster - Bạn có thể sử dụng hàm 'date()' để tạo chuỗi ngày tháng trong một dấu thời gian rất dễ dàng. – zombat

+2

ví dụ: ngày ('Y-m-d', $ int); – gahooa

23

Bạn có thể chỉ cần sử dụng một số ngẫu nhiên để xác định một ngày ngẫu nhiên. Nhận số ngẫu nhiên từ 0 đến số ngày giữa các ngày. Sau đó, chỉ cần thêm số đó vào ngày đầu tiên.

Ví dụ: để có được ngày một số ngẫu nhiên từ nay đến 30 ngày.

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

một chức năng rất nhỏ" hack "! rất đẹp ... – krembo99

8

Dưới đây là một ví dụ khác:

$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

Nếu ngày đưa ra là ở định dạng thời gian ngày sau đó sử dụng này là cách dễ nhất để làm điều này là để chuyển đổi cả số điện thoại để timestamps, sau đó thiết lập này như là tối thiểu và tối đa giới hạn trên một trình tạo số ngẫu nhiên.

Một PHP ví dụ nhanh sẽ là:

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

Chức năng này tận dụng strtotime() theo đề nghị của zombat để chuyển đổi một mô tả datetime vào một dấu thời gian Unix, và ngày() để thực hiện một ngày hợp lệ ra khỏi dấu thời gian ngẫu nhiên đã được tạo.

6

Một giải pháp sử dụng PHPs DateTime

$start_date$end_date là DateTime đối tượng

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

Tất cả chúng ta nên chuyển sang 'DateTime' thay vì' date() '-functions. Điều đó đang được nói, đây là giải pháp tốt nhất. – Hafenkranich

-1

đơn giản nhất của tất cả, chức năng nhỏ này làm việc cho tôi Tôi đã viết nó trong một lớp helper datetime như một tĩnh phương thức

/** 
* 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); 

ngày ngẫu nhiên đầy đủ và thời gian

3

Cách tốt nhất:

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

Bằng cách sử dụng carbon và php rand giữa hai ngày

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

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

HOẶC

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

Lượng o f strtotime ở đây là WAY quá cao.
Đối với bất cứ ai có lợi ích trải rộng trước năm 1971 và sau năm 2038, đây là một hiện đại, giải pháp linh hoạt:

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>'; 
} 

Gọi nó bất kỳ số cách ...

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

Như là, chức năng đòi hỏi date1 < = date2.

0

Câu hỏi hay; cần thiết để tạo một số dữ liệu mẫu ngẫu nhiên cho một ứng dụng.

Bạn có thể sử dụng following function với đối số tùy chọn để tạo ra ngày ngẫu nhiên:

function randomDate($startDate, $endDate, $format = "Y-M-d H:i:s", $timezone = "gmt", $mode = "debug") 
{ 
    return $result; 
} 

mẫu đầu vào:

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 

độc giả yêu cầu có thể thay đổi từ ứng dụng khác, trong hy vọng chung chức năng này là một công cụ tiện dụng nơi bạn cần tạo một số dữ liệu mẫu/ngày ngẫu nhiên cho ứng dụng của mình.

Xin lưu ý rằng chức năng ban đầu ở chế độ gỡ lỗi, vì vậy hãy thay đổi nó thành $mood="" ngoài gỡ lỗi trong sản xuất.

Chức năng chấp nhận:

  1. ngày bắt đầu
  2. ngày kết thúc
  3. định dạng: bất kỳ php chấp nhận định dạng cho ngày tháng hoặc thời gian
  4. múi giờ: tên hoặc số bù đắp
  5. chế độ: debug, epoch, verbose epoch hoặc verbose

kết quả bằng không gỡ lỗi chế độ là số ngẫu nhiên theo thông số tùy chọn.

thử nghiệm với PHP 7.x

Các vấn đề liên quan