date ¿Cómo puedo convertir un valor de fecha en formato ISO 8601 a un objeto de fecha en JavaScript?


1 Answers

Probablemente deberías usar la http://www.datejs.com/ que f3lix recomendó, sin embargo estaba aburrido y arrojé un pequeño objeto que hace exactamente lo que pediste:

25 de septiembre de 2012: Código limpio, permita el formato no extendido, p. Ej. 20120925T164740 + 0200

1 de diciembre de 2011: se corrigió un error en la cadena del mes. Agosto faltaba

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");
      }
};

Ejemplo:

//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));

Explicación:

convert toma una cadena como entrada y devuelve un objeto de fecha si tiene éxito o lanza una excepción si no es así. La cadena debe estar en uno de los siguientes formatos:

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

Dónde:

  • YYYY es el año como un entero de 4 dígitos
  • MM es el mes como un entero de 2 dígitos
  • DD es la fecha del mes como un entero de 2 dígitos
  • T es el carácter T o el espacio (\ x20)
  • hh es la hora en formato de 24 horas, como un entero de 2 dígitos
  • mm es el minuto como un entero de 2 dígitos
  • ss.s es el segundo, ya sea como un entero de 2 dígitos o como un punto flotante con 2 dígitos seguido de un período seguido de uno o más dígitos.
  • Z es el carácter Z (que indica la zona horaria Z, UTC + 00: 00)
  • X es un signo más (+) o menos (-) del timeoffset a UTC
  • aa es la hora de timeoffset a UTC como un entero de 2 dígitos
  • bb es el minuto de timeoffset a ITC como un entero de 2 dígitos

formato toma una cadena en el formato anterior o un objeto de fecha y devuelve una cadena formateada como:

  • MD, Y @ h: mm

Donde - M es el nombre completo en inglés del mes - D es la fecha del mes con un sufijo de orden numérico (1-2 dígitos) - Y es el año (1 o más dígitos) - h es el formato de la hora en 12 horas ( 1-2 dígitos) - m es el minuto (2 dígitos)

mes es una matriz con el nombre de los meses

ordinal es una función que toma un número como entrada y devuelve el número con sufijo ordinal en inglés.

clock12 es una función que toma la hora, el minuto y el segundo en formato de 24h y lo convierte en una cadena en el formato de 12h de los EE. UU. Los segundos son opcionales

javascript date iso8601

He intentado convertir un valor de fecha en un formato más legible. Para hacer eso, estoy tratando de analizar la fecha usando el Date.parse() JavaScript Date.parse() . Sin embargo, eso no funciona en la entrada (por ejemplo: "2007-09-21T14:15:34.058-07:00" ) que tengo. El objetivo final es generar una cadena de fecha como "January 30th, 2008 @ 2:15PM" .

¿Algunas ideas?



Related