web-dev-qa-db-fra.com

Javascript: analyser une chaîne à Date comme fuseau horaire LOCAL

J'ai une chaîne représentant l'heure actuelle: 2015-11-24T19:40:00. Comment analyser cette chaîne en Javascript pour obtenir une date représentée par cette chaîne comme HEURE LOCALE? En raison de certaines restrictions, je ne peux pas utiliser la bibliothèque moment, mais jquery est autorisé. Je sais que quelqu'un a déjà posé cette question, mais la réponse a utilisé moment

Par exemple, si j'exécute le script en Californie, alors cette chaîne représenterait l'heure du Pacifique à 19 h, mais si j'exécute le script à NY, alors cette chaîne représenterait l'heure de l'Est?

J'ai essayé ce qui suit mais Chrome et Firefox me donnent des résultats différents:

var str = "2015-11-24T19:40:00";
var date = new Date(str);

Chrome le consomme comme UTC time (Tue Nov 24 2015 11:40:00 GMT-0800 (Pacific Standard Time)),

mais Firefox le consomme comme mon local PACIFIQUE time (Tue Nov 24 2015 19:40:00 GMT-0800 (Pacific Standard Time))

J'ai essayé d'ajouter "Z" à str, comme ceci var date = new Date(str+"Z");, puis les deux navigateurs me donnent l'heure UTC. Existe-t-il une lettre similaire à "Z" Qui indique à tous les navigateurs (au moins Chrome, Firefox et Safari) d'analyser la chaîne en tant que fuseau horaire local?

28
Simo

L'analyse des chaînes de date à l'aide du constructeur Date ou Date.parse (qui sont essentiellement la même chose) est fortement déconseillée.

Si Date est appelée en tant que fonction et a passé une chaîne de date au format ISO 8601 sans fuseau horaire (comme 2015-11-24T19: 40: 00), vous pouvez obtenir l'un des résultats suivants:

  1. Les implémentations pré ES5 peuvent le traiter comme n'importe quoi, même NaN (tel que IE 8)
  2. Les implémentations conformes à ES5 le traiteront comme un fuseau horaire UTC
  3. Les implémentations conformes à ECMAScript 2015 le traiteront comme local (ce qui est conforme à ISO 8601)

Un objet Date a une valeur d'heure qui est UTC et un décalage basé sur les paramètres système. Lorsque vous envoyez une date à la sortie, ce que vous voyez est généralement le résultat de Date.prototype.toString, qui est une chaîne lisible par l'homme, dépendante de l'implémentation, représentant la date et l'heure, généralement dans un fuseau horaire basé sur les paramètres du système.

La meilleure façon d'analyser les chaînes de date est de le faire manuellement. Si vous êtes assuré que le format est cohérent et valide, l'analyse d'une chaîne de format ISO en tant que date locale est aussi simple que:

/*  @param {string} s - an ISO 8001 format date and time string
**                      with all components, e.g. 2015-11-24T19:40:00
**  @returns {Date} - Date instance from parsing the string. May be NaN.
*/
function parseISOLocal(s) {
  var b = s.split(/\D/);
  return new Date(b[0], b[1]-1, b[2], b[3], b[4], b[5]);
}

document.write(parseISOLocal('2015-11-24T19:40:00'));

Notez que l'analyse des chaînes ISO à l'aide de Date.parse accepte uniquement UTC, il n'accepte aucune autre désignation de fuseau horaire (en notant le comportement ci-dessus s'il est manquant).

39
RobG

Une variation sur la réponse formidable de RobG.

Remarque que cela nécessitera que vous exécutiez le saignement Edge JavaScript car il repose sur la notation de flèche et l'opérateur d'étalement.

function parseDateISOString(s) {
  let ds = s.split(/\D/).map(s => parseInt(s));
  ds[1] = ds[1] - 1; // adjust month
  return new Date(...ds);
}

L'avantage de cette approche est qu'elle applique automatiquement le nombre correct d'arguments transmis. Si c'est ce que vous voulez.

5
John Leidegren