2つの固定タイムスタンプ間にランダムな日付を割り当てる必要があるアプリケーションをコーディングしています
phpを使用してこれを達成する方法最初に検索しましたが、Java not php
例えば :
$string = randomdate(1262055681,1262055681);
PHP DateTime
を使用した別のソリューション
$start
および$end
は DateTime
オブジェクトであり、タイムスタンプに変換します。次に、 mt_Rand
それらの間のランダムなタイムスタンプを取得するメソッド。最後に、 DateTime
オブジェクトを再作成します。
function randomDateInRange(DateTime $start, DateTime $end) {
$randomTimestamp = mt_Rand($start->getTimestamp(), $end->getTimestamp());
$randomDate = new DateTime();
$randomDate->setTimestamp($randomTimestamp);
return $randomDate;
}
指定された日付が日時形式の場合、これを行う最も簡単な方法は、両方の数値をタイムスタンプに変換し、これらを乱数ジェネレーターの最小および最大境界として設定することです。
簡単な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() を使用して、日付の説明をUnixタイムスタンプに変換するためにzombatによって提案され、date()を使用して、生成されたランダムなタイムスタンプから有効な日付を作成します。
ランダムな数字を使用して、ランダムな日付を決定できます。 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 );
ここにある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/655047
たとえば、使用することができます:
$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 <[email protected]>
*/
public static function getRandomDateTime($startDate, $endDate)
{
$randomTime = mt_Rand(strtotime($startDate), strtotime($endDate));
return date(self::DATETIME_FORMAT_MYSQL, $randomTime);
}