Convertir le tampon DateTime MySql au format de date JavaScript

160

Est-ce que quelqu'un sait comment je peux prendre une datetimevaleur de type de données MySQL , telle que YYYY-MM-DD HH:MM:SSl'analyser ou la convertir pour qu'elle fonctionne dans la Date()fonction JavaScript , par exemple: - Date ('AAAA, MM, JJ, HH, MM, SS);

Je vous remercie!

dzm
la source
Ensuite, après avoir fait tout cela, je trouve que les dates Javascript ne disposent pas d'un moyen facile d'ajouter des dates ...
Kolob Canyon

Réponses:

418

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

Tout ce dont vous avez besoin est une séparation très simple sur 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 correct: cela suppose que votre serveur MySQL génère des dates UTC (ce qui est la valeur par défaut, et recommandé s'il n'y a pas de composant de fuseau horaire de la chaîne).

Andy E
la source
3
Merci beaucoup pour cette solution élégante! J'ai dû l'utiliser car Safari ne semble pas être capable de 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");. Bien que cela soit intéressant, Chrome n'a aucun problème avec cela.
alnafie
et de penser que d'autres réponses suggéraient une solution plus complexe. Merci beaucoup!
RD
C'est la mauvaise réponse. La bonne réponse est publiée ci-dessous par Symen Timmermans. Toutes les dates sont sérialisées (stockées) sous forme de 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. Passez simplement l'horodatage unix (multiplié par 1000 pour les millisecondes) au constructeur de date javascript (comme suggéré par Symen Timmermans) et vous l'avez.
Reinsbrain
1
@Reinsbrain: Ce n'est pas la mauvaise réponse, juste une réponse qui ne correspond pas à vos besoins. Il y a une différence. Que faire si l'implémenteur n'a pas accès au code du serveur exécutant la requête MySQL (peut-être une sorte de service Web)? Et s'il était plus facile de modifier le code côté client car le changer sur le serveur signifierait plus de travail? Il est inutile de diviser les poils sur quelques octets qui pourraient être rendus insignifiants par gzipping, ou les dix millièmes de milliseconde nécessaires pour diviser une chaîne.
Andy E
4
euh mysql utilise un fuseau horaire et le constructeur javascript Date n'accepte que le fuseau horaire local, rendant ainsi cette solution erronée jusqu'à 24 heures ... new Date(Date.UTC(...))c'est mieux, mais cela suppose que mysql utilise utc ... de toute façon cela doit être considéré avant cela peut être considéré comme une réponse correcte.
user3338098
64

Pour ajouter à l'excellente réponse 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 sous la forme "YYYY-MM-DD HH:MM:SS"ou même la forme courte (seule 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());
Marco Demaio
la source
3
vous devriez utiliser new Date(Date.UTC(...))autrement la réponse est fausse jusqu'à 24 heures ...
user3338098
30

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 horodatage unix via:

SELECT unix_timestamp(my_datetime_column) as stamp ...

Nous pouvons créer un nouvel objet JavaScript Date en utilisant le constructeur qui nécessite des 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 t'aides.

Symen Timmermans
la source
4
Oui, le moyen simple et efficace. Mais, je pousserais la multiplication (* 1000) de l'horodatage unix sur le client (en javascript)
Reinsbrain
16

Une doublure pour les navigateurs modernes (IE10 +):

var d = new Date(Date.parse("2010-06-09 13:12:01"));
alert(d); // Wed Jun 09 2010 13:12:01 GMT+0100 (GMT Daylight Time)

Et juste pour le plaisir, voici un one-liner qui fonctionnera sur les anciens navigateurs (maintenant corrigé):

new (Function.prototype.bind.apply(Date, [null].concat("2010-06-09 13:12:01".split(/[\s:-]/)).map(function(v,i){return i==2?--v:v}) ));
alert(d); // Wed Jun 09 2010 13:12:01 GMT+0100 (GMT Daylight Time)
Aleemb
la source
1
Le deuxième exemple ("one-liner qui fonctionnera sur les anciens navigateurs") me donne une date un mois dans le futur. Je pense que le paramètre du mois est indexé à zéro.
nickyspag
@nickyspag déception! corrigé en utilisant map () mais plus aussi succinct.
aleemb
EXCELLENTE réponse .. ils ont tous travaillé, en particulier le premier
David Addoteye
7

Les versions récentes de JavaScript liront une date au format ISO8601, donc tout ce que vous avez à faire est de changer l'espace en un `` T '', en effectuant l'une des opérations suivantes:

#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);
Jeff
la source
3

Pour ajouter encore plus à la solution de Marco. J'ai prototypé directement sur l'objet String.

String.prototype.mysqlToDate = String.prototype.mysqlToDate || function() {
    var t = this.split(/[- :]/);
    return new Date(t[0], t[1]-1, t[2], t[3]||0, t[4]||0, t[5]||0);
};

De cette façon, vous pouvez accéder directement à:

var mySqlTimestamp = "2011-02-20 17:16:00";
var pickupDate = mySqlTimestamp.mysqlToDate();
Adrian Bartholomew
la source
3

Il existe un moyen plus simple, la chaîne d'horodatage sql:

2018-07-19 00:00:00

Le format le plus proche de l'horodatage pour Date () à recevoir est le suivant, alors remplacez l'espace vide pour "T":

var dateString = media.intervention.replace(/\s/g, "T");

"2011-10-10T14: 48: 00"

Ensuite, créez l'objet de date:

var date = new Date(dateString);

résultat serait l'objet de date:

Jeu 19 juillet 2018 00:00:00 GMT-0300 (Horário Padrão de Brasília)

Caique Matos
la source
2

De la réponse d'Andy , pour AngularJS - Filtre

angular
    .module('utils', [])
.filter('mysqlToJS', function () {
            return function (mysqlStr) {
                var t, result = null;

                if (typeof mysqlStr === 'string') {
                    t = mysqlStr.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;
            };
        });
Jaym
la source
Salut et merci à Jaym. Cela a résolu une date cassée dans une application angulaire que j'ai créée pour iOS.
mediaguru
1
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]);
bhowden
la source
+1 pour ne pas évoquer d'expressions régulières. (Maintenant, si nous pouvions simplement le transformer en oneliner et nous débarrasser des vars ...)
T4NK3R
1

Tout d'abord, vous pouvez donner à l'objet Date (classe) JavaScript la nouvelle méthode 'fromYMD ()' pour convertir le format de date YMD de MySQL au format JavaScript en divisant le format YMD en composants et en utilisant ces composants de date:

Date.prototype.fromYMD=function(ymd)
{
  var t=ymd.split(/[- :]/); //split into components
  return new Date(t[0],t[1]-1,t[2],t[3]||0,t[4]||0,t[5]||0);
};

Vous pouvez maintenant définir votre propre objet (fonction dans le monde JavaScript):

function DateFromYMD(ymd)
{
  return (new Date()).fromYMD(ymd);
}

et maintenant vous pouvez simplement créer une date à partir du format de date MySQL;

var d=new DateFromYMD('2016-07-24');
sbrbot
la source
0

Vous pouvez utiliser l'horodatage unix pour diriger:

SELECT UNIX_TIMESTAMP(date) AS epoch_time FROM table;

Ensuite, récupérez epoch_time dans JavaScript, et c'est une simple question de:

var myDate = new Date(epoch_time * 1000);

La multiplication par 1000 est due au fait que JavaScript prend des millisecondes et UNIX_TIMESTAMP donne des secondes.

bharat
la source
-3

Une recherche rapide dans Google a fourni ceci:

 function mysqlTimeStampToDate(timestamp) {
    //function parses mysql datetime string and returns javascript Date object
    //input has to be in this format: 2007-06-05 15:26:02
    var regex=/^([0-9]{2,4})-([0-1][0-9])-([0-3][0-9]) (?:([0-2][0-9]):([0-5][0-9]):([0-5][0-9]))?$/;
    var parts=timestamp.replace(regex,"$1 $2 $3 $4 $5 $6").split(' ');
    return new Date(parts[0],parts[1]-1,parts[2],parts[3],parts[4],parts[5]);
  }

Source: http://snippets.dzone.com/posts/show/4132

Stefan Valianu
la source
-4

Pourquoi ne pas faire ça:

var d = new Date.parseDate( "2000-09-10 00:00:00", 'Y-m-d H:i:s' );
josh803316
la source
2
parseDate n'est pas une méthode JS de l'objet Date. Finalement, il existe une méthode d'analyse statique mais elle n'accepte qu'un seul argument.
Marco Demaio