2 votes

Comment convertir un timestamptz Postgresql en une Date Javascript?

Ma base de données crée une série de valeurs timestamptz à l'aide de la fonction now()::TEXT. Dans plusieurs appels API, je reçois ces valeurs, mais j'ai du mal à les transformer en objet Date Javascript.

Voici un exemple de chaîne Timestamptz que Postgres renvoie : 2019-09-12 09:52:52.992823+00

Le problème est que si j'essaie de faire new Date("2019-09-12 09:52:52.992823+00"), alors il y a un comportement capricieux dans le navigateur. Il semble que je doive d'abord ajouter un "Z" à la chaîne pour obtenir l'heure correcte (à cause des fuseaux horaires ?)

De plus, Firefox ne semble pas l'analyser du tout (mais Chrome le fait). Si je supprime le "+00", cela semble fonctionner.

J'ai donc trouvé cette "solution" qui semble fonctionner sur les deux navigateurs, mais je dois l'appeler sur toutes mes dates avant de travailler avec elles, et cela semble un peu fragile. Est-ce la bonne méthode ?

function fixDate(date) {
  return date.replace("+00", "") + "Z";
}

1voto

RobG Points 41170

Les formats pris en charge pour le parseur intégré sont décrits dans ECMA-262, essentiellement un sous-ensemble spécifique de l'ISO 8601 et le format spécifié pour Date.prototype.toString. Le parsing de tout autre format (c'est-à-dire, tout ce qui ne correspond exactement à l'un des formats spécifiés) dépend de l'implémentation et ne doit pas être considéré comme fiable.

Vous pouvez envisager de parser la chaîne et de construire une nouvelle chaîne qui est conforme à ECMA-262, par exemple convertir "2019-09-12 09:52:52.992823+00" en "2019-09-12T09:52:52.992+00:00".

// Convertir 2019-09-12 09:52:52.992823+00 en
//         2019-09-12T09:52:52.992+00:00
// Suppose que toutes les chaînes sont +00:00
function rectifyFormat(s) {
  let b = s.split(/\D/);
  return b[0] + '-' + b[1] + '-' + b[2] + 'T' +
         b[3] + ':' + b[4] + ':' + b[5] + '.' +
         b[6].substr(0,3) + '+00:00';
}

let s = '2019-09-12 09:52:52.992823+00';
console.log(new Date(rectifyFormat(s)))

Cependant, il est également conseillé d'éviter le parseur intégré, même avec les formats pris en charge. Il semble également inefficace de parser une chaîne pour produire une autre chaîne qui est ensuite analysée à nouveau pour produire une Date. Il est préférable d'écrire votre propre fonction de parsing (quelques lignes de code) ou d'utiliser une bibliothèque, par exemple.

// Parsé la chaîne comme '2019-09-12 09:52:52.992823+00'
// vers une date
// Suppose que la chaîne est toujours +00
function myDateParse(s) {
  let b = s.split(/\D/);
  --b[1];                  // Ajuster le numéro de mois
  b[6] = b[6].substr(0,3); // Microsecondes en millisecondes
  return new Date(Date.UTC(...b));
}

let s = '2019-09-12 09:52:52.992823+00';
console.log(myDateParse(s).toISOString());

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