Comment convertir une valeur de date au format ISO 8601 en un objet de date en JavaScript?

StackOverflow https://stackoverflow.com/questions/498578

  •  20-08-2019
  •  | 
  •  

Question

J'ai essayé de convertir une valeur de date dans un format plus lisible. Pour ce faire, j'essaie d'analyser la date à l'aide de la méthode JavaScript Date.parse(). Cela ne fonctionne cependant pas sur l'entrée (par exemple: "2007-09-21T14:15:34.058-07:00") que j'ai. L'objectif final est de générer une chaîne de date telle que "January 30th, 2008 @ 2:15PM".

Des idées?

Était-ce utile?

La solution

Essayez http://www.datejs.com/ . Il s'agit d'une bibliothèque de dates JavaScript avec une méthode Date.parse étendue et une méthode Date.parseExact, qui vous permet de spécifier une chaîne de format. Voir DateJS APIDocumentation .

Autres conseils

Vous devriez probablement utiliser le datejs qui f3lix est recommandé, mais je me suis ennuyé et j’ai jeté ensemble un petit objet qui fait exactement ce que vous avez demandé:

25 septembre 2012: code épuré, autoriser le format non étendu, par exemple 20120925T164740 + 0200

1er décembre 2011: correction d'un bogue dans la chaîne de mois. Août manquait

var ISODate = {
  convert :
    function (input){
      if (!(typeof input === "string")) throw "ISODate, convert: input must be a string";
      var d = input.match(/^(\d{4})-?(\d{2})-?(\d{2})[T ](\d{2}):?(\d{2}):?(\d{2})(\.\d+)?(Z|(?:([+-])(\d{2}):?(\d{2})))$/i);
      if (!d) throw "ISODate, convert: Illegal format";
      return new Date(
        Date.UTC(
          d[1], d[2]-1, d[3],
          d[4], d[5], d[6], d[7] || 0 % 1 * 1000 | 0
        ) + (
          d[8].toUpperCase() === "Z" ? 0 :
            (d[10]*3600 + d[11]*60) * (d[9] === "-" ? 1000 : -1000)
        )
      );
    },
  format :
    function(date, utc){
      if (typeof date === "string") date = this.convert(date);
      if (!(date instanceof Date)) throw "ISODate, format: t is not a date object";

      var t={'FullYear':0, 'Month':0, 'Date':0, 'Hours':0, 'Minutes':0, 'Seconds':0};
      for (var key in t) {
        if (t.hasOwnProperty(key)) t[key] = date["get" +(utc ? "UTC" :"") + key]()
      }

      return this.month[t.Month]
        + " "
        + this.ordinal(t.Date)
        + ", "
        + t.FullYear
        + " @ "
        + this.clock12(t.Hours,t.Minutes);
      },
  month:
    [
      "January", "February", "March", "April", "May", "June",
      "July", "August", "September", "October", "November", "December"
    ],
  ordinal:
    function(n) {
      return n+(
        [
          "th", "st", "nd", "rd"
        ][
          (( n % 100 / 10) | 0) === 1 ? 0 : n % 10 < 4 ? n % 10 : 0
        ]
      );
  },
  clock12:
    function(h24, m, s){
      h24%=24;
      var h12 = (h24 % 12) || 12;
      return h12 + ":" +
        (m < 10 ? "0" + m : m) +
        (isFinite(s) ? ":" + (s < 10 ? "0" + s : s ) : "") +
        (h24 < 12 ? "AM" : "PM");
      }
};

Exemple:

//Shows the date in the users timezone:
alert(ISODate.format("2007-09-21T14:15:34.058-07:00"));

//Show the date in UTC (Timezone Z, 00:00)
alert(ISODate.format("2007-09-21T14:15:34.058-07:00",true));

Explication:

convert prend une chaîne en tant qu'entrée et renvoie un objet date en cas de succès ou lève une exception si ce n'est pas le cas. La chaîne doit être dans l’un des formats suivants:

  • AAAA-MM-JJThh: mm: ss.sZ
  • AAAA-MM-JJThh: mm: ss.sXaa: bb

Où:

  • AAAA est l'année sous forme de nombre entier à 4 chiffres
  • MM est le mois sous forme de nombre entier à 2 chiffres
  • DD est la date du mois sous forme de nombre entier à 2 chiffres
  • T est le caractère T ou un espace (\ x20)
  • hh est l'heure au format 24 heures, sous la forme d'un entier à 2 chiffres
  • mm est la minute sous forme de nombre entier à 2 chiffres
  • ss.s est le second, sous forme d’entier à 2 chiffres ou de virgule flottante à 2 chiffres suivi d’un point suivi d’un ou de plusieurs chiffres.
  • Z est le caractère Z (indiquant le fuseau horaire Z, UTC + 00: 00)
  • X est un signe plus (+) ou moins (-) du décalage en temps vers UTC
  • aa est l'heure de décalage horaire de l'heure UTC sous la forme d'un entier à 2 chiffres
  • bb est la minute de décalage horaire de l'ITC sous forme d'entier à 2 chiffres

format prend une chaîne dans le format ci-dessus ou un objet de date et renvoie une chaîne au format:

  • M D, Y @ h: mm

Où   - M est le nom anglais complet du mois   - D est la date du mois avec un suffixe d'ordre numérique (1-2 chiffres)   - Y est l'année (1 ou plusieurs chiffres)   - h est l'heure au format 12 heures (1-2 chiffres)   - m est la minute (2 chiffres)

mois est un tableau portant le nom du mois

.

ordinal est une fonction qui prend un nombre en entrée et le retourne avec le suffixe ordinal anglais.

clock12 est une fonction qui prend des heures, des minutes et des secondes au format 24h et la convertit en chaîne au format américain 12h. Les secondes sont facultatives.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top