Mejor manera de reformatear una cadena de fecha textual compleja en Javascript
Frecuentes
Visto 309 veces
1
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:
Sunday, November 11, 2012, 4:45 PM - 6:00 PM
Every Sunday , 9:15 AM - 10:30 AM
First Sunday of the month, 9:15 AM - 1:00 PM - Rm 306
Every Wednesday, 5:30 PM - 8:30 PM, from 09/05/2012 to 11/14/2012
Así es como quiero que esté formateado:
Sun, Nov 11 @ 4:45-6p
(Nombre corto de día y mes, sin año, sin final: 00)Every Sun @ 9:15-10:30a
(sin indicador AM/PM la primera vez si ambos son AM o PM)First Sun of the month @ 9:15a-1p
(A y P minúsculas)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?
3 Respuestas
1
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
1
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
0
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 javascript jquery regex or haz tu propia pregunta.
Aquí hay un JSFiddle que muestra lo que hace mejor el script: jsfiddle.net/ES4aC/1 - shshaw
De hecho, el lenguaje humano es voluminoso, por lo que se requiere un código voluminoso: D - Claudix
Es posible que desee utilizar una biblioteca que ya hace la mayor parte de esto como fecha.js - epascarello
@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. - shshaw