174 votes

Convertir le timbre horodateur de MySql au format Date de JavaScript

Est-ce que quelqu'un sait comment je peux prendre un MySQL datetime valeur du type de données, comme YYYY-MM-DD HH:MM:SS et soit l'analyser, soit le convertir pour qu'il fonctionne avec le langage JavaScript. Date() par exemple : Date('AAAA, MM, DD, HH, MM, SS) ;

Merci !

0 votes

Puis, après avoir fait tout cela, je découvre que Javascript Dates n'a pas de moyen facile d'ajouter des dates...

438voto

Andy E Points 132925

Certaines des réponses données ici sont soit trop compliquées, soit ne fonctionnent tout simplement pas (du moins, pas dans tous les navigateurs). Si vous prenez un peu de recul, vous pouvez constater que l'horodatage MySQL comporte chaque composante de temps dans le même ordre que les arguments requis par la fonction Date() constructeur.

Il suffit d'un fractionnement très simple de la chaîne :

// Split timestamp into [ Y, M, D, h, m, s ]
var t = "2010-06-09 13:12:01".split(/[- :]/);

// Apply each element to the Date function
var d = new Date(Date.UTC(t[0], t[1]-1, t[2], t[3], t[4], t[5]));

console.log(d);
// -> Wed Jun 09 2010 14:12:01 GMT+0100 (BST)

Avertissement : cela suppose que votre serveur MySQL affiche des dates UTC (ce qui est le cas par défaut, et recommandé si la chaîne ne comporte pas de composant de fuseau horaire).

3 votes

Merci beaucoup pour cette solution élégante ! J'ai dû l'utiliser car Safari ne semble pas pouvoir générer automatiquement un objet Date à partir d'une chaîne d'horodatage MySQL, par exemple. var d = new Date("2010-06-09 13:12:01"); . Il est intéressant de noter que Chrome n'a aucun problème avec cela.

0 votes

Et de penser que d'autres réponses suggéraient une solution plus complexe. Merci beaucoup !

0 votes

C'est la mauvaise réponse. La bonne réponse est postée ci-dessous par Symen Timmermans. Toutes les dates sont sérialisées (stockées) sous la forme d'un nombre qui compte soit les secondes (dans le cas de l'horodatage unix) soit les millisecondes (javascript) depuis 1970 UTC. Manipuler des chaînes de dates qui sont des représentations alambiquées de ce nombre est un gaspillage de ressources. Il suffit de passer l'horodatage unix (multiplié par 1000 pour les millisecondes) au constructeur de date javascript (comme suggéré par Symen Timmermans) et le tour est joué.

66voto

Marco Demaio Points 8667

Pour ajouter à l'excellent Réponse d'Andy E une fonction d'usage courant pourrait être :

Date.createFromMysql = function(mysql_string)
{ 
   var t, result = null;

   if( typeof mysql_string === 'string' )
   {
      t = mysql_string.split(/[- :]/);

      //when t[3], t[4] and t[5] are missing they defaults to zero
      result = new Date(t[0], t[1] - 1, t[2], t[3] || 0, t[4] || 0, t[5] || 0);          
   }

   return result;   
}

De cette façon, étant donné une date/heure MySQL de la forme "YYYY-MM-DD HH:MM:SS" ou même la forme courte (seulement la date) "YYYY-MM-DD" vous pouvez faire :

var d1 = Date.createFromMysql("2011-02-20");
var d2 = Date.createFromMysql("2011-02-20 17:16:00");
alert("d1 year = " + d1.getFullYear());

4 votes

Vous devriez utiliser new Date(Date.UTC(...)) sinon, la réponse est fausse de 24 heures...

34voto

Symen Timmermans Points 433

Je pense que j'ai peut-être trouvé un moyen plus simple, que personne n'a mentionné.

Une colonne MySQL DATETIME peut être convertie en un timestamp unix grâce à :

SELECT unix_timestamp(my_datetime_column) as stamp ...

Nous pouvons créer un nouvel objet JavaScript Date en utilisant le constructeur qui demande les millisecondes depuis l'époque. La fonction unix_timestamp renvoie les secondes depuis l'époque, nous devons donc multiplier par 1000 :

SELECT unix_timestamp(my_datetime_column) * 1000 as stamp ...

La valeur résultante peut être utilisée directement pour instancier un objet Date Javascript correct :

var myDate = new Date(<?=$row['stamp']?>);

J'espère que cela vous aidera.

4 votes

Oui, la manière efficace et facile. Mais, je pousserais la multiplication (*1000) de l'horodatage unix sur le client (en javascript).

9voto

Jeff Points 351

Les versions récentes de JavaScript lisent une date au format ISO8601. Il suffit donc de remplacer l'espace par un "T", en procédant de la manière suivante :

#MySQL
select date_format(my_date_column,'%Y-%m-%dT%T') from my_table;

#PHP
$php_date_str = substr($mysql_date_str,0,10).'T'.substr($mysql_date_str,11,8);

//JavaScript
js_date_str = mysql_date_str.substr(0,10)+'T'+mysql_date_str.substr(11,8);

1voto

bhowden Points 419
var a=dateString.split(" ");
var b=a[0].split("-");
var c=a[1].split(":");
var date = new Date(b[0],(b[1]-1),b[2],b[0],c[1],c[2]);

0 votes

+1 pour ne pas évoquer les expressions régulières. (Maintenant, si nous pouvions juste le transformer en un oneliner et nous débarrasser des vars...)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X