Mejor manera de reformatear una cadena de fecha textual compleja en Javascript

Mi CMS no me permite reformatear una cadena de fecha en el back-end, así que estoy convirtiendo el texto en el front-end con Javascript.

Estos son algunos ejemplos de lo que produce el CMS:

  1. Sunday, November 11, 2012, 4:45 PM - 6:00 PM
  2. Every Sunday , 9:15 AM - 10:30 AM
  3. First Sunday of the month, 9:15 AM - 1:00 PM - Rm 306
  4. Every Wednesday, 5:30 PM - 8:30 PM, from 09/05/2012 to 11/14/2012

Así es como quiero que esté formateado:

  1. Sun, Nov 11 @ 4:45-6p (Nombre corto de día y mes, sin año, sin final: 00)
  2. Every Sun @ 9:15-10:30a (sin indicador AM/PM la primera vez si ambos son AM o PM)
  3. First Sun of the month @ 9:15a-1p (A y P minúsculas)
  4. Every Wed @ 5:30-8:30p, Sep 5-Nov 14 (Mostrar meses en intervalo de fechas, eliminar año, eliminar 0 inicial en fechas)

Así que aquí está la función que se me ocurrió:

$(".smart-time").each(function(){
    $(this).html($(this).html()
        .replace(/( *)?-( *)?([0-9]([0-2])?:[0-5][0-9])/gi,"-$3") // Remove space in dashes between time
        .replace(/(:[0-5][0-9])([ ]?AM)/gi,"$1a") // Short AM
        .replace(/(:[0-5][0-9])([ ]?PM)/gi,"$1p") // Short PM
        .replace(/12:00( )?p/gi,"Noon") // 12:00p = Noon
        .replace(/12:00( )?a/gi,"Midnight") // 12:00a = Midnight
        .replace(/(:00| from)/gi,"") // No trailing :00
        .replace(/([0-9:]*)a-([0-9:]*)a/gi,"$1-$2a") // Remove first 'a' in span
        .replace(/([0-9:]*)p-([0-9:]*)p/gi,"$1-$2p") // Remove first 'p' in span
        .replace(/(\, |\/)(20[0-9][0-9])/gi,"") // Remove Year
        .replace(/ to /gi,"-") // to changed to -
        .replace(/\/(0)?([0-9]*)/gi,"/$2") // Remove leading 0 in dates
        .replace(/01\//gi,"Jan ") // Change month number to short name
        .replace(/02\//gi,"Feb ")
        .replace(/03\//gi,"Mar ")
        .replace(/04\//gi,"Apr ")
        .replace(/05\//gi,"May ")
        .replace(/06\//gi,"Jun ")
        .replace(/07\//gi,"Jul ")
        .replace(/08\//gi,"Aug ")
        .replace(/09\//gi,"Sep ")
        .replace(/10\//gi,"Oct ")
        .replace(/11\//gi,"Nov ")
        .replace(/12\//gi,"Dec ")
        .replace(/(Sun|Mon|Tue|Wed|Thu|Fri|Sat)(s|nes|rs|ur)?day/gi,"$1") // Shorten Day names
        .replace(/\, <\/span>/gi," @ </span>") // Change , to @
        .replace(/(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)((r)?uary|(t)?(em)?(o)?ber|ch|il|e|y|ust)?/gi,"$1") // Shorten Month names
    );
});

Esto funciona, pero se siente muy... voluminoso.

¿Hay una mejor manera de hacer esto o una forma más sencilla de lograr el mismo objetivo?

preguntado el 10 de septiembre de 12 a las 22:09

Aquí hay un JSFiddle que muestra lo que hace mejor el script: jsfiddle.net/ES4aC/1 -

De hecho, el lenguaje humano es voluminoso, por lo que se requiere un código voluminoso: D -

Es posible que desee utilizar una biblioteca que ya hace la mayor parte de esto como fecha.js -

@epascarello Puede valer la pena usar una biblioteca, sin embargo, dado que solo la necesito para convertir estas fechas específicas, parece un desperdicio (en cuanto al ancho de banda y los recursos) obtener una biblioteca completa para eso. -

3 Respuestas

Otra opción que vale la pena considerar es jQuery UI Datepicker's parseDate() método, documentado aquí.

Sin embargo, si bien esto es muy fácil de usar, claramente solo es práctico si ya está usando datepicker en su sitio.

Respondido el 10 de Septiembre de 12 a las 22:09

Tengo jQuery, pero no jQuery UI. No estoy seguro de si valdría la pena tirar de eso solo por esto. - shshaw

Sí, casi definitivamente no valdría la pena. La biblioteca puede ser bastante pesada en su encarnación actual. - Kelvin

Si no se opone a traer bibliotecas, echaría un vistazo a FechaJs

Tiene una serie de funciones de formato de fecha muy agradables.

Desde el página de inicio:

// Lets start simple. "Today"
Date.parse('today');

// How about tomorrow?
Date.parse('tomorrow');

// July 8?
Date.parse('July 8');

// With a year?
Date.parse('July 8th, 2007');

// And time?
Date.parse('July 8th, 2007, 10:30 PM');

// Get the date, move to Monday (if not already Monday),
// then alert the date to the user in a different format.
var d1 = Date.parse('8-Jul-2007');
if (!d1.is().monday()) {
    d1.last().monday();
}
alert(d1.toString('dddd, MMMM d, yyyy'));

Respondido el 10 de Septiembre de 12 a las 22:09

Debe buscar en Date.parseDate. Aquí hay un buen artículo de ejemplo: http://www.xaprb.com/articles/javascript-date-parsing-demo.html

Respondido el 10 de Septiembre de 12 a las 22:09

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.