String im Format JJJJMMTT vom JS-Datumsobjekt abrufen?


398

Ich versuche, JS zu verwenden, um a date objectin einen String im YYYYMMDDFormat umzuwandeln. Gibt es einen einfacheren Weg , als verketten Date.getYear(), Date.getMonth()und Date.getDay()?


4
Diese drei zu verketten ist der richtige Weg
Juan Cortés

5
Wenn Sie eine Zeichenfolge wünschen, die auf dasselbe Datum analysiert wird, vergessen Sie nicht, den Monat zu erhöhen. Um Ihrer Spezifikation zu entsprechen, müssen Sie auch einzelne Ziffern im Monat und Datum mit '0'
auffüllen

Antworten:


621

Geänderter Code, den ich oft benutze:

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
Sie sollten ersetzen [1]mit .length===2, weil ein Indexer auf einer Schnur nicht vollständig unterstützt. Siehe diese Antwort aus Gründen warum.
Aidiakapi

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

7
Für alle, die ein praktisches Beispiel für @Aidiakapis Korrektur suchen, erstelle ich hier eine Geige: jsfiddle.net/pcr8xbt5/1
killercowuk

1
Wenn Sie [this.getFullYear(), mm<10 ? '0'+ mm: mm, dd<10 ? '0'+ dd : dd].join('.')
Punkttrenner

3
@ 9dan sollte es nicht seinvar mm = (this.getMonth() + 101).toString().substring(1, 3)
Pnar Sbi Wer

317

Ich mochte es nicht, den Prototyp zu ergänzen. Eine Alternative wäre:

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
Wenn Sie die rightNowVariable nicht benötigen , können new DateSie sie in einer einzigen Zeile (new Date()).toISOString().slice(0,10).replace(/-/g,"")
umbrechen

5
Ich wollte YYYYMMDDHHmmSSsss, also tat ich Folgendes : var ds = (new Date()).toISOString().replace(/[^0-9]/g, "");. Ziemlich einfach, sollte aber gekapselt werden.
Jess

65
Dies funktioniert im Allgemeinen nicht, da Date.toISOString () ein UTC-formatiertes Datum erstellt und daher abhängig von der Zeitzone Datumsgrenzen überspringen kann. ZB in GMT + 1: (neues Datum (2013, 13, 25)). ToISOString () == '2013-12-24T23: 00: 00.000Z'
weberste

26
Dies würde fehlschlagen, wenn jemand im Jahr 10000 Ihren "nostalgischen" Code verwenden würde.
Trevi Awater

9
Eine vorgeschlagene Verbesserung zur Bewältigung von Zeitzonen. rightNow.setMinutes(rightNow.getMinutes() - rightNow.getTimezoneOffset()); rightNow.toISOString().slice(0,10)
Andreas

182

Sie können die toISOStringFunktion verwenden:

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

Sie erhalten ein "JJJJ-MM-TT" -Format.


24
In einigen Fällen wird dies aufgrund des Tageslichts in der Zeitzone usw. nicht den richtigen Tag einschließen.
Miguel

1
Vielleicht ist meine Kreativität bei Miguel kaputt, aber ich kann mir keinen Fall vorstellen, in dem das passieren würde. Würde es Ihnen etwas ausmachen, ein Beispiel zu geben?
Cloudworks

35
Wenn Sie sich in einer Zeitzone von +1 befinden und ein Datum [2015-09-01 00:00:00 GMT + 1] haben, gibt die Methode toISOString () die Zeichenfolge '2015-08-31T23: 00: 00.000Z] zurück ', weil das Datum vor der Zeichenfolge in UTC / 0-Offset konvertiert wird.
Luke Baulch

Ein bisschen kürzer ... var today = (neues Datum ()). ToISOString (). Teilstring (0, 10);
Tee mit Obst

Schlägt mit verschiedenen GMT
fehl

132

Moment.js könnte dein Freund sein

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

18
Nun, es hat 40kb (minimiert, nicht gZip) zu meiner app.js hinzugefügt, aber ich habe mich dafür entschieden, danke :).
Bart

beste Antwort bisher!
TrulyXax

9
Ich mache mir nicht einmal die Mühe zu warten, bis ich unvermeidlich einen Moment mehr brauche, ich füge ihn einfach zu Beginn eines Projekts hinzu :)
martinedwards

1
Sie können es einfacher machen:var formattedDate = moment().format('YYYYMMDD');
ns16

37

Wenn Sie keine reine JS-Lösung benötigen, können Sie die jQuery-Benutzeroberfläche folgendermaßen ausführen:

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

Normalerweise importiere ich nicht gerne zu viele Bibliotheken. Die jQuery-Benutzeroberfläche ist jedoch so nützlich, dass Sie sie wahrscheinlich an einer anderen Stelle in Ihrem Projekt verwenden werden.

Weitere Beispiele finden Sie unter http://api.jqueryui.com/datepicker/


37

Dies ist eine einzelne Codezeile, mit der Sie eine YYYY-MM-DDZeichenfolge mit dem heutigen Datum erstellen können .

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

^ das! FTW! +1 .. müssen allerdings ein bisschen testen.
Gogol

21
Achtung, wenn Ihr Datum 2016-01-01 00:00:00 GMT +2 war, wird es 2015-12-31 zurückgeben, da toISOString()2015-12-31T22: 00: 00 GMT +0 (zwei Stunden zuvor) angezeigt wird .
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
Beste Lösung.
داد

Aus irgendeinem Grund musste Zeit hinzugefügt werden (auch wenn 00:00), damit die Konvertierung keinen Tag zurückspringt, wenn ich die Formel hier an der Ostküste der USA ausführe. Sobald ich das getan hatte, fing es an, zuverlässig zu arbeiten. Was ich daran liebe, ist, dass das Eingabedatum in mehreren Formaten verwendet werden kann, sodass ich mir darüber keine Sorgen mehr machen muss. 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

Zusätzlich zu oos Antwort möchte ich empfehlen, logische Operationen von der Rückgabe zu trennen und sie stattdessen als ternäre Dateien in die Variablen einzufügen.

Verwenden Sie concat()diese Option auch, um eine sichere Verkettung von Variablen zu gewährleisten

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>


Wenn jemand das gerne benutzt, schlage ich hier DRY vor, verwende die bereits erstellten Funktionen wieder, anstatt dasselbe noch einmal zu tun.
RiZKiT

@RiZKiT DRY ist ein Prinzip und kein Muster, aber sicher, dies kann sehr verbessert werden. Wenn ich dies selbst verwenden möchte, würde ich wahrscheinlich ein anderes Muster verwenden und die Methoden vom Prototyp entfernen. Ich habe hauptsächlich das Beispiel geschrieben, um dort zu zeigen, wo andere Möglichkeiten zur Lösung des Problems bestehen. Wo die Leute es von dort nehmen, liegt bei sich selbst
Eric Herlitz

Nett! Ich benutze ("00" + (this.getDate())).slice(-2), um die Zahlen zweistellig zu erhalten. Es gibt keine "if" - oder "?:" - Anweisung und weniger Aufrufe der Funktion .getX (). Wenn nicht ein bisschen schneller, ist es zumindest besser lesbar.
Le Hollandais Volant

22

Ich mag es nicht, native Objekte zu ändern, und ich denke, die Multiplikation ist klarer als die Zeichenfolge, die die akzeptierte Lösung auffüllt.

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));

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


4
Diese Antwort wurde abgelehnt, und ich weiß nicht warum. Ich fand, Mathe ist schneller und klarer als String-Manipulation. Wenn jemand weiß, warum dies eine schlechte Antwort ist, lassen Sie es mich bitte wissen.
Darren Griffith

4
Der 10000-Multiplikator verschiebt das JJJJ um 4 Stellen nach links (Monats- und Tagesziffern benötigen jeweils 2 Ziffern) und hat nichts mit dem Y10K-Fehler zu tun. Ich mag diese Antwort und sie verdient Respekt!
A. Masson

1
Vielen Dank für diese Antwort. Ich habe die Geige hier erstellt. Jsfiddle.net/amwebexpert/L6j0omb4
A. Masson

1
Ich brauchte die Multiplikation überhaupt nicht und verstehe nicht, warum sie da ist. jsfiddle.net/navyjax2/gbqmv0t5 Ansonsten lass das weg, und das ist eine großartige Antwort und hat mir sehr geholfen.
Vapcguy

1
@ D-Money Ah, ich habe herausgefunden, was du meinst - du machst eine Verkettung einer anderen Art, indem du die Zahlen addierst, um zu vermeiden, dass sie eine andere mathematische Operation aufeinander ausführen - eine Operation, um die normale zu verbieten, die ' Ich habe sie sonst durcheinander gebracht. Gut gemacht! Meins funktioniert, weil ich Trennzeichen verwende (was ich tun müsste .replace('-', ''), damit es die Frage des OP beantwortet), während Sie der ursprünglichen Frage des OP treu waren und es diesen zusätzlichen Schritt nicht erfordern würde. Ausgezeichnet!
Vapcguy

15

Einfache JS (ES5) -Lösung ohne mögliche Probleme mit dem Datumssprung, die durch das Drucken von Date.toISOString () in UTC verursacht werden:

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

Dies als Antwort auf den Kommentar von @ weberste zur Antwort von @Pierre Guilbert.


now.getMonth () gibt 0 für Januar zurück, es sollte sein (now.getMonth () + 1)
Jas

2
Falsch. Die UTC-Funktion von Date erwartet, dass der Monat zwischen 0 und 11 liegt (andere <0 und> 11 sind jedoch zulässig).
Siebenschläfer

Warum ersetzen Sie mehrere Bindestriche durch einen einzigen? Können toISOStringmehrere aufeinanderfolgende Bindestriche zurückgegeben werden?
Michaël Witrant

Michael - er ersetzt jeden gefundenen Bindestrich durch einen einzelnen Bindestrich. Ich weiß immer noch nicht warum (vielleicht ist die Ersatzzeichenfolge nur ein Platzhalter für ein Trennzeichen). Das 'g' bedeutet alle Vorkommen. Das Muster, an das Sie denken, ist / [-] + / g
Gerard ONeill

2
Du hast meinen Tag gerettet. Ich habe tagelang nach einer einfachen Möglichkeit gesucht, die schreckliche TimeZone-Behandlung in Javascript zu umgehen, und das macht den Trick!
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


Dies ist die Antwort, die ich verwendet habe. Ein Liner, der die Zeitzone berücksichtigt. Um die Frage des Originalplakats zu beantworten, könnten wir Folgendes tun: (neues Datum (Date.now () - (neues Datum ()). GetTimezoneOffset () * 60000)). ToISOString (). Replace (/ [^ 0-9] / g, "") .slice (0,8)
Tomwoods

thx, um JJJJ-MM-TT zu erhalten, habe ich verwendet: neues Datum (Date.now () - (neues Datum ()). 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);


Sehr schlau. Vielen Dank
JMaylin

4
Funktioniert nicht, da new Date () eine Zeitzone hat und Date.toISOString () UTC ist. Siehe meine Antwort.
Siebenschläfer

@ Siebenschläfer ist es nicht umgekehrt? new Date()Erstellt ein neues Datumsobjekt, das nur ein Wrapper um nr ist. von ms seit 1970/01/01 00: 00: 00.000 UTC. Dann toISOStringdruckt in lokaler Zeitzone aus.
Stijn de Witt

Nein, Date.toISOString () wird in UTC gedruckt.
Siebenschläfer

7

Eine andere Möglichkeit ist die Verwendung toLocaleDateStringmit einem Gebietsschema, das einen Big-Endian-Datumsformatstandard aufweist , z. B. Schweden, Litauen, Ungarn, Südkorea, ...:

date.toLocaleDateString('se')

Um die Trennzeichen ( -) zu entfernen, müssen nur die nicht Ziffern ersetzt werden:

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

Dies hat nicht den potenziellen Fehler, den Sie bei UTC-Datumsformaten erhalten können: Das UTC-Datum kann im Vergleich zum Datum in der lokalen Zeitzone einen Tag frei haben.


6

Sie können einfach diesen einen Zeilencode verwenden, um das Datum im Jahr zu erhalten

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

5

Etwas vereinfachte Version für die beliebteste Antwort in diesem Thread 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

Datumsformat ist ein sehr verwendetes Paket.

Wie benutzt man:

dateformatVon NPM herunterladen und installieren . Benötigen Sie es in Ihrem Modul:

const dateFormat = require('dateformat');

und dann formatiere einfach deine Sachen:

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


4

Dieser Typ hier => http://blog.stevenlevithan.com/archives/date-time-format hat eine format()Funktion für das Javascript geschriebenDate Objekt geschrieben, damit es mit bekannten Literalformaten verwendet werden kann.

Wenn Sie eine Datumsformatierung mit vollem Funktionsumfang im Javascript Ihrer App benötigen, verwenden Sie diese. Andernfalls ist es wahrscheinlich am einfachsten, getYear (), getMonth (), getDay () zu verketten, wenn Sie eine einmalige Aktion ausführen möchten.


4

Wenn Sie anhand der Antwort von @ oo arbeiten, erhalten Sie die Zeichenfolge des Datums gemäß einer Formatzeichenfolge zurück. Sie können ganz einfach einen zweistelligen Jahresregex für das Jahr und die Millisekunden und dergleichen hinzufügen, wenn Sie diese benötigen.

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);

Ich weiß jedoch nicht, wie effizient das ist, besonders wenn es um Perfektion geht, da es viel Regex verwendet. Es könnte wahrscheinlich etwas Arbeit gebrauchen, die ich nicht beherrsche.


4

Dieser Code entspricht der Antwort von Pierre Guilbert:

(es funktioniert auch nach 10000 Jahren)

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


3

Normalerweise verwende ich den folgenden Code, wenn ich dies tun muss.

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

Zur Erklärung gibt .slice (-2) die letzten beiden Zeichen der Zeichenfolge an.

Egal was passiert, wir können dem Tag oder Monat "0" hinzufügen und einfach nach den letzten beiden fragen, da dies immer die beiden sind, die wir wollen.

Wenn also MyDate.getMonth () 9 zurückgibt, ist dies:

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

Wenn Sie also .slice (-2) hinzufügen, erhalten Sie die letzten beiden Zeichen:

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

"09"

Wenn date.getMonth () jedoch 10 zurückgibt, ist dies:

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

Wenn Sie also .slice (-2) hinzufügen, erhalten Sie die letzten beiden Zeichen oder:

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

"10"


3

Beantwortung eines anderen für Einfachheit und Lesbarkeit.
Es wird auch nicht empfohlen, vorhandene vordefinierte Klassenmitglieder mit neuen Methoden zu bearbeiten:

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

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


1
Wenn Sie Ihrer Antwort eine Beschreibung hinzufügen, erhalten Sie positive Stimmen. Versuchen Sie, ein wenig zu beschreiben, was Sie in diesem Code tun, damit andere es besser verstehen können.
Muhammad Omer Aslam

Verwenden Sie im strengen Modus oder im Typoskript stattdessen "let f, yyyymmdd = x => ...". Die Funktionen yyyymmdd und f sind ansonsten undefiniert.
Max


2

Verwenden Sie 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

Hier ist ein allgemeinerer Ansatz, der sowohl Datum als auch Uhrzeit zulässt Komponenten und ist identisch sortierbar entweder als Zahl oder ein String.

Konvertieren Sie basierend auf der Nummernreihenfolge des Datums-ISO-Formats in eine lokale Zeitzone und entfernen Sie nicht Ziffern. dh:

// 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
}

Verwendungszweck

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

Native Javascript:

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

1
Dies füllt Monate nicht mit einer 0 auf, um sicherzustellen, dass der Monat 2-stellig ist.
Attila Szeremi

Du hast recht. Das habe ich später selbst bemerkt. Sie müssen die Datumsformatierung in zweistelligen Monaten und Tagen sorgfältig testen.
Lonnie Best
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.