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
neeraj
fuente
2
¿De verdad ha intentado hacerlo? Esta no es una pregunta nueva, ha sido respondida varias veces.
bPratik
1
posible duplicado de ¿Dónde puedo encontrar documentación sobre
cómo
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);

Mritunjay
fuente
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);
DriveByPoster
fuente
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"
antoine129
fuente
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"
Harris
fuente
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]);

Aravindh Gopi
fuente
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.

Hozefa
fuente
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

Ammar H Alshaar
fuente
d.toLocaleDateString ('en-GB'); Funciona de maravilla. ¡Gran respuesta!
Donald Shahini
5

Utilizar:

new Date().toISOString().substring(0, 10);
Ankita
fuente
4

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

let date = new Date();
date = date.toISOString().slice(0,10);
sebhs
fuente
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, '-');
rk rk
fuente
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"
Jook
fuente
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)

Илья Зеленько
fuente
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"));
Airwavezx
fuente
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/

Alan
fuente
0

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

Abilash Raghu
fuente
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;
Pérdida de memoria
fuente
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
asiniy
fuente
-4

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

let currentDate = new Date()
currentDate.toISOString()
Mohammad Bilal
fuente