PHP: strtotime gibt false für ein zukünftiges Datum zurück?

Lesezeit: 4 Minuten

Hier sind einige Debug-Ausdrücke, die ich in Eclipse eingefügt habe, wenn Sie mir nicht glauben:

"strtotime("2110-07-16 10:07:47")" = (boolean) false    
"strtotime("2110-07-16")" = (boolean) false 

Ich verwende es in meiner Funktion, die ein zufälliges Datum zwischen Start- und Enddatum zurückgibt:

public static function randomDate($start_date, $end_date, $format = DateTimeHelper::DATE_FORMAT_SQL_DATE)
    {
        if($start_date instanceof DateTime)     $start_date = $start_date->format(DateTimeHelper::DATE_FORMAT_YMDHMS);
        if($end_date instanceof DateTime)       $end_date   = $end_date->format(DateTimeHelper::DATE_FORMAT_YMDHMS);

        // Convert timetamps to millis
        $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($format, $val);
    }

Irgendeine Idee, wie man es dazu bringt, die richtige Unix-Zeit für ein zukünftiges Datum zurückzugeben?

Danke!

  • Wir glauben Ihnen, außer es ist das erwartete Verhalten für die von Ihnen übergebenen Datumswerte, die außerhalb des 32-Bit-PHP-Datumsbereichs liegen

    – Markus Bäcker

    16. Juli 10 um 14:52 Uhr


  • Aus der PHP-Dokumentation: Der gültige Bereich eines Zeitstempels reicht normalerweise von Fr, 13. Dezember 1901, 20:45:54 UTC bis Di, 19. Januar 2038, 03:14:07 UTC. (Dies sind die Daten, die den Mindest- und Höchstwerten für eine 32-Bit-Ganzzahl mit Vorzeichen entsprechen.) Außerdem unterstützen nicht alle Plattformen negative Zeitstempel, daher ist Ihr Datumsbereich möglicherweise auf nicht früher als die Unix-Epoche beschränkt. Das bedeutet, dass z. B. Daten vor dem 1. Januar 1970 unter Windows, einigen Linux-Distributionen und einigen anderen Betriebssystemen nicht funktionieren. PHP 5.1.0 und neuere Versionen überwinden diese Einschränkung jedoch.

    – Ivar Bonsaksen

    16. Juli 10 um 14:53 Uhr

  • Ich verwende PHP 5.3 =S 5.2 auf meinem Live-Server. sollte es dann nicht funktionieren?

    – Garrett

    16. Juli 10 um 15:19 Uhr

  • Nein, PHP 5.1.0+ behebt das „Außerdem unterstützen nicht alle Plattformen negative Zeitstempel“-Bit, nicht das „bis Di, 19. Januar 2038“-Bit.

    – Leichtigkeitsrennen im Orbit

    16. März 11 um 11:26 Uhr

Wenn Sie mit Daten arbeiten möchten, die außerhalb des 32-Bit-Integer-Datumsbereichs liegen, verwenden Sie die dateTime-Objekte von PHP

try {
    $date = new DateTime('2110-07-16 10:07:47');
} catch (Exception $e) {
    echo $e->getMessage();
    exit(1);
}

echo $date->format('Y-m-d');

  • Eigentlich scheint es, als würde es meine randomDate-Funktion töten. Wie kann ich ein zufälliges Datum mit einer DateTime machen?

    – Garrett

    16. Juli 10 um 15:23 Uhr

  • Wie wird diese Antwort akzeptiert, wenn die Frage war, wie man einen Unix-Zeitstempel erhält?

    – mvds

    16. Juli 10 um 15:25 Uhr

  • dateTime-Objekte uk2.php.net/manual/en/book.datetime.php sind seit PHP v5.2.0 verfügbar und verwenden intern eine 64-Bit-Ganzzahl, die einen Datumsbereich von etwa 292 Milliarden Jahren bis etwa 292 Milliarden Jahren in der Zukunft angibt. Dies sollte für die meisten Anwendungen ausreichend sein, es sei denn, Sie sind Paläobiologe.

    – Markus Bäcker

    16. Juli 10 um 15:27 Uhr

  • @mvds, weil Sie format() mit U aufrufen können, um eine Unixtime zurückzubekommen. Sehen php.net/manual/en/datetime.format.php und php.net/manual/en/function.date.php.

    – Floriank

    3. Juni 13 um 12:50 Uhr

PHP strtotime gibt false fur ein zukunftiges Datum zuruck
mvds

Versuchen Sie, es vor Di, 19. Januar 2038 03:14:07 UTC zu halten, wenn die Unix-Zeitstempel-Epoche für 32-Bit-Systeme überläuft!

Es ist sogar im Handbuch unter beschrieben http://php.net/strtotime

bearbeiten: Gerade getestet: Es wurde durch die Installation eines 64-Bit-Betriebssystems und einer geeigneten 64-Bit-Version von PHP behoben. Ich schätze, wir haben genug Zeit, um einen wiedergeborenen Jahrtausendfehler zu beheben:

$one = strtotime("9999-12-31 23:59:59");  
$two = strtotime("10000-01-01 00:00:00");
var_dump($one);
var_dump($two);

int(253402297199)
bool(false)

  • Betreff: Bearbeiten – Beachten Sie, dass 64-Bit-PHP (VC9-Thread-sicher) unter Vista 64-Bit immer noch einen 32-Bit-Zeitstempelbereich für vorzeichenbehaftete Ganzzahlen für Datumswerte verwendet

    – Markus Bäcker

    16. Juli 10 um 15:45 Uhr

  • Ich vermute, dass dies daran liegt strtotime() ist keine PHP-Funktion, sondern nur ein Stück Rohrleitung, um sich mit (g)libc zu verbinden (zumindest im Unix-Land)

    – mvds

    16. Juli 10 um 15:54 Uhr


  • Möglicherweise war ich ziemlich verärgert, als ich es entdeckte, als ich kürzlich einige Date-Tests auf verschiedenen Plattformen durchführte. Es ist auch interessant festzustellen, dass die Datumszeichenfolgenformate, die an den dateTime-Konstruktor übergeben werden, eine Reihe von Formaten akzeptieren, die strtotime ablehnen wird; aber ich habe nicht auf die Interna geschaut, um zu sehen, was die beiden verwenden

    – Markus Bäcker

    16. Juli 10 um 16:47 Uhr

Von das PHP-Handbuch:

Der gültige Bereich eines Zeitstempels reicht normalerweise von Freitag, 13. Dezember 1901, 20:45:54 Uhr GMT bis Dienstag, 19. Januar 2038, 03:14:07 Uhr GMT. (Dies sind die Daten, die den Mindest- und Höchstwerten für eine 32-Bit-Ganzzahl mit Vorzeichen entsprechen). Vor PHP 5.1.0 war dieser Bereich jedoch auf einigen Systemen (z. B. Windows) vom 01.01.1970 bis zum 19.01.2038 begrenzt.

Siehe auch: Problem des Jahres 2038 – Wikipedia

Sie können keine Daten konvertieren, die nach dem Unix-Zeitrollover (2038) auftreten.

Einfacher Austausch von strtotime

$date="2199-12-31T08:00:00.000-06:00";

echo date('Y-m-d', strtotime($date)); // fails with 1970 result

echo date_format(  date_create($date) , 'Y-m-d'); // works perfect with 5.2+

Aktueller Beitrag Hier.

  • es druckt das Datum nicht, Sir

    – Waqas_aamer

    19. August 16 um 7:36 Uhr

  • es druckt das Datum nicht, Sir

    – Waqas_aamer

    19. August 16 um 7:36 Uhr

.

714630cookie-checkPHP: strtotime gibt false für ein zukünftiges Datum zurück?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy