Noté que la new Date()
función de JavaScript es muy inteligente al aceptar fechas en varios formatos.
Xmas95 = new Date("25 Dec, 1995 23:15:00")
Xmas95 = new Date("2009 06 12,12:52:39")
Xmas95 = new Date("20 09 2006,12:52:39")
No pude encontrar documentación en ningún lugar que muestre todos los formatos de cadena válidos al llamar a la new Date()
función.
Esto es para convertir una cadena a una fecha. Si miramos el lado opuesto, es decir, convertir un objeto de fecha en una cadena, hasta ahora tenía la impresión de que JavaScript no tiene una API incorporada para formatear un objeto de fecha en una cadena.
Nota del editor: El siguiente enfoque es el intento del autor de la pregunta que funcionó en un navegador en particular pero no funciona en general; Vea las respuestas en esta página para ver algunas soluciones reales.
Hoy, jugué con el toString()
método en el objeto de fecha y sorprendentemente sirve para formatear la fecha en cadenas.
var d1 = new Date();
d1.toString('yyyy-MM-dd'); //Returns "2009-06-29" in Internet Explorer, but not Firefox or Chrome
d1.toString('dddd, MMMM ,yyyy') //Returns "Monday, June 29,2009" in Internet Explorer, but not Firefox or Chrome
Además, aquí no pude encontrar ninguna documentación sobre todas las formas en que podemos formatear el objeto de fecha en una cadena.
¿Dónde está la documentación que enumera los especificadores de formato admitidos por el Date()
objeto?
fuente
Respuestas:
Me encantan 10 formas de formatear la fecha y la hora usando JavaScript y Trabajando con fechas .
Básicamente, tienes tres métodos y tienes que combinar las cadenas por ti mismo:
Ejemplo:
fuente
Moment.js
Es una biblioteca de fechas (ligera) * JavaScript para analizar, manipular y formatear fechas.
(*) significado ligero 9.3KB minified + gzipped en la configuración más pequeña posible (feb 2014)
fuente
Si ya está utilizando jQuery UI en su proyecto, puede usar el método de selector de fecha incorporado para formatear su objeto de fecha:
Sin embargo, el selector de fecha solo formatea fechas y no puede formatear horas.
Eche un vistazo a jQuery UI datepicker formatDate , los ejemplos.
fuente
Me topé con esto hoy y me sorprendió bastante que nadie se tomara el tiempo para responder esta simple pregunta. Es cierto que existen muchas bibliotecas para ayudar con la manipulación de fechas. Algunos son mejores que otros. Pero esa no fue la pregunta que se hizo.
AFAIK, JavaScript puro no es compatible con los especificadores de formato de la manera que ha indicado que desea utilizarlos . Pero sí los métodos de soporte para el formato de fechas y / o tiempos, tales como
.toLocaleDateString()
,.toLocaleTimeString()
, y.toUTCString()
.La
Date
referencia de objeto que uso con más frecuencia está en el sitio web w3schools.com (pero una búsqueda rápida en Google revelará muchos más que pueden satisfacer mejor sus necesidades).También tenga en cuenta que la sección Propiedades del objeto de fecha proporciona un enlace a
prototype
, que ilustra algunas formas en que puede extender el objeto de Fecha con métodos personalizados. A lo largo de los años, ha habido un debate en la comunidad de JavaScript sobre si esta es la mejor práctica o no, y no estoy abogando a favor o en contra, solo señalando su existencia.fuente
Función de formato personalizado:
Para formatos fijos, una función simple hace el trabajo. El siguiente ejemplo genera el formato internacional AAAA-MM-DD:
Nota: Sin embargo, generalmente no es una buena idea extender las bibliotecas estándar de Javascript (por ejemplo, agregando esta función al prototipo de Date).
Una función más avanzada podría generar resultados configurables basados en un parámetro de formato. Hay un par de buenos ejemplos en esta misma página.
Si escribir una función de formato es demasiado largo, hay muchas bibliotecas alrededor de las cuales lo hace. Algunas otras respuestas ya las enumeran. Pero el aumento de las dependencias también tiene su contrapartida.
Funciones de formato estándar ECMAScript:
Desde versiones más recientes de ECMAscript, la
Date
clase tiene algunas funciones de formato específicas:Nota: es posible generar resultados personalizados a partir de esas funciones de formato:
fuente
La respuesta corta
No hay documentación "universal" a la que se dirige JavaScript; cada navegador que tiene javascript es realmente una implementación. Sin embargo, existe un estándar que la mayoría de los navegadores modernos tienden a seguir, y ese es el estándar EMCAScript; Las cadenas estándar ECMAScript tomarían, como mínimo, una implementación modificada de la definición ISO 8601.
Además de esto, hay un segundo estándar establecido por el IETF que los navegadores tienden a seguir también, que es la definición de las marcas de tiempo hechas en el RFC 2822. La documentación real se puede encontrar en la lista de referencias en la parte inferior.
De esto puede esperar una funcionalidad básica, pero lo que "debería" ser no es inherentemente lo que "es". Sin embargo, voy a profundizar un poco en este procedimiento, ya que parece que solo tres personas respondieron la pregunta (Scott, goofballLogic y Peller, a saber), lo que, para mí, sugiere que la mayoría de las personas desconocen lo que realmente sucede cuando crear un objeto de fecha.
La larga respuesta
Para responder a la pregunta, o generalmente incluso buscar la respuesta a esta pregunta, debe saber que JavaScript no es un lenguaje novedoso; en realidad es una implementación de ECMAScript y sigue los estándares de ECMAScript (pero tenga en cuenta que javascript también es anterior a esos estándares; los estándares de EMCAScript se basan en la implementación temprana de LiveScript / JavaScript). El estándar actual de ECMAScript es 5.1 (2011); en el momento en que se hizo la pregunta originalmente (junio de 2009), el estándar era 3 (4 se abandonó), pero 5 se lanzó poco después de la publicación a fines de 2009. Esto debería describir un problema; qué estándar puede seguir una implementación de JavaScript, puede no reflejar lo que realmente está en su lugar, porque a) es una implementación de un estándar dado, b) no todas las implementaciones de un estándar son puritanas,
Esencialmente, cuando se trata de javascript, se trata de un derivado (javascript específico para el navegador) de una implementación (javascript en sí). El V8 de Google, por ejemplo, implementa ECMAScript 5.0, pero el JScript de Internet Explorer no intenta cumplir con ningún estándar de ECMAScript, pero Internet Explorer 9 sí lo hace con ECMAScript 5.0.
Cuando se pasa un único argumento a la nueva Fecha (), lanza este prototipo de función:
Cuando se pasan dos o más argumentos a la nueva Fecha (), lanza este prototipo de función:
Ambas funciones deberían parecer familiares, pero esto no responde de inmediato a su pregunta y lo que cuantifica como un "formato de fecha" aceptable requiere una explicación más detallada. Cuando pasa una cadena a la nueva Fecha (), llamará al prototipo (tenga en cuenta que estoy usando la palabra prototipo libremente; las versiones pueden ser funciones individuales o puede ser parte de una declaración condicional en una sola función) para nueva Fecha (valor) con su cadena como argumento para el parámetro "valor". Esta función primero verificará si es un número o una cadena. La documentación para esta función se puede encontrar aquí:
A partir de esto, podemos deducir que para obtener el formato de cadena permitido para la nueva Fecha (valor), tenemos que mirar el método Date.parse (cadena). La documentación para este método se puede encontrar aquí:
Y podemos inferir además que se espera que las fechas estén en un formato extendido ISO 8601 modificado, como se especifica aquí:
Sin embargo, podemos reconocer por experiencia que el objeto Date de javascript acepta otros formatos (impuestos por la existencia de esta pregunta en primer lugar), y esto está bien porque ECMAScript permite formatos específicos de implementación. Sin embargo, eso aún no responde a la pregunta de qué documentación está disponible en los formatos disponibles, ni qué formatos están realmente permitidos. Vamos a ver la implementación de JavaScript de Google, V8; tenga en cuenta que no estoy sugiriendo que este sea el "mejor" motor de JavaScript (¿cómo se puede definir "mejor" o incluso "bueno") y no se puede suponer que los formatos permitidos en V8 representan todos los formatos disponibles en la actualidad, pero creo que es justo asumir que sí siguen las expectativas modernas.
Al observar la función DateConstructor, podemos deducir que necesitamos encontrar la función DateParse; sin embargo, tenga en cuenta que "año" no es el año real y es solo una referencia al parámetro "año".
Esto llama a% DateParseString, que en realidad es una referencia de función de tiempo de ejecución para una función de C ++. Se refiere al siguiente código:
La llamada a la función que nos interesa en esta función es para DateParser :: Parse (); ignore la lógica que rodea esas llamadas de función, estas son solo verificaciones para cumplir con el tipo de codificación (ASCII y UC16). DateParser :: Parse se define aquí:
Esta es la función que realmente define qué formatos acepta. Esencialmente, verifica el estándar EMCAScript 5.0 ISO 8601 y, si no cumple con los estándares, intentará construir la fecha en función de los formatos heredados. Algunos puntos clave basados en los comentarios:
Entonces, esto debería ser suficiente para darle una idea básica de qué esperar cuando se trata de pasar una cadena a un objeto Date. Puede ampliar aún más esto mirando la siguiente especificación a la que apunta Mozilla en la red de desarrolladores de Mozilla (conforme a las marcas de tiempo IETF RFC 2822):
La Red de desarrolladores de Microsoft menciona además un estándar adicional para el objeto Date: ECMA-402, la especificación de API de internacionalización ECMAScript, que es complementaria al estándar ECMAScript 5.1 (y los futuros). Eso se puede encontrar aquí:
En cualquier caso, esto debería ayudar a destacar que no existe una "documentación" que represente universalmente todas las implementaciones de javascript, pero todavía hay suficiente documentación disponible para tener un sentido razonable de qué cadenas son aceptables para un objeto Date. Toda la pregunta cargada cuando lo piensas, ¿sí? :PAGS
fuente
Asegúrese de pagar Datejs cuando trate con fechas en JavaScript. Es bastante impresionante y está bien documentado, como puede ver en el caso de la función toString .
EDITAR : Tyler Forsythe señala que datejs está desactualizado. Lo uso en mi proyecto actual y no tuve ningún problema con él, sin embargo, debe ser consciente de esto y considerar alternativas.
fuente
Simplemente puede expandir el
Date
Objeto con un nuevoformat
método como lo señala Meizz , a continuación se muestra el código proporcionado por el autor. Y aquí hay un jsfiddle .fuente
console.log(new Date('2014-06-01')) -> May
creo que tiene algo que ver con la zona horaria: DLa funcionalidad que cita no es Javascript estándar, no es probable que sea portátil en todos los navegadores y, por lo tanto, no es una buena práctica. La especificación ECMAScript 3 deja que los formatos de análisis y salida funcionen hasta la implementación de Javascript. ECMAScript 5 agrega un subconjunto de soporte ISO8601. Creo que la función toString () que mencionas es una innovación en un navegador (¿Mozilla?)
Varias bibliotecas proporcionan rutinas para parametrizar esto, algunas con un amplio soporte de localización. También puede consultar los métodos en dojo.date.locale .
fuente
Hice este formateador muy simple, es cut / n / pastable (actualizado con una versión más ordenada):
http://snipplr.com/view/66968.82825/
fuente
new DateFmt()
)Marco libre, limitado pero ligero
fuente
DateJS ciertamente tiene todas las funciones, pero recomendaría esta lib MUCHO más simple (formato de fecha de JavaScript) que prefiero simplemente porque solo tiene 120 líneas más o menos.
fuente
Después de examinar varias de las opciones proporcionadas en otras respuestas, decidí escribir mi propia solución limitada pero simple que otros también pueden encontrar útil.
Ejemplo de uso:
fuente
format = format.replace("YY", (""+date.getFullYear()).substring(2));
. Sin embargo, esto se está poniendo feo: probablemente quieras seguir la ruta RegEx o similar.Aquí hay una función que uso mucho. El resultado es aaaa-mm-dd hh: mm: ss.nnn.
fuente
Puede resultarle útil esta modificación del objeto de fecha, que es más pequeña que cualquier biblioteca y se puede ampliar fácilmente para admitir diferentes formatos:
NOTA:
CÓDIGO
UTILIZAR
fuente
Solo para continuar la respuesta sólida de gongzhitaao: esto maneja AM / PM
fuente
No pude encontrar ninguna documentación definitiva sobre formatos de fecha válidos, así que escribí mi propia prueba para ver qué es compatible con varios navegadores.
http://blarg.co.uk/blog/javascript-date-formats
Mis resultados concluyeron que los siguientes formatos son válidos en todos los navegadores que probé (los ejemplos usan la fecha "9 de agosto de 2013"):
[Año completo] / [Mes] / [Número de fecha] : el mes puede ser el número con o sin un cero inicial o el nombre del mes en formato corto o largo, y el número de fecha puede ser con o sin un cero inicial.
[Mes] / [Año completo] / [Número de fecha] : el mes puede ser el número con o sin un cero inicial o el nombre del mes en formato corto o largo, y el número de fecha puede ser con o sin un cero inicial.
Cualquier combinación de [Año completo], [Nombre del mes] y [Número de fecha] separados por espacios : el nombre del mes puede estar en formato corto o largo, y el número de fecha puede estar con o sin un cero a la izquierda.
También válido en "navegadores modernos" (o en otras palabras, todos los navegadores excepto IE9 y versiones posteriores)
[Año completo] - [Número de mes] - [Número de fecha] - El número de mes y fecha debe incluir ceros a la izquierda (este es el formato que utiliza el tipo de fecha MySQL )
Uso de nombres de mes:
Curiosamente, al usar nombres de mes descubrí que solo se usan los primeros 3 caracteres del nombre del mes, por lo que todo lo siguiente es perfectamente válido:
fuente
Formatear y especialmente analizar fechas en JavaScript puede ser un poco dolor de cabeza. No todos los navegadores manejan las fechas de la misma manera. Entonces, si bien es útil conocer los métodos básicos, es más práctico usar una biblioteca auxiliar.
La biblioteca javascript XDate de Adam Shaw existe desde mediados de 2011 y todavía está en desarrollo activo. Tiene una documentación fantástica, una gran API, formato, trata de seguir siendo compatible con versiones anteriores e incluso admite cadenas localizadas.
Enlace para cambiar las cadenas locales: https://gist.github.com/1221376
fuente
Código de ejemplo:
Salida:
fuente
new Date();// = Fri Nov 22 2013 17:48:22 GMT+0100
, si , la salida con el código anterior será"16:48:22"
La biblioteca sugar.js tiene una gran funcionalidad para trabajar con fechas en JavaScript. Y está muy bien documentado .
Algunos ejemplos:
fuente
Todos los navegadores
La forma más confiable de formatear una fecha con el formato fuente que está utilizando es aplicar los siguientes pasos:
new Date()
para crear unDate
objeto.getDate()
,.getMonth()
y.getFullYear()
para obtener respectivamente el día, mes y añoEjemplo:
(Ver también este violín ).
Solo navegadores modernos
También puede utilizar el
.toLocaleDateString
método incorporado para formatear por usted. Solo necesita pasar la configuración regional y las opciones adecuadas para que coincida con el formato correcto, que desafortunadamente solo es compatible con los navegadores modernos (*) :(Ver también este violín ).
(*) De acuerdo con la MDN , "Navegadores modernos" significa Chrome 24+, Firefox 29+, IE11, Edge12 +, Opera 15+ y Safari build nocturno
fuente
Solo otra opción, que escribí:
Biblioteca DP_DateExtensions
No estoy seguro de si ayudará, pero lo he encontrado útil en varios proyectos, parece que hará lo que necesita.
Admite el formato de fecha / hora, matemática de fecha (partes de fecha de suma / resta), comparación de fecha, análisis de fecha, etc. Es de código abierto.
No hay razón para considerarlo si ya está utilizando un marco (todos son capaces), pero si solo necesita agregar rápidamente la manipulación de fechas a un proyecto, dele una oportunidad.
fuente
Si desea mostrar solo el tiempo con dos dígitos, esto puede ayudarlo a:
fuente
usa estas funciones
consulte el siguiente enlace para obtener más detalles https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date
fuente
JsSimpleDateFormat es una biblioteca que puede formatear el objeto de fecha y analizar la cadena con formato de nuevo al objeto de fecha. Utiliza el formato Java (clase SimpleDateFormat). El nombre de meses y días se puede localizar.
Ejemplo:
fuente
La respuesta es "en ninguna parte" ya que el formato de fecha es una funcionalidad patentada. No creo que las funciones de toString estén destinadas a ajustarse a un formato específico. por ejemplo, en la especificación ECMAScript 5.1 ( http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf , 2/8/2013, página 173), la función toString se documenta de la siguiente manera :
Las funciones como los ejemplos a continuación podrían utilizarse para realizar el formateo con bastante facilidad.
fuente
Si no necesita todas las características que proporciona una biblioteca como Moment.js , puede usar mi puerto de strftime . Es ligero (1,35 KB frente a 57,9 KB minimizado en comparación con Moment.js 2.15.0) y proporciona la mayor parte de la funcionalidad de
strftime()
.Uso de la muestra:
El último código está disponible aquí: https://github.com/thdoan/strftime
fuente
La forma correcta de formatear una fecha para devolver "2012-12-29" es con el script del formato de fecha JavaScript :
Este código NO funciona:
fuente
Personalmente, debido a que uso PHP y jQuery / javascript en igual medida, uso la función de fecha de php.js http://phpjs.org/functions/date/
Usar una biblioteca que usa las mismas cadenas de formato que algo que ya conozco es más fácil para mí, y el manual que contiene todas las posibilidades de cadenas de formato para la función de fecha, por supuesto, está en línea en php.net
Simplemente incluye el archivo date.js en tu HTML usando tu método preferido y luego llámalo así:
Puede usar d1.getTime () en lugar de valueOf () si lo desea, hacen lo mismo.
La división entre 1000 de la marca de tiempo de javascript se debe a que una marca de tiempo de javascript está en milisegundos, pero una marca de tiempo de PHP está en segundos.
fuente
Muchos marcos (que quizás ya estés usando) tienen un formato de fecha que quizás no conozcas. jQueryUI ya se mencionó, pero otros marcos como Kendo UI (Globalización) , Yahoo UI (Util) y AngularJS también los tienen.
fuente