web-dev-qa-db-fra.com

PHP strtotime et JavaScript Date.parse renvoient des horodatages différents

J'obtiens la même valeur de date-heure en secondes en JavaScript qui est donnée par strtotime() en PHP. Mais j'ai besoin de la même valeur en JavaScript.

Code PHP

echo strtotime("2011-01-26 13:51:50");
// 1296046310

Code JavaScript

var d = Date.parse("2011-01-26 13:51:50");
console.log(d);
// 1296030110000
19
Puzzled Boy

Vous devez utiliser le même fuseau horaire pour une comparaison sensée:

echo strtotime("2011-01-26 13:51:50 GMT");
// 1296049910

var d = Date.parse("2011-01-26 13:51:50 GMT") / 1000;
console.log(d);
// 1296049910

Mise à jour

Selon la norme, seules les dates au format RFC 2822 sont bien prises en charge:

Date.parse("Wed, 26 Jan 2011 13:51:50 +0000") / 1000

Pour générer une telle date, vous pouvez utiliser gmdate('r') en PHP:

echo gmdate('r', 1296049910);
24
Ja͢ck

JavaScript utilise des millisecondes comme horodatage, tandis que PHP utilise des secondes. En conséquence, vous obtenez des dates très différentes, car il est décalé d'un facteur 1000.

échantillon

echo date('Y-m-d', TIMESTAMP / 1000);

Réponse aux commentaires

<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript">

    function toTimestamp(year,month,day,hour,minute,second)
    {
        var datum = new Date(Date.UTC(year,month-1,day,hour,minute,second));
        return datum.getTime()/1000;
    }

    $(function()
    {
        console.log(toTimestamp(2011,01,26,13,51,50));

    });

</script>

<?php

echo $the_date = strtotime("2011-01-26 13:51:50");
4
Dipesh Parmar

strtotime() et Date.parse() donnent des horodatages UNIX avec une résolution de secondes et de millisecondes respectivement. Cependant, si les informations de fuseau horaire sont manquantes dans la chaîne d'entrée, l'heure locale est supposée. Ainsi, la chaîne d'entrée 2011-01-26T13:51:50 peut produire des sorties différentes sur différentes machines même si PHP (ou JavaScript) est utilisé pour générer les horodatages sur les deux machines.

La solution consiste à spécifier explicitement le fuseau horaire dans les chaînes. Cela devrait produire le même résultat sur n'importe quelle machine:

Date.parse("Jan 26, 2011 13:51:50 GMT+0500") / 1000; // 1296031910
strtotime("Jan 26, 2011 13:51:50 GMT+0500");         // 1296031910
3
Salman A