2009-01-31 37 views
20

He intentado convertir un valor de fecha en un formato más legible. Para hacer eso, estoy tratando de analizar la fecha usando el método JavaScript Date.parse(). Sin embargo, eso no funciona en la entrada (p. Ej .: "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".¿Cómo puedo convertir un valor de fecha en formato ISO 8601 a un objeto de fecha en JavaScript?

¿Alguna idea?

+0

UTC es la zona horaria 00:00. ¿Te refieres al formato ISO 8601? – some

Respuesta

12

Pruebe http://www.datejs.com/. Es una Biblioteca de fechas de JavaScript con un método Date.parse extendido y un método Date.parseExact, que le permite especificar una cadena de formato. Ver DateJS APIDocumentation.

+2

Vale la pena señalar que no parece perfecto, y el desarrollo parece haberse detenido. Ejemplo con el archivo británico: 'console.log (Date.parse ('1997-07-16T19: 20: 30 + 01: 00')); 'salidas null, y si la parte de la zona horaria se elimina funciona, pero en el El formato estadounidense (miércoles 16 de julio de 1997 a las 19:20:30 GMT + 0100 (BST)), mientras que "mié 16 de julio de 1997 ..." habría sido un poco más británico. – user535673

20

Debe utilizar probablemente el datejs que f3lix recomienda, sin embargo yo estaba aburrido, y la arrojó en conjunto un pequeño objeto que hace exactamente lo que pidieron:

25 de de septiembre de de 2012: código limpio, permitir que el formato no extendida , por ejemplo, 20120925T164740 + 0200

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

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:

convertido toma una cadena como entrada y devuelve un objeto de fecha en caso de éxito o una excepción si no. 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:

  • AAAA es el año como un número entero de 4 dígitos
  • MM es el mes como un número entero de 2 dígitos
  • DD es la dat e de meses como un entero de 2 dígitos
  • T es el carácter T o espacio (\ x20)
  • hh es la hora en formato de 24 horas, como un entero de 2 dígitos
  • mm es el minuto como un 2 dígitos entero
  • 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 punto seguido de uno o más dígitos.
  • Z es el carácter Z (indicando zona horaria Z, GMT + 00: 00)
  • X es un signo más (+) o menos (-) signo de la timeoffset a UTC
  • aa es la hora de la 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

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

meses es una matriz con el nombre de la meses

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

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

+0

Esta respuesta fue muy educativa, pero la primera creo que es más poderosa. – midas06

+0

Acepto que datejs es más poderoso y entiendo que hayas seleccionado esa respuesta. – some

+0

datejs es más poderoso pero tiene una huella. Si la conversión anterior es todo lo que necesita hacer, úselo. Pero hay un error menor: cambie "this.month [t [1] -1]" en lugar de "this.month [t [1]]" en el formato: método. – jschrab

Cuestiones relacionadas