Ottieni una stringa in formato AAAAMMGG dall'oggetto data JS?


398

Sto cercando di usare JS per trasformare a date objectin una stringa in YYYYMMDDformato. C'è un modo più semplice di concatenare Date.getYear(), Date.getMonth()e Date.getDay()?


4
Concatenare quei tre è la strada da percorrere
Juan Cortés,

5
se vuoi una stringa che analizzerà la stessa data, non dimenticare di aumentare il mese. Per abbinare le tue specifiche, devi anche inserire singole cifre nel mese e nella data con '0'
kennebec,

Risposte:


621

Pezzo di codice alterato che uso spesso:

Date.prototype.yyyymmdd = function() {
  var mm = this.getMonth() + 1; // getMonth() is zero-based
  var dd = this.getDate();

  return [this.getFullYear(),
          (mm>9 ? '' : '0') + mm,
          (dd>9 ? '' : '0') + dd
         ].join('');
};

var date = new Date();
date.yyyymmdd();

16
Dovresti sostituire [1] con .length===2, poiché un indicizzatore su una stringa non è completamente supportato. Vedi questa risposta per motivi.
Aidiakapi

6
var mm = (this.getMonth () + 101) .toStrung (). sottostringa (0, 2);
9

7
Per chiunque desideri un esempio pratico della correzione di @Aidiakapi, creo un violino qui: jsfiddle.net/pcr8xbt5/1
killercowuk

1
Se vuoi avere un separatore di punti:[this.getFullYear(), mm<10 ? '0'+ mm: mm, dd<10 ? '0'+ dd : dd].join('.')
Kamil Kiełczewski

3
@ 9dan non dovrebbe esserevar mm = (this.getMonth() + 101).toString().substring(1, 3)
Pnar Sbi Wer

318

Non mi piaceva aggiungere al prototipo. Un'alternativa sarebbe:

var rightNow = new Date();
var res = rightNow.toISOString().slice(0,10).replace(/-/g,"");

<!-- Next line is for code snippet output only -->
document.body.innerHTML += res;


51
Se non hai bisogno della rightNowvariabile in giro, puoi racchiudere new Datee recuperare tutto in una sola riga:(new Date()).toISOString().slice(0,10).replace(/-/g,"")
BigBlueHat

5
Ho voluto YYYYMMDDHHmmSSsss, così ho fatto questo: var ds = (new Date()).toISOString().replace(/[^0-9]/g, "");. Abbastanza semplice, ma dovrebbe essere incapsulato.
Jess,

65
Questo non funzionerà in generale poiché Date.toISOString () crea una data in formato UTC e quindi può saltare i limiti di data a seconda del fuso orario. Ad esempio in GMT + 1: (nuova data (2013,13, 25)) toISOString () == '2013-12-24T23: 00: 00.000Z'
weberste

26
Ciò fallirebbe se qualcuno nel 10000 usasse il tuo codice "nostalgico".
Trevi Awater,

10
Un miglioramento suggerito per far fronte ai fusi orari. rightNow.setMinutes(rightNow.getMinutes() - rightNow.getTimezoneOffset()); rightNow.toISOString().slice(0,10)
Andreas,

182

Puoi usare la toISOStringfunzione:

var today = new Date();
today.toISOString().substring(0, 10);

Ti darà un formato "aaaa-mm-gg".


24
In alcuni casi questo non includerà il giorno giusto, a causa della luce del fuso orario, ecc ...
Miguel,

1
Forse la mia creatività è rotta @Miguel, ma non riesco a pensare a un caso in cui ciò accada. Ti dispiacerebbe fornire un esempio?
Cloudworks

35
Se ti trovi in ​​un fuso orario +1 e hai una data [2015-09-01 00:00:00 GMT + 1], il metodo toISOString () restituirà la stringa '2015-08-31T23: 00: 00.000Z 'perché la data viene convertita in UTC / 0-offset prima di essere stringa.
Luke Baulch,

Un po 'più breve ... var today = (new Date ()). ToISOString (). Substring (0, 10);
teawithfruit,

Non riesce con diversi GMT
Tobia

133

Moment.js potrebbe essere tuo amico

var date = new Date();
var formattedDate = moment(date).format('YYYYMMDD');

18
Beh, ha aggiunto 40kb (minimizzato, non gZip) al mio app.js, ma ci sono andato, grazie :).
Bart,

migliore risposta finora!
TrulyXax,

9
Non mi preoccupo nemmeno di aspettare fino a quando non avrò inevitabilmente più bisogno di un momento, lo aggiungo solo all'inizio di un progetto :)
martinedwards,

1
Puoi renderlo più semplice:var formattedDate = moment().format('YYYYMMDD');
ns16,

37

Se non hai bisogno di una soluzione JS pura, puoi usare l'interfaccia utente jQuery per fare il lavoro in questo modo:

$.datepicker.formatDate('yymmdd', new Date());

Di solito non mi piace importare troppe librerie. Ma l'interfaccia utente di jQuery è così utile, probabilmente la userai da qualche altra parte nel tuo progetto.

Visita http://api.jqueryui.com/datepicker/ per ulteriori esempi


37

Questa è una singola riga di codice che puoi utilizzare per creare una YYYY-MM-DDstringa della data odierna.

var d = new Date().toISOString().slice(0,10);

^ questo! FTW! +1 .. è necessario testare un po 'però.
Gogol,

21
Avvertimento difficile, se la tua data era 01-01-2016 00:00:00 GMT +2, restituirà 2015-12-31 perché toISOString()fornirà 2015-12-31T22: 00: 00 GMT +0 (due ore prima).
Jérôme Gillard,

29
new Date('Jun 5 2016').
  toLocaleString('en-us', {year: 'numeric', month: '2-digit', day: '2-digit'}).
  replace(/(\d+)\/(\d+)\/(\d+)/, '$3-$1-$2');

// => '2016-06-05'

5
La migliore anima gemella.
زياد,

Per qualche motivo, è necessario aggiungere tempo (anche se 00:00) affinché la conversione non salti un giorno indietro, quando eseguo la formula qui, costa orientale degli Stati Uniti. Una volta che l'ho fatto, ha iniziato a funzionare in modo affidabile. Ciò che amo di questo è che può prendere la data di input in più formati, quindi non devo più preoccuparmene. new Date('Sun Mar 31 2019 00:00:00.000').toLocaleString('en-us', {year: 'numeric', month: '2-digit', day: '2-digit'}).replace(/(\d+)\/(\d+)\/(\d+)/, '$3-$1-$2');
nenea,

24

Oltre alla risposta di oo, vorrei raccomandare di separare le operazioni logiche dal ritorno e metterle invece come ternarie nelle variabili.

Inoltre, utilizzare concat()per garantire la concatenazione sicura delle variabili

Date.prototype.yyyymmdd = function() {
  var yyyy = this.getFullYear();
  var mm = this.getMonth() < 9 ? "0" + (this.getMonth() + 1) : (this.getMonth() + 1); // getMonth() is zero-based
  var dd = this.getDate() < 10 ? "0" + this.getDate() : this.getDate();
  return "".concat(yyyy).concat(mm).concat(dd);
};

Date.prototype.yyyymmddhhmm = function() {
  var yyyymmdd = this.yyyymmdd();
  var hh = this.getHours() < 10 ? "0" + this.getHours() : this.getHours();
  var min = this.getMinutes() < 10 ? "0" + this.getMinutes() : this.getMinutes();
  return "".concat(yyyymmdd).concat(hh).concat(min);
};

Date.prototype.yyyymmddhhmmss = function() {
  var yyyymmddhhmm = this.yyyymmddhhmm();
  var ss = this.getSeconds() < 10 ? "0" + this.getSeconds() : this.getSeconds();
  return "".concat(yyyymmddhhmm).concat(ss);
};

var d = new Date();
document.getElementById("a").innerHTML = d.yyyymmdd();
document.getElementById("b").innerHTML = d.yyyymmddhhmm();
document.getElementById("c").innerHTML = d.yyyymmddhhmmss();
<div>
  yyyymmdd: <span id="a"></span>
</div>
<div>
  yyyymmddhhmm: <span id="b"></span>
</div>
<div>
  yyyymmddhhmmss: <span id="c"></span>
</div>


Se a qualcuno piace usarlo, suggerisco DRY qui, riutilizzare le funzioni già create invece di ripetere lo stesso.
RiZKiT,

@RiZKiT DRY è un principio e non un modello, ma certo, questo può essere migliorato molto. Se dovessi usarlo da solo, probabilmente userei un altro modello e allontanerei i metodi dal prototipo. Ho principalmente scritto l'esempio per mostrare lì dove altri modi per risolvere il problema. Dove la gente lo prende da lì dipende da se stesso
Eric Herlitz,

Bello! Uso ("00" + (this.getDate())).slice(-2)per ottenere i numeri a due cifre. Non esiste alcuna istruzione "if" o "?:" E meno chiamate alla funzione .getX (). Se non un po 'più veloce, è almeno più leggibile.
le hollandais volant,

22

Non mi piace modificare gli oggetti nativi e penso che la moltiplicazione sia più chiara della stringa che riempie la soluzione accettata.

function yyyymmdd(dateIn) {
  var yyyy = dateIn.getFullYear();
  var mm = dateIn.getMonth() + 1; // getMonth() is zero-based
  var dd = dateIn.getDate();
  return String(10000 * yyyy + 100 * mm + dd); // Leading zeros for mm and dd
}

var today = new Date();
console.log(yyyymmdd(today));

Fiddle: http://jsfiddle.net/gbdarren/Ew7Y4/


4
Questa risposta è stata declassata e non so perché. Ho sentito che la matematica è più veloce e più chiara della manipolazione delle stringhe. Se qualcuno sa perché questa è una cattiva risposta, per favore fatemelo sapere.
Darren Griffith,

4
Il moltiplicatore 10000 è lì per spostare a sinistra l'AAAA di 4 posizioni (le cifre del mese e del giorno richiedono 2 cifre ciascuna) e non ha nulla a che fare con il bug Y10K. Mi piace questa risposta e merita rispetto!
A. Masson,

1
Grazie per questa risposta ho creato il violino qui jsfiddle.net/amwebexpert/L6j0omb4
A. Masson

1
Non avevo affatto bisogno della moltiplicazione e non capisco perché sia ​​lì. jsfiddle.net/navyjax2/gbqmv0t5 Altrimenti, lascia perdere, e questa è un'ottima risposta e mi ha aiutato molto.
vapcguy,

1
@ D-Money Ah, ho capito cosa vuoi dire - stai facendo una concatenazione di un tipo diverso aggiungendo i numeri insieme per evitare che si facciano un'operazione matematica diversa l'una sull'altra - un'operazione per non consentire quella normale che " altrimenti li ho incasinati. Buon lavoro! Il mio funziona perché sto usando dei separatori (che dovrei fare .replace('-', '')per far sì che risponda alla domanda del PO), mentre tu eri fedele alla domanda originale del PO e non avrebbe richiesto quel passaggio in più. Eccellente!
vapcguy,

15

Semplice soluzione JS (ES5) senza possibili problemi di salto della data causati dalla stampa di Date.toISOString () in UTC:

var now = new Date();
var todayUTC = new Date(Date.UTC(now.getFullYear(), now.getMonth(), now.getDate()));
return todayUTC.toISOString().slice(0, 10).replace(/-/g, '');

Questo in risposta al commento di @ weberste sulla risposta di @Pierre Guilbert.


now.getMonth () restituirà 0 per gennaio, dovrebbe essere (now.getMonth () + 1)
Jas

2
Sbagliato. La funzione UTC della data prevede che il mese sia compreso tra 0 e 11 (ma sono consentiti altri <0 e> 11).
Ghiro

Perché sostituisci più trattini con uno singolo? Può toISOStringrestituire più trattini successivi?
Michaël Witrant,

Michael - sta sostituendo ogni trattino trovato con un singolo trattino. Ancora non so perché (forse la stringa di sostituzione è solo un segnaposto per un separatore). La "g" indica tutte le occorrenze. Lo schema a cui stai pensando è / [-] + / g
Gerard ONeill il

2
Mi hai reso felice. Ho cercato per giorni un modo semplice per aggirare l'orribile gestione di TimeZone in Javascript, e questo fa il trucco!
Guillaume F.,

10

// UTC/GMT 0
document.write('UTC/GMT 0: ' + (new Date()).toISOString().slice(0, 19).replace(/[^0-9]/g, "")); // 20150812013509

// Client local time
document.write('<br/>Local time: ' + (new Date(Date.now()-(new Date()).getTimezoneOffset() * 60000)).toISOString().slice(0, 19).replace(/[^0-9]/g, "")); // 20150812113509


Questa è la risposta che ho usato. Una linea che tiene conto del fuso orario. Per rispondere alla domanda del poster originale, potremmo fare: (new Date (Date.now () - (new Date ()). GetTimezoneOffset () * 60000)). ToISOString (). Replace (/ [^ 0-9] / g, "") .slice (0,8)
tomwoods

grazie, per ottenere AAAA-MM-GG ho usato: nuova data (Date.now () - (nuova data ()). getTimezoneOffset () * 60000) .toISOString (). slice (0, 10) .replace (/ [ ^ 0-9] / g, "-")
Nick Humphrey,

7

var someDate = new Date();
var dateFormated = someDate.toISOString().substr(0,10);

console.log(dateFormated);


Molto intelligente. Grazie
JMaylin il

4
Non funzionerà poiché new Date () ha un fuso orario e Date.toISOString () è UTC. Vedi la mia risposta
Dormouse,

@Dormouse non è il contrario? new Date()crea un nuovo oggetto data che è solo un wrapper attorno a nr. di ms dal 1970/01/01 00: 00: 00.000 UTC. Quindi toISOStringstampa nel fuso orario locale.
Stijn de Witt,

No, Date.toISOString () stampa in UTC.
Ghiro

7

Un altro modo è utilizzare toLocaleDateStringcon una locale che ha uno standard di formato data big-endian , come Svezia, Lituania, Ungheria, Corea del Sud, ...:

date.toLocaleDateString('se')

Rimuovere i delimitatori ( -) è solo una questione di sostituzione delle non cifre:

console.log( new Date().toLocaleDateString('se').replace(/\D/g, '') );

Questo non ha il potenziale errore che puoi ottenere con i formati di data UTC: la data UTC potrebbe essere un giorno libero rispetto alla data nel fuso orario locale.


6

Puoi semplicemente usare questo codice a una riga per ottenere la data dell'anno

var date = new Date().getFullYear() + "-" + (parseInt(new Date().getMonth()) + 1) + "-" + new Date().getDate();

5

Versione un po 'semplificata per la risposta più popolare in questa discussione https://stackoverflow.com/a/3067896/5437379 :

function toYYYYMMDD(d) {
    var yyyy = d.getFullYear().toString();
    var mm = (d.getMonth() + 101).toString().slice(-2);
    var dd = (d.getDate() + 100).toString().slice(-2);
    return yyyy + mm + dd;
}

5

dateformat è un pacchetto molto usato.

Come usare:

Scarica e installa dateformatda NPM. Richiedilo nel tuo modulo:

const dateFormat = require('dateformat');

e poi basta formattare le tue cose:

const myYYYYmmddDate = dateformat(new Date(), 'yyyy-mm-dd');


4

Questo ragazzo qui => http://blog.stevenlevithan.com/archives/date-time-format ha scritto una format()funzione per JavascriptDate oggetto , quindi può essere utilizzato con formati letterali familiari.

Se hai bisogno di una formattazione completa della data nel Javascript della tua app, usala. Altrimenti se quello che vuoi fare è una tantum, quindi concatenare getYear (), getMonth (), getDay () è probabilmente il più semplice.


4

Lavorando dalla risposta di @oo questo ti restituirà la stringa della data secondo una stringa di formato. Puoi facilmente aggiungere una regex di 2 cifre per l'anno e i millisecondi e simili se ne hai bisogno.

Date.prototype.getFromFormat = function(format) {
    var yyyy = this.getFullYear().toString();
    format = format.replace(/yyyy/g, yyyy)
    var mm = (this.getMonth()+1).toString(); 
    format = format.replace(/mm/g, (mm[1]?mm:"0"+mm[0]));
    var dd  = this.getDate().toString();
    format = format.replace(/dd/g, (dd[1]?dd:"0"+dd[0]));
    var hh = this.getHours().toString();
    format = format.replace(/hh/g, (hh[1]?hh:"0"+hh[0]));
    var ii = this.getMinutes().toString();
    format = format.replace(/ii/g, (ii[1]?ii:"0"+ii[0]));
    var ss  = this.getSeconds().toString();
    format = format.replace(/ss/g, (ss[1]?ss:"0"+ss[0]));
    return format;
};

d = new Date();
var date = d.getFromFormat('yyyy-mm-dd hh:ii:ss');
alert(date);

Non so quanto sia efficiente, soprattutto se si usa molto regex. Probabilmente potrebbe usare un po 'di lavoro che non conosco puro js.


4

Questo codice è stato risolto con la risposta di Pierre Guilbert:

(funziona anche dopo 10000 anni)

YYYYMMDD=new Date().toISOString().slice(0,new Date().toISOString().indexOf("T")).replace(/-/g,"")


3

Di solito uso il codice qui sotto quando devo farlo.

var date = new Date($.now());
var dateString = (date.getFullYear() + '-'
    + ('0' + (date.getMonth() + 1)).slice(-2)
    + '-' + ('0' + (date.getDate())).slice(-2));
console.log(dateString); //Will print "2015-09-18" when this comment was written

Per spiegare, .slice (-2) ci dà gli ultimi due caratteri della stringa.

Quindi, qualunque cosa accada, possiamo aggiungere "0" al giorno o al mese e chiedere solo gli ultimi due poiché quelli sono sempre i due che vogliamo.

Quindi, se MyDate.getMonth () restituisce 9, sarà:

("0" + "9") // Giving us "09"

quindi aggiungendo .slice (-2) su che ci dà gli ultimi due caratteri che è:

("0" + "9").slice(-2)

"09"

Ma se date.getMonth () restituisce 10, sarà:

("0" + "10") // Giving us "010"

quindi aggiungendo .slice (-2) ci danno gli ultimi due caratteri, oppure:

("0" + "10").slice(-2)

"10"

3

Se si utilizza AngularJs (fino a 1.5) è possibile utilizzare il filtro data :

var formattedDate = $filter('date')(myDate, 'yyyyMMdd')

3

Rispondere a un altro per semplicità e leggibilità.
Inoltre, non è consigliabile modificare membri di classi predefinite esistenti con nuovi metodi:

function getDateInYYYYMMDD() {
    let currentDate = new Date();

    // year
    let yyyy = '' + currentDate.getFullYear();

    // month
    let mm = ('0' + (currentDate.getMonth() + 1));  // prepend 0 // +1 is because Jan is 0
    mm = mm.substr(mm.length - 2);                  // take last 2 chars

    // day
    let dd = ('0' + currentDate.getDate());         // prepend 0
    dd = dd.substr(dd.length - 2);                  // take last 2 chars

    return yyyy + "" + mm + "" + dd;
}

var currentDateYYYYMMDD = getDateInYYYYMMDD();
console.log('currentDateYYYYMMDD: ' + currentDateYYYYMMDD);


2

Se non ti dispiace includere una libreria aggiuntiva (ma piccola), Sugar.js offre molte funzionalità utili per lavorare con le date in JavaScript. Per formattare una data, utilizzare la funzione di formattazione :

new Date().format("{yyyy}{MM}{dd}")

2

yyyymmdd=x=>(f=x=>(x<10&&'0')+x,x.getFullYear()+f(x.getMonth()+1)+f(x.getDate()));
alert(yyyymmdd(new Date));


1
aggiungendo una descrizione alla tua risposta, otterrai voti, prova a descrivere un po 'quello che stai facendo in questo codice in modo che altri possano capirlo più chiaramente.
Muhammad Omer Aslam,

In modalità rigorosa o dattiloscritto usa invece "let f, yyyymmdd = x => ...". Le funzioni yyyymmdd e f non sono altrimenti definite.
Max

2

shortcode per il salvataggio!

const dateShortcode = require('date-shortcode')
dateShortcode.parse('{YYYYMMDD}', new Date())
//=> '20180304'

2

Usa padStart :

Date.prototype.yyyymmdd = function() {
    return [
        this.getFullYear(),
        (this.getMonth()+1).toString().padStart(2, '0'), // getMonth() is zero-based
        this.getDate().toString().padStart(2, '0')
    ].join('-');
};

1

Ecco un approccio più generico che consente sia componenti di data che ora ed è identicamente ordinabile come numero o stringa.

In base all'ordine numerico del formato ISO data, converti in un fuso orario locale e rimuovi le cifre non cifre. vale a dire:

// monkey patch version
Date.prototype.IsoNum = function (n) {
    var tzoffset = this.getTimezoneOffset() * 60000; //offset in milliseconds
    var localISOTime = (new Date(this - tzoffset)).toISOString().slice(0,-1);
    return localISOTime.replace(/[-T:\.Z]/g, '').substring(0,n || 20); // YYYYMMDD
}

uso

var d = new Date();
// Tue Jul 28 2015 15:02:53 GMT+0200 (W. Europe Daylight Time)
console.log(d.IsoNum(8));  // "20150728"
console.log(d.IsoNum(12)); // "201507281502"
console.log(d.IsoNum());   // "20150728150253272"

1

Javascript nativo:

new Date().toLocaleString('zu-ZA').slice(0,10).replace(/-/g,'');

1
Questo non riempie i mesi con uno 0 per garantire che il mese sia composto da 2 cifre.
Attila Szeremi,

Hai ragione. L'ho notato in seguito da solo. Devi fare attenzione a testare la formattazione della data su mesi e giorni a due cifre.
Lonnie Best
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.