Converti una data ISO nel formato data aaaa-mm-gg in JavaScript


109

Come posso ottenere una data nel formato aaaa-mm-gg da una data ISO 8601 ?

Il mio appuntamento con l'8601 è

2013-03-10T02:00:00Z

Come posso ottenere quanto segue?

2013-03-10

2
Hai davvero provato a farlo? Questa non è una nuova domanda a cui è stata data risposta più volte.
— bPratik


14
date.split("T")[0]farebbe
— Aravindh Gopi

Risposte:


100

Prova questo

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

Aggiornare:-

Come sottolineato nei commenti, sto aggiornando la risposta per stampare gli zeri iniziali per la data e il mese, se necessario.

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
Nota, non penso che questo stamperà uno zero iniziale per giorno o mese
— user3413723

2
D'accordo con @ user3413723 questo non risponde alla domanda perché rimuove lo 0 iniziale quindi non soddisfa i requisiti del formato AAAA-MM-GG
— James Murphy

Funziona bene @Mritunjay
— Ravi Delixan

Questo è più lungo e più incline agli errori di battitura rispetto alla risposta di DriveByPoster. Ma non darò un voto negativo perché è più indipendente dalla lingua. Semplicemente non utilizza i semplici strumenti a nostra disposizione.
— RoboticRenaissance

signore, potete dirmi come passare il 2013 3 1 questo formato data nel nuovo Data (data)
— Kapil soni

144

Basta ritagliare la stringa:

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

O se hai bisogno solo della data fuori stringa.

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

3
Penso che questa sia la soluzione più semplice ed elegante tra tutte, ma qui c'è qualche rovina per questo?
— Aida_Aida

30
@Aida_Aida L'unico problema a cui riesco a pensare è che se il tuo codice ha a che fare con un tempo su scala geologica di almeno 8000 anni nel futuro, il tuo codice potrebbe non funzionare perché il formato sarà YYYYY-MM-DDnell'anno 10000. Per evitarlo potresti dividerlo sul Tpersonaggio invece. (Vedi en.wikipedia.org/wiki/Year_10,000_problem )
— apsillers

9
In questo modo non gestirà correttamente i fusi orari poiché ISOString è UTC ma l'oggetto Date è locale. Devi tenerlo in considerazione.
— Guillaume F.

3
@GuillaumeF. una considerazione importante ma conforme ai requisiti di OP
— jamesjansson

Non riesco a capire perché la stringa dovrebbe essere analizzata in una data. L' opzione della sottostringa sembra essere la risposta più semplice.
— RobG

46

Puoi controllare Moment.js , Luxon , date-fns o Day.js per una bella manipolazione della data.

O semplicemente estrai la prima parte della tua stringa ISO, contiene già quello che vuoi. Ecco un esempio dividendo su T:

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

15

Moment.js gestirà la formattazione della data per te. Ecco come includerlo tramite un tag JavaScript e quindi un esempio di come utilizzare Moment.js per formattare una data.

<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"

Sebbene questo snippet di codice possa risolvere la domanda, includere una spiegazione aiuta davvero a migliorare la qualità del tuo post. Ricorda che stai rispondendo alla domanda per i lettori in futuro e quelle persone potrebbero non conoscere i motivi del tuo suggerimento sul codice. Si prega inoltre di cercare di non riempire il codice con commenti esplicativi, poiché ciò riduce la leggibilità sia del codice che delle spiegazioni!
— Arrivederci StackExchange

2
momentè una libreria piuttosto enorme da usare solo per la formattazione. Piuttosto usa date-fns che è di dimensioni molto più piccole e offre la stessa funzionalità.
— Hozefa

@ Hozefa, quindi rispondi alla domanda OP con la tua soluzione.
— Harris

1
@ Harris - ha fatto il lavoro senza problemi!
— HadidAli

Vorrei che il momento avesse una funzione come .toISODateString(), perché è un caso molto frequente ...
— Lev Lukomsky

12

Questo è quello che faccio solo per ottenere la data:

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

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


2
Questa è la prima risposta per proporre effettivamente l'idea di split () come risposta per quanto ne so e mi piace quella soluzione per lo sforzo vs affidabilità vs fattore efficace anche se uso moment () ovunque posso.
— rainabba

1
toISOString utilizza UTC, che produrrà la data locale errata per il periodo di offset del fuso orario locale dalla mezzanotte. - RobG
— Michael Dimmitt,

9

Moment.js è una libreria piuttosto grande da utilizzare per un singolo caso d'uso. Consiglio di usare date-fnsinvece. Offre fondamentalmente la maggior parte delle funzionalità di Moment.js con una dimensione del pacchetto molto più piccola e molti 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 da notare è che, poiché è il formato dell'ora ISO 8601 , il browser generalmente converte dall'ora UTC al fuso orario locale. Sebbene questo sia un semplice caso d'uso in cui probabilmente puoi farlo '2013-03-10T02:00:00Z'.substring(0, 10);.

Per conversioni più complesse date-fnsè la strada da percorrere.


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'); funziona come un fascino. Bella risposta!
— Donald Shahini il

5

Uso:

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

4

Questo produrrà la data nel formato AAAA-MM-GG:

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

Non so perché questo non ottenga più voti, ha funzionato perfettamente e ha risposto alla domanda con il minimo sforzo
— Wolfiebae

4

Passa la tua data nell'oggetto data:

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

1
toLocaleDateString () darà in formato "/". Formato non "-".
— TechCrunch

È possibile utilizzare quanto sopra sostituendo "/" con "-". Non è il più elegante anche se toLocaleDateString cambia mai
— James Murphy

Il risultato di toLocaleDateString non è coerente per tutti gli utenti, quindi potrebbe non produrre il risultato richiesto dall'OP.
— RobG

4

Per tutti coloro che stanno usando split, slice e altri tentativi basati su stringhe per ottenere la data, potresti prepararti per fallimenti relativi al fuso orario!

Una stringa ISO ha Zulu-Timezone e una data in base a questo fuso orario, il che significa che potrebbe utilizzare una data un giorno precedente o successiva al fuso orario effettivo, che devi tenere in considerazione nella tua catena di trasformazione.

Guarda questo esempio:

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

Se hai un oggetto data:

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 utilizza UTC, che produrrà la data locale errata per il periodo di offset del fuso orario locale dalla mezzanotte.
— RobG

1

Per estendere la soluzione di rk rk : Nel caso in cui desideri che il formato includa l'ora, puoi aggiungere il toTimeString()alla tua stringa, quindi rimuovere la parte GMT, come segue:

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

0

Ho usato questo:

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
}

Fonte: 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 versione migliore della risposta di @Hozefa .

Se hai date-fnsinstallato, puoi usare la funzione formatISO

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

-4

Usa il codice sottostante. È utile per te.

let currentDate = new Date()
currentDate.toISOString()
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.