10
votes

PHP: StrtOTIME retourne faux pour une date future?

Voici quelques expressions de débogage que je mets à Eclipse, si vous ne me croyez pas:

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


4 commentaires

Nous croyons que vous vous croyons, sauf son comportement attendu pour les valeurs de date que vous passez qui tombent en dehors de la plage de dates PHP 32 bits


De PHP Documentation: La gamme valide d'un horodatage est généralement du vendredi, 13 déc. 1901 20:45:54 UTC à Mar, 19 janvier 2038 03:14:07 UTC. (Ce sont les dates correspondant aux valeurs minimales et maximales pour un entier signé 32 bits.) En outre, toutes les plates-formes ne prennent pas en charge les horodatages négatifs, votre gamme de dates ne peut donc pas être limitée à l'époque UNIX. Cela signifie que par exemple Les dates antérieures au 1er janvier 1970 ne fonctionneront pas sur Windows, certaines distributions Linux et quelques autres systèmes d'exploitation. PHP 5.1.0 et les versions plus récentes surmontent cette limitation cependant.


J'utilise php 5.3 = S 5.2 sur mon serveur Live. ne devrait-il pas marcher, alors?


Non, PHP 5.1.0+ Correction de "En outre, toutes les plates-formes ne supporte pas les horodats négatifs" Bit, pas le bit "à la marge de 2038".


5 Réponses :


12
votes

Essayez de le garder avant le mardi, 19 janvier 2038 03:14:07 UTC, lorsque l'époque Unix Timeestamp pour 32 bits roule sur!

Il est même décrit dans le manuel à http://php.net/strtotime

EDIT: juste testé: il est corrigé en installant un 64 bits OS et version appropriée 64 bits de PHP. Je suppose que nous avons assez de temps pour réparer un bogue Millenium réincarné: xxx


3 commentaires

Re: Edit - Notez que 64 bits PHP (coffre-fort VC9) sur Vista 64 bits utilise toujours une gamme d'horodatages entière signée 32 bits pour les valeurs de date


Je présume que c'est parce que strtotime () n'est pas une fonction PHP, mais juste un morceau de tuyauterie pour se connecter à (g) libc (au moins dans UNIX TERRAIN)


Peut-être que j'étais plutôt irrité lorsque je l'ai découvert tout en faisant des tests de jour sur diverses plateformes récemment. Il est également intéressant de noter que les formats de chaîne de date passés au constructeur DateTime acceptent un certain nombre de formats que Strtotime rejetera; mais je n'ai pas regardé les internes pour voir ce que les deux utilisent



2
votes

Vous ne pouvez pas convertir les dates qui se produisent après le roulement de temps UNIX (2038)


1 commentaires

Gah ... battu comme un stetischild gingembre.



3
votes

de Le manuel PHP :

La gamme valide d'un horodatage est typiquement du vendredi, 13 déc. 1901 20:45:54 GMT à Mar, 19 janvier 2038 03:14:07 GMT. (Ce sont les dates correspondant aux valeurs minimales et maximales pour un entier signé 32 bits). Cependant, avant PHP 5.1.0, cette gamme était limitée du 01-01-1970 au 19-01-2038 sur certains systèmes (par exemple Windows).

Voir aussi: Année 2038 Problème - Wikipedia


0 commentaires

12
votes

Si vous souhaitez travailler avec des dates qui tombent en dehors de la plage de dates entière 32 bits, utilisez les objets DateTime de 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');


4 commentaires

En fait, cela semble que cela va tuer ma fonction aléatoireDate. Comment puis-je faire une date aléatoire avec une date d'heure?


Comment cette réponse est-elle acceptée lorsque la question était de savoir comment obtenir un horodatage UNIX?


DateTime Objects uk2.php.net/manual/fr/book.datetime.php < / a> ont été disponibles depuis PHP V5.2.0 et utilisez un entier 64 bits en interne, donnant une gamme de date d'environ 292 milliards d'années à environ 292 milliards d'années à l'avenir. Cela devrait être adéquat pour la plupart des applications, à moins que vous soyez paléobiologiste.


@mvds parce que vous pouvez appeler le format () avec vous pour récupérer un tableau Unix. Voir php.net/manual/fr/dateTime.format.php et < Un href = "http://www.php.net/manual/fr/funck.date.php" rel = "nofollow noreferrer"> php.net/manual/fr/funcund.date.php .



1
votes

remplacement simple de Strtotime xxx

message réel Ici .


1 commentaires

Il n'imprime pas la date SIR