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.