Convierta una fecha ISO al formato de fecha aaaa-mm-dd en JavaScript


109

¿Cómo puedo obtener una fecha con el formato aaaa-mm-dd a partir de una fecha ISO 8601 ?

Mi fecha 8601 es

2013-03-10T02:00:00Z

¿Cómo puedo conseguir lo siguiente?

2013-03-10

2
¿De verdad ha intentado hacerlo? Esta no es una pregunta nueva, ha sido respondida varias veces.
bPratik


14
date.split("T")[0]haría
Aravindh Gopi

Respuestas:


100

Prueba esto

date = new Date('2013-03-10T02:00:00Z');
date.getFullYear()+'-' + (date.getMonth()+1) + '-'+date.getDate();//prints expected format.

Actualizar:-

Como se señaló en los comentarios, estoy actualizando la respuesta para imprimir ceros a la izquierda para la fecha y el mes si es necesario.

date = new Date('2013-08-03T02:00:00Z');
year = date.getFullYear();
month = date.getMonth()+1;
dt = date.getDate();

if (dt < 10) {
  dt = '0' + dt;
}
if (month < 10) {
  month = '0' + month;
}

console.log(year+'-' + month + '-'+dt);


17
Tenga en cuenta que no creo que esto imprima un cero a la
izquierda

2
De acuerdo con @ user3413723, esto no responde la pregunta porque elimina el 0 inicial, por lo que no cumple con los requisitos del formato AAAA-MM-DD
James Murphy

Trabajando bien @Mritunjay
Ravi Delixan

Esto es más largo y más propenso a errores tipográficos en comparación con la respuesta de DriveByPoster. Pero no daré un voto negativo porque es más independiente del idioma. Simplemente no utiliza las herramientas simples a nuestra disposición.
RoboticRenaissance

señor, ¿puede decirme cómo pasar 2013 3 1 este formato de fecha en nueva Fecha (fecha)
Kapil soni

143

Solo recorta la cuerda:

var date = new Date("2013-03-10T02:00:00Z");
date.toISOString().substring(0, 10);

O si solo necesita una fecha fuera de la cadena.

var strDate = "2013-03-10T02:00:00Z";
strDate.substring(0, 10);

3
Creo que esta es la solución más fácil y elegante de todos ellos, pero ¿hay alguna desventaja para esto?
Aida_Aida

30
@Aida_Aida El único problema en el que puedo pensar es que si su código trata con el tiempo de escala geológica al menos 8000 años en el futuro, su código podría romperse porque el formato estará YYYYY-MM-DDen el año 10000. Para evitar esto, podría dividir en el Tpersonaje en su lugar. (Ver en.wikipedia.org/wiki/Year_10,000_problem )
apsillers

9
De esta forma no se manejarán las zonas horarias correctamente ya que ISOString es UTC pero el objeto Date es local. Tienes que tener esto en cuenta.
Guillaume F.

3
@GuillaumeF. una consideración importante, pero cumple con los requisitos de OP
jamesjansson

No puedo entender por qué la cadena debe analizarse en una fecha. La opción de subcadena parece ser la respuesta más simple.
RobG

46

Puede consultar Moment.js , Luxon , date- fns o Day.js para una buena manipulación de la fecha.

O simplemente extraiga la primera parte de su cadena ISO, ya contiene lo que desea. Aquí hay un ejemplo dividiendo en T:

"2013-03-10T02:00:00Z".split("T")[0] // "2013-03-10"

15

Moment.js se encargará del formato de fecha por usted. A continuación, se explica cómo incluirlo a través de una etiqueta de JavaScript y, a continuación, se muestra un ejemplo de cómo usar Moment.js para formatear una fecha.

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.14.1/moment.min.js"></script>

moment("2013-03-10T02:00:00Z").format("YYYY-MM-DD") // "2013-03-10"

Si bien este fragmento de código puede resolver la pregunta, incluir una explicación realmente ayuda a mejorar la calidad de su publicación. Recuerde que está respondiendo a la pregunta para los lectores en el futuro, y es posible que esas personas no conozcan los motivos de su sugerencia de código. Por favor, también trate de no llenar su código con comentarios explicativos, ya que esto reduce la legibilidad tanto del código como de las explicaciones.
Adiós StackExchange

2
momentes una biblioteca bastante grande para usar solo para formatear. En su lugar, use date-fns, que es mucho más pequeño y ofrece la misma funcionalidad.
Hozefa

@Hozefa, luego responda la pregunta OP con su solución.
Harris

1
@Harris: ¡hizo el trabajo sin problemas!
HadidAli

Ojalá el momento tuviera alguna función como .toISODateString(), porque es un caso muy frecuente ...
Lev Lukomsky

12

Esto es lo que hago solo para tener una cita:

let isoDate = "2013-03-10T02:00:00Z";

alert(isoDate.split("T")[0]);


2
Esta es la primera respuesta para proponer realmente la idea split () como respuesta, por lo que puedo decir, y me gusta esa solución para el esfuerzo frente a la confiabilidad frente al factor de eficacia, aunque uso moment () en todos los lugares que puedo.
Rainabba

1
toISOString usa UTC, que producirá la fecha local incorrecta para el período de la zona horaria local desplazada desde la medianoche. - RobG
Michael Dimmitt

9

Moment.js es una biblioteca bastante grande para usar en un solo caso de uso. Recomiendo usar en su date-fnslugar. Ofrece básicamente la mayor funcionalidad de Moment.js con un tamaño de paquete mucho más pequeño y muchos formatting options.

import format from 'date-fns/format'
format('2013-03-10T02:00:00Z', 'YYYY-MM-DD'); // 2013-03-10, YYYY-MM-dd for 2.x

Una cosa a tener en cuenta es que, dado que es el formato de hora ISO 8601 , el navegador generalmente convierte de la hora UTC a la zona horaria local. Aunque este es un caso de uso simple en el que probablemente pueda hacerlo '2013-03-10T02:00:00Z'.substring(0, 10);.

Para conversiones más complejas date-fnses el camino a seguir.


6

let isoDate = "2013-03-10T02:00:00Z";
var d = new Date(isoDate);
d.toLocaleDateString('en-GB'); // dd/mm/yyyy
d.toLocaleDateString('en-US'); // mm/dd/yyyy


d.toLocaleDateString ('en-GB'); Funciona de maravilla. ¡Gran respuesta!
Donald Shahini

5

Utilizar:

new Date().toISOString().substring(0, 10);

4

Esto generará la fecha en formato AAAA-MM-DD:

let date = new Date();
date = date.toISOString().slice(0,10);

No sé por qué esto no está obteniendo más votos, funcionó perfectamente y respondió la pregunta con un mínimo esfuerzo
Wolfiebae

4

Pase su fecha en el objeto de fecha:

var d = new Date('2013-03-10T02:00:00Z');
d.toLocaleDateString().replace(/\//g, '-');

1
toLocaleDateString () dará en formato "/". No formato "-".
TechCrunch

Puede utilizar lo anterior reemplazando "/" por "-". Sin embargo, no es el más elegante si toLocaleDateString cambia alguna vez
James Murphy

El resultado de toLocaleDateString no es consistente para todos los usuarios, por lo que es posible que no produzca el resultado requerido por el OP.
RobG

4

Para todos los que estén usando split, slice y otros intentos basados ​​en cadenas para obtener la fecha, ¡pueden configurarse para fallas relacionadas con la zona horaria!

Un ISO-String tiene Zulu-Timezone y una fecha de acuerdo con esta zona horaria, lo que significa que podría usar una fecha un día antes o después de la zona horaria real, que debe tener en cuenta en su cadena de transformación.

Vea este ejemplo:

const timeZoneRelatedDate = new Date(2020, 0, 14, 0, 0);

console.log(timeZoneRelatedDate.toLocaleDateString(
    'ja-JP', 
    {
      year: 'numeric',
      month: '2-digit',
      day: '2-digit'
    }
).replace(/\//gi,'-'));

// RESULT: "2020-01-14"

console.log(timeZoneRelatedDate.toISOString());

// RESULT: "2020-01-13T23:00:00.000Z" (for me in UTC+1)

console.log(timeZoneRelatedDate.toISOString().slice(0,10));

// RESULT: "2020-01-13"

3

Si tiene un objeto de fecha:

let date = new Date()
let result = date.toISOString().split`T`[0]

console.log(result)

o

let date = new Date()
let result = date.toISOString().slice(0, 10)

console.log(result)


1
toISOString usa UTC, que producirá la fecha local incorrecta para el período de la zona horaria local desplazada desde la medianoche.
RobG

1

Para ampliar la solución de rk rk : en caso de que desee que el formato incluya la hora, puede agregar el toTimeString()a su cadena y luego quitar la parte GMT, de la siguiente manera:

var d = new Date('2013-03-10T02:00:00Z');
var fd = d.toLocaleDateString() + ' ' + d.toTimeString().substring(0, d.toTimeString().indexOf("GMT"));

0

Usé esto:

HTMLDatetoIsoDate(htmlDate){
  let year = Number(htmlDate.toString().substring(0, 4))
  let month = Number(htmlDate.toString().substring(5, 7))
  let day = Number(htmlDate.toString().substring(8, 10))
  return new Date(year, month - 1, day)
}

isoDateToHtmlDate(isoDate){
  let date = new Date(isoDate);
  let dtString = ''
  let monthString = ''
  if (date.getDate() < 10) {
    dtString = '0' + date.getDate();
  } else {
    dtString = String(date.getDate())
  }
  if (date.getMonth()+1 < 10) {
    monthString = '0' + Number(date.getMonth()+1);
  } else {
    monthString = String(date.getMonth()+1);
  }
  return date.getFullYear()+'-' + monthString + '-'+dtString
}

Fuente: http://gooplus.fr/en/2017/07/13/angular2-typescript-isodate-to-html-date/


0

    var d = new Date("Wed Mar 25 2015 05:30:00 GMT+0530 (India Standard Time)");
    alert(d.toLocaleDateString());


0
let dt = new Date('2013-03-10T02:00:00Z');
let dd = dt.getDate();
let mm = dt.getMonth() + 1;
let yyyy = dt.getFullYear();

if (dd<10) {
    dd = '0' + dd;
}
if (mm<10) {
    mm = '0' + mm;
}
return yyyy + '-' + mm + '-' + dd;

0

Una mejor versión de la respuesta de @Hozefa .

Si lo ha date-fnsinstalado, puede usar la función formatISO

const date = new Date(2019, 0, 2)
import { formatISO } from 'date-fns'
formatISO(date, { representation: 'date' }) // '2019-01-02' string

-4

Utilice el siguiente código. Es útil para ti.

let currentDate = new Date()
currentDate.toISOString()
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.