Javascript fügt bisher führende Nullen hinzu

437

Ich habe dieses Skript erstellt, um das Datum 10 Tage im Voraus im Format TT / MM / JJJJ zu berechnen:

var MyDate = new Date();
var MyDateString = new Date();
MyDate.setDate(MyDate.getDate()+10);
MyDateString = MyDate.getDate() + '/' + (MyDate.getMonth()+1) + '/' + MyDate.getFullYear();

Ich muss das Datum mit führenden Nullen in der Tag- und Monatskomponente anzeigen lassen, indem ich diese Regeln zum Skript hinzufüge. Ich kann es nicht zum Laufen bringen.

if (MyDate.getMonth < 10)getMonth = '0' + getMonth;

und

if (MyDate.getDate <10)get.Date = '0' + getDate;

Wenn mir jemand zeigen könnte, wo ich diese in das Skript einfügen soll, wäre ich sehr dankbar.

Julian Coates
quelle
6
Als gute Konvention sollten Sie das erste Zeichen in Ihren Variablennamen in Kleinbuchstaben schreiben und das Kamelgehäuse für Objekte / Prototypen reservieren.
Zykadelic
Wenn das JJJJ-MM-TT-Format akzeptabel ist, wäre dies eine sehr gute Antwort: stackoverflow.com/a/28431880/1717535
Fabien Snauwaert

Antworten:

1351

Versuchen Sie Folgendes : http://jsfiddle.net/xA5B7/

var MyDate = new Date();
var MyDateString;

MyDate.setDate(MyDate.getDate() + 20);

MyDateString = ('0' + MyDate.getDate()).slice(-2) + '/'
             + ('0' + (MyDate.getMonth()+1)).slice(-2) + '/'
             + MyDate.getFullYear();

BEARBEITEN:

Zur Erklärung .slice(-2)geben Sie uns die letzten beiden Zeichen der Zeichenfolge.

Also egal was, wir können hinzufügen "0" den Tag oder den Monat und nur nach den letzten beiden fragen, da dies immer die beiden sind, die wir wollen.

Also, wenn die MyDate.getMonth()Rückkehr 9, wird es sein:

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

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

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

Aber wenn MyDate.getMonth()zurückkommt 10, wird es sein:

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

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

("0" + "10").slice(-2)
"10"
user113716
quelle
27
Gabel - Datumsformat JJJJ-MM-TT jsfiddle.net/j6qJp/1 Es kann für jemanden nützlich sein. Vielen Dank
Tomexx
3
Kann jemand erklären, warum dies besser ist als die Antwort, die @Aleross unten gibt? Es ist nicht sofort klar, was es im Vergleich zur Pad-Funktion tut, die explizit klar ist.
Claudio
2
Ganz zu schweigen davon, dass mir dieses Beispiel heute den 26.06.2014 statt den 06.06.2014 gegeben hat
DazManCat
3
@DazManCat: Genau das soll es tun. Der Code beginnt mit dem Hinzufügen von 20 Tagen zum aktuellen Datum. MyDate.setDate(MyDate.getDate() + 20);
Cookie Monster
3
@ n00b und @Phil Cooper, ohne sich auf eine Diskussion über die Vor- und Nachteile des Timings von JavaScript-Routinen einzulassen, stellte ich fest, dass die slice()Technik in der akzeptierten Antwort etwa 1/10 Sekunde schneller ist als die pad()Technik von @Aleross 1 Million Iterationen. jsFiddle . "Zahlen Sie Ihr Geld, treffen Sie Ihre Wahl".
Karl
105

Hier ist ein Beispiel aus den Datumsobjektdokumenten im Mozilla Developer Network, das eine benutzerdefinierte "Pad" -Funktion verwendet, ohne dass der Number-Prototyp von Javascript erweitert werden muss. Die praktische Funktion, die sie als Beispiel geben, ist

function pad(n){return n<10 ? '0'+n : n}

Und unten wird es im Kontext verwendet.

/* use a function for the exact format desired... */
function ISODateString(d){
    function pad(n){return n<10 ? '0'+n : n}
    return d.getUTCFullYear()+'-'
    + pad(d.getUTCMonth()+1)+'-'
    + pad(d.getUTCDate())+'T'
    + pad(d.getUTCHours())+':'
    + pad(d.getUTCMinutes())+':'
    + pad(d.getUTCSeconds())+'Z'
}

var d = new Date();
console.log(ISODateString(d)); // prints something like 2009-09-28T19:03:12Z
Alex Ross
quelle
3
Sehr schöne Art, es zu tun. Ich denke, die akzeptierte Antwort ist wirklich nett, aber dies ist meiner Meinung nach noch sauberer
Binke
1
Dies könnte zu unerwarteten Fehlern führen, da eine Zeichenfolge für <10 und eine Zahl für> = 10
ausgegeben wird
@DavidFregoli, alle Funktionen für Datum und Zeichenfolge geben eine Zeichenfolge zurück. Wenn Sie also eine Zeichenfolge eingeben, padwerden nur Zeichenfolgen ausgegeben.
Rohmer
55

Die neue moderne Methode hierfür ist die Verwendung toLocaleDateString, da Sie damit nicht nur ein Datum mit der richtigen Lokalisierung formatieren können, sondern auch Formatoptionen übergeben können, um das gewünschte Ergebnis zu archivieren:

var date = new Date(2018, 2, 1);
var result = date.toLocaleDateString("en-GB", { // you can skip the first argument
  year: "numeric",
  month: "2-digit",
  day: "2-digit",
});
console.log(result);

Wenn Sie das erste Argument überspringen, wird stattdessen die Browsersprache erkannt. Alternativ können Sie auch 2-digitdie Jahresoption verwenden.

Wenn Sie alte Browser wie IE10 nicht unterstützen müssen, ist dies der sauberste Weg, um die Arbeit zu erledigen. IE10 und niedrigere Versionen verstehen das Optionsargument nicht.

Hinweis: Darüber hinaus gibt es auch toLocaleTimeStringdie Möglichkeit, die Uhrzeit eines Datums zu lokalisieren oder zu formatieren.

Martin Braun
quelle
3
Genau das habe ich gesucht, danke. Weitere Informationen zu den für toLocaleDateString verfügbaren Optionen finden Sie hier: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
JoseLinares
1
@ JoseLinares Hallo, danke, dass du diesen Link in die Vergangenheit zurückgesetzt hast. Ich habe gerade beschlossen, meine Antwort zu verbessern, um die Lösung für gängige Szenarien attraktiver zu machen, da Sie das erste Argument überspringen können und IE10 nicht mehr relevant ist. In diesem Sinne habe ich Ihren Link in meine Antwort aufgenommen.
Martin Braun
@modiX, sorry, es war ein Fehler im Code und ich habe die Beschreibung falsch verstanden. Ja, die Gebietsschemas (erste Variable) sind optional .
Kanhaiya lal
@Kanhaiyalal Keine Sorge, Fehler können passieren. Ich war nur überrascht, dass 2 der 3 Rezensenten auch die falsche Bearbeitung genehmigten.
Martin Braun
51

Sie können eine "str_pad" -Funktion definieren (wie in PHP):

function str_pad(n) {
    return String("00" + n).slice(-2);
}
joan16v
quelle
9
"0" statt "00" ist genug
David Fregoli
Beste Antwort bei weitem.
Lucas Andrade
29

Für Sie Menschen aus der Zukunft (ECMAScript 2017 und darüber hinaus)

Lösung

"use strict"

const today = new Date()

const year = today.getFullYear()

const month = `${today.getMonth() + 1}`.padStart(2, "0")

const day = `${today.getDate()}`.padStart(2, "0")

const stringDate = [day, month, year].join("/") // 13/12/2017

Erklärung

Das String.prototype.padStart(targetLength[, padString])fügt so viele wie möglich padStringzum String.prototypeZiel hinzu, so dass die neue Länge des Ziels ist targetLength.

Beispiel

"use strict"

let month = "9"

month = month.padStart(2, "0") // "09"

let byte = "00000100"

byte = byte.padStart(8, "0") // "00000100"
Amin NAIRI
quelle
4
Dies ist Teil von ES2017 oder ES8. Es ist also falsch, "ES6 +" zu sagen, da es nicht Teil von ES6 und ES7 ist.
Noel Llevares
Dies sollte technisch gesehen so sein, .padStart(2, '0')da der zweite Parameter eine Zeichenfolge ist, obwohl dies wahrscheinlich keine Rolle spielt, es sei denn, Sie verwenden TypeScript
bmaupin
Sie haben Recht, ich werde meine Antwort bearbeiten.
Amin NAIRI
11
Number.prototype.padZero= function(len){
 var s= String(this), c= '0';
 len= len || 2;
 while(s.length < len) s= c + s;
 return s;
}

//in Benutzung:

(function(){
 var myDate= new Date(), myDateString;
 myDate.setDate(myDate.getDate()+10);

 myDateString= [myDate.getDate().padZero(),
 (myDate.getMonth()+1).padZero(),
 myDate.getFullYear()].join('/');

 alert(myDateString);
})()

/*  value: (String)
09/09/2010
*/
kennebec
quelle
10

Ich habe den kürzesten Weg gefunden, dies zu tun:

 MyDateString.replace(/(^|\D)(\d)(?!\d)/g, '$10$2');

fügt allen einsamen, einstelligen Ziffern führende Nullen hinzu

Povesma Dmytro
quelle
Ich mag diese Lösung, können Sie vielleicht ein bisschen klarstellen, was dort passiert?
Gobliins
7
var MyDate = new Date();
var MyDateString = '';
MyDate.setDate(MyDate.getDate());
var tempoMonth = (MyDate.getMonth()+1);
var tempoDate = (MyDate.getDate());
if (tempoMonth < 10) tempoMonth = '0' + tempoMonth;
if (tempoDate < 10) tempoDate = '0' + tempoDate;
MyDateString = tempoDate + '/' + tempoMonth + '/' + MyDate.getFullYear();
meaa
quelle
5

Sie können den ternären Operator verwenden, um das Datum wie eine "if" -Anweisung zu formatieren.

Zum Beispiel:

var MyDate = new Date();
MyDate.setDate(MyDate.getDate()+10);
var MyDateString = (MyDate.getDate() < 10 ? '0' + MyDate.getDate() : MyDate.getDate()) + '/' + ((d.getMonth()+1) < 10 ? '0' + (d.getMonth()+1) : (d.getMonth()+1)) + '/' + MyDate.getFullYear();

Damit

(MyDate.getDate() < 10 ? '0' + MyDate.getDate() : MyDate.getDate())

Dies ähnelt einer if-Anweisung, bei der getDate () einen Wert kleiner als 10 zurückgibt, dann eine '0' + das Datum zurückgibt oder das Datum zurückgibt, wenn es größer als 10 ist (da wir den führenden Wert nicht hinzufügen müssen 0). Gleiches gilt für den Monat.

Bearbeiten: Ich habe vergessen, dass getMonth mit 0 beginnt, also habe ich +1 hinzugefügt, um dies zu berücksichtigen. Natürlich könnte man auch einfach d.getMonth () <9: sagen, aber ich dachte, die Verwendung von +1 würde das Verständnis erleichtern.

Hallojeffy
quelle
Vielen Dank für die Erklärung der +1
Bryan A
5

Es gibt einen anderen Ansatz, um dieses Problem mithilfe slicevon JavaScript zu lösen .

var d = new Date();
var datestring = d.getFullYear() + "-" + ("0"+(d.getMonth()+1)).slice(-2) +"-"+("0" + d.getDate()).slice(-2);

das datestring Rückgabedatum mit dem von Ihnen erwarteten Format: 2019-09-01

Ein anderer Ansatz ist die Verwendung der dateformatBibliothek: https://github.com/felixge/node-dateformat

Behnam Shateri
quelle
Achten Sie auf die Schreibweise von "JavaScript".
Basil Bourque
3

Erleichtern Sie sich das Leben und verwenden Sie Moment.js Beispielcode:

var beginDateTime = moment()
  .format('DD-MM-YYYY HH:mm')
  .toString();

// Now will print 30-06-2015 17:55
console.log(beginDateTime);
Gonzalo Bahamondez
quelle
4
moment.js -> keine gute Lösung, da es 19,8 KB Code im Vergleich zu den 0,3 KB großen Lösungen hier gibt.
MarcoZen
3
function formatDate(jsDate){
  // add leading zeroes to jsDate when days or months are < 10.. 
  // i.e.
  //     formatDate(new Date("1/3/2013")); 
  // returns
  //    "01/03/2103"
  ////////////////////
  return (jsDate.getDate()<10?("0"+jsDate.getDate()):jsDate.getDate()) + "/" + 
      ((jsDate.getMonth()+1)<10?("0"+(jsDate.getMonth()+1)):(jsDate.getMonth()+1)) + "/" + 
      jsDate.getFullYear();
}
Alex
quelle
3

Sie können Optionen als Parameter zum Formatieren des Datums angeben. Der erste Parameter bezieht sich auf das Gebietsschema, das Sie möglicherweise nicht benötigen, und der zweite auf Optionen. Weitere Informationen finden Sie unter https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleDateString

var date = new Date(Date.UTC(2012, 1, 1, 3, 0, 0));
var options = { year: 'numeric', month: '2-digit', day: '2-digit' };
console.log(date.toLocaleDateString(undefined,options));
MJ55
quelle
1
Vielen Dank für Vorschläge.
MJ55
2

Ich habe die richtige Antwort auf diese Frage in eine Funktion eingeschlossen, die mehrere führende Nullen hinzufügen kann, aber standardmäßig 1 Null hinzufügt.

function zeroFill(nr, depth){
  depth = (depth === undefined)? 1 : depth;

  var zero = "0";
  for (var i = 0; i < depth; ++i) {
    zero += "0";
  }

  return (zero + nr).slice(-(depth + 1));
}

Dies ist auch ein Ansatz für die Arbeit mit Zahlen und nicht mehr als 2 Ziffern:

function zeroFill(i) {
    return (i < 10 ? '0' : '') + i
  }
Robbie Bardijn
quelle
1

Eine weitere Option, bei der eine integrierte Funktion zum Auffüllen verwendet wird (was jedoch zu ziemlich langem Code führt!):

myDateString = myDate.getDate().toLocaleString('en-US', {minimumIntegerDigits: 2})
  + '/' + (myDate.getMonth()+1).toLocaleString('en-US', {minimumIntegerDigits: 2})
  + '/' + myDate.getFullYear();

// '12/06/2017'

Und noch eine, die Strings mit regulären Ausdrücken manipuliert:

var myDateString = myDate.toISOString().replace(/T.*/, '').replace(/-/g, '/');

// '2017/06/12'

Aber sei dir bewusst, dass man das Jahr am Anfang und den Tag am Ende zeigen wird .

joeytwiddle
quelle
hat mir am besten gefallen: myDate.getDate (). toLocaleString ('en-US', {minimalIntegerDigits: 2})
Max Alexander Hanna
1

Wenn Sie die @ modiX-Antwort hinzufügen, funktioniert dies ... LASSEN SIE DAS NICHT als leer

today.toLocaleDateString("default", {year: "numeric", month: "2-digit", day: "2-digit"})
Francis
quelle
1

Hier ist ein sehr einfaches Beispiel, wie Sie mit dieser Situation umgehen können.

var mydate = new Date();

var month = (mydate.getMonth().toString().length < 2 ? "0"+mydate.getMonth().toString() :mydate.getMonth());

var date = (mydate.getDate().toString().length < 2 ? "0"+mydate.getDate().toString() :mydate.getDate());

var year = mydate.getFullYear();

console.log("Format Y-m-d : ",year+"-"+month+"-" + date);

console.log("Format Y/m/d : ",year+"/"+month+"/" + date);

Vikas Kandari
quelle
0

Das Folgende zielt darauf ab, die Konfiguration zu extrahieren, sich anzuschließen Date.protoypeund die Konfiguration anzuwenden.

Ich habe ein verwendet Array, um Zeitblöcke zu speichern, und wenn ich push() thisals DateObjekt bin , gibt es mir die Länge zurück, die ich durchlaufen muss. Wenn ich fertig bin, kann ich joinden returnWert verwenden.

Dies scheint ziemlich schnell zu funktionieren: 0,016 ms

// Date protoype
Date.prototype.formatTime = function (options) {
    var i = 0,
        time = [],
        len = time.push(this.getHours(), this.getMinutes(), this.getSeconds());

    for (; i < len; i += 1) {
        var tick = time[i];
        time[i] = tick < 10 ? options.pad + tick : tick;
    }

    return time.join(options.separator);
};

// Setup output
var cfg = {
    fieldClock: "#fieldClock",
    options: {
        pad: "0",
        separator: ":",
        tick: 1000
    }
};

// Define functionality
function startTime() {
    var clock = $(cfg.fieldClock),
        now = new Date().formatTime(cfg.options);

    clock.val(now);
    setTimeout(startTime, cfg.options.tick);
}

// Run once
startTime();

Demo: http://jsfiddle.net/tive/U4MZ3/

Tim Vermaelen
quelle
0

Ich würde meinen eigenen benutzerdefinierten Date-Helfer erstellen, der folgendermaßen aussieht:

var DateHelper = {
    addDays : function(aDate, numberOfDays) {
        aDate.setDate(aDate.getDate() + numberOfDays); // Add numberOfDays
        return aDate;                                  // Return the date
    },
    format : function format(date) {
        return [
           ("0" + date.getDate()).slice(-2),           // Get day and pad it with zeroes
           ("0" + (date.getMonth()+1)).slice(-2),      // Get month and pad it with zeroes
           date.getFullYear()                          // Get full year
        ].join('/');                                   // Glue the pieces together
    }
}

// With this helper, you can now just use one line of readable code to :
// ---------------------------------------------------------------------
// 1. Get the current date
// 2. Add 20 days
// 3. Format it
// 4. Output it
// ---------------------------------------------------------------------
document.body.innerHTML = DateHelper.format(DateHelper.addDays(new Date(), 20));

(siehe auch diese Geige )

John Slegers
quelle
0

Fügen Sie eine Auffüllung hinzu, um - wo erforderlich - eine führende Null zuzulassen, und verketten Sie sie mit dem Trennzeichen Ihrer Wahl als Zeichenfolge.

Number.prototype.padLeft = function(base,chr){
        var  len = (String(base || 10).length - String(this).length)+1;
        return len > 0? new Array(len).join(chr || '0')+this : this;
    }

var d = new Date(my_date);
var dformatted = [(d.getMonth()+1).padLeft(), d.getDate().padLeft(), d.getFullYear()].join('/');
TV-C-15
quelle
0

Wie @John Henckel vorschlägt, erleichtert die Verwendung der toISOString () -Methode die Arbeit

const dateString = new Date().toISOString().split('-');
const year = dateString[0];
const month = dateString[1];
const day = dateString[2].split('T')[0];

console.log(`${year}-${month}-${day}`);

Mario
quelle
0
 let date = new Date();
 let dd = date.getDate();//day of month

 let mm = date.getMonth();// month
 let yyyy = date.getFullYear();//day of week
 if (dd < 10) {//if less then 10 add a leading zero
     dd = "0" + dd;
   }
 if (mm < 10) {
    mm = "0" + mm;//if less then 10 add a leading zero
  }
Deaner
quelle
Sie können auch kurz beschreiben, was Sie versuchen.
Shiv Kumar Baghel
0

Versuchen Sie dies für eine Grundfunktion, keine Bibliotheken erforderlich

Date.prototype.CustomformatDate = function() {
 var tmp = new Date(this.valueOf());
 var mm = tmp.getMonth() + 1;
 if (mm < 10) mm = "0" + mm;
 var dd = tmp.getDate();
 if (dd < 10) dd = "0" + dd;
 return mm + "/" + dd + "/" + tmp.getFullYear();
};
vishu2124
quelle
0
function pad(value) {
    return value.tostring().padstart(2, 0);
}

let d = new date();
console.log(d);
console.log(`${d.getfullyear()}-${pad(d.getmonth() + 1)}-${pad(d.getdate())}t${pad(d.gethours())}:${pad(d.getminutes())}:${pad(d.getseconds())}`);
Guilherme Oliveira
quelle
2
Während dieser Code die Frage möglicherweise beantwortet, würde die Bereitstellung eines zusätzlichen Kontexts darüber, wie und / oder warum das Problem gelöst wird, den langfristigen Wert der Antwort verbessern.
Leopal
0

Sie können String.slice () verwenden, das einen Abschnitt eines Strings extrahiert und als neuen String zurückgibt, ohne den ursprünglichen String zu ändern :

const currentDate = new Date().toISOString().slice(0, 10) // 2020-04-16

Sie können auch eine Bibliothek wie Moment.js verwenden, um das Datum zu formatieren:

const moment = require("moment")
const currentDate = moment().format("YYYY-MM-DD") // 2020-04-16
Julia Ramos
quelle