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.