it-swarm.com.de

Wie generiere ich ein beliebiges Datum zwischen zwei Daten mit PHP?

Ich programmiere eine Anwendung, bei der ich ein zufälliges Datum zwischen zwei festen Zeitstempeln zuweisen muss

wie ich das mit PHP erreichen kann, habe ich zuerst gesucht, aber nur die Antwort für Java gefunden, nicht für PHP

zum Beispiel :

$string = randomdate(1262055681,1262055681);
50
M.E

PHP hat die Funktion Rand () :

$int= Rand(1262055681,1262055681);

Es hat auch mt_Rand () , was im Allgemeinen angeblich bessere Zufälligkeiten in den Ergebnissen hat:

$int= mt_Rand(1262055681,1262055681);

Um einen Zeitstempel in einen String umzuwandeln, können Sie date () verwenden, dh:

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

Wenn bestimmte Datumsangaben im Datums- und Uhrzeitformat vorliegen, verwenden Sie diese einfachste Methode, um beide Zahlen in Zeitstempel umzuwandeln. Setzen Sie diese Werte dann als Mindest- und Höchstgrenzen für einen Zufallszahlengenerator.

Ein schnelles PHP Beispiel wäre:

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

Diese Funktion verwendet strtotime () , wie von zombat vorgeschlagen, um eine datetime-Beschreibung in einen Unix-Zeitstempel zu konvertieren, und date (), um aus dem generierten zufälligen Zeitstempel ein gültiges Datum zu machen.

37
Somnath Muluk

Sie können einfach eine Zufallszahl verwenden, um ein zufälliges Datum zu bestimmen. Holen Sie sich eine Zufallszahl zwischen 0 und Anzahl der Tage zwischen den Datumsangaben. Dann fügen Sie diese Nummer einfach zum ersten Datum hinzu.

Zum Beispiel, um ein Datum zu erhalten, an dem zufällige Tage zwischen jetzt und 30 Tagen liegen.

echo date('Y-m-d', strtotime( '+'.mt_Rand(0,30).' days'));
25
Brent Baisley

Eine andere Lösung mit PHP DateTime

$start und $end sind DateTime objects und wir konvertieren in Timestamp. Dann verwenden wir die mt_Rand Methode, um einen zufälligen Zeitstempel zwischen ihnen zu erhalten. Zuletzt erstellen wir ein DateTime object.

function randomDateInRange(DateTime $start, DateTime $end) {
    $randomTimestamp = mt_Rand($start->getTimestamp(), $end->getTimestamp());
    $randomDate = new DateTime();
    $randomDate->setTimestamp($randomTimestamp);
    return $randomDate;
}
12
Sam

Hier ist ein anderes Beispiel:

$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";
8
ariefbayu

Die beste Weise :

$timestamp = Rand( strtotime("Jan 01 2015"), strtotime("Nov 01 2016") );
$random_Date = date("d.m.Y", $timestamp );
5
Максим С

Durch Verwendung von carbon und php Rand zwischen zwei Datumsangaben

$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');
3
vijaykumar

Die Menge an strtotime hier ist viel zu hoch.
Für alle, deren Interessen vor 1971 und nach 2038 liegen, hier eine moderne, flexible Lösung:

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

Nenne es viele Möglichkeiten ...

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

Die Funktion erfordert date1 <= date2.

2
neokio

ich hatte die gleiche Situation vor und keine der obigen Antworten beheben mein Problem, so dass ich

Kam mit neuer Funktion

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

Jetzt das Testteil (Daten können sich während des Testens ändern)

$fromDate = '2012-04-02';
$toDate = '2018-07-02';

print_r (randomDate ($ fromDate, $ toDate, 1));

ergebnis wird sein

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

Aber nach den wenigen Tests habe ich darüber nachgedacht, wie die Eingaben aussehen sollen

$fromDate ='2018-07-02 09:20:39';
$toDate = '2018-07-02 10:20:39';

So können die Duplikate auftreten, während die große Anzahl von Daten wie 10,000 generiert wird.

also habe ich array_unique hinzugefügt und dies wird nur die nicht-Duplikate zurückgeben

1
Manojkiran.A

Am einfachsten funktioniert diese kleine Funktion für mich Ich habe sie in einer Hilfsklasse datetime als statische Methode geschrieben

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

}
0
Kuldeep Dangi

Eine andere Lösung, bei der wir date_format verwenden können:

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

Quelle: https://Gist.github.com/samcrosoft/6550473

Sie könnten zum Beispiel verwenden:

$date_random = randomDate('2018-07-09 00:00:00','2018-08-27 00:00:00');
0