Javascript aggiunge zeri iniziali ad oggi


437

Ho creato questo script per calcolare la data con 10 giorni di anticipo nel formato gg / mm / aaaa:

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

Ho bisogno che la data appaia con zero iniziali sul componente giorno e mese per aggiungere queste regole allo script. Non riesco a farlo funzionare.

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

e

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

Se qualcuno potesse mostrarmi dove inserirli nella sceneggiatura sarei davvero grato.


6
Come buona convenzione, dovresti mettere in minuscolo il primo carattere nei nomi delle tue variabili e riservare l'involucro del cammello per oggetti / prototipi.
zykadelic,

Se il formato AAAA-MM-GG è accettabile, questa sarebbe un'ottima risposta: stackoverflow.com/a/28431880/1717535
Fabien Snauwaert,

Risposte:


1353

Prova questo: 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();

MODIFICARE:

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

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

Quindi se i MyDate.getMonth()ritorni 9saranno:

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

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

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

Ma se MyDate.getMonth()ritorna 10, sarà:

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

quindi l'aggiunta .slice(-2)ci dà gli ultimi due caratteri, oppure:

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

27
Forked - formato data AAAA-MM-GG jsfiddle.net/j6qJp/1 Potrebbe essere utile per qualcuno. Grazie
tomexx,

3
Qualcuno può spiegare perché questo è meglio della risposta che @Aleross fornisce di seguito? Non è immediatamente chiaro cosa fa rispetto alla funzione pad che è esplicitamente chiara.
claudio

2
Per non parlare del fatto che oggi questo esempio mi ha dato il 26/06/2014 invece del 06/06/2014
DazManCat,

3
@DazManCat: Ecco cosa dovrebbe fare. Il codice inizia aggiungendo 20 giorni alla data corrente. MyDate.setDate(MyDate.getDate() + 20);
mostro biscotto

3
@ n00b e @Phil Cooper, senza essere impiccati in una discussione sui dettagli dei tempi delle routine JavaScript, ho scoperto che la slice()tecnica nella risposta accettata è circa 1/10 di secondo più veloce della tecnica di @Aleross pad()su 1 milione di iterazioni. jsFiddle . "paga i tuoi soldi, fai la tua scelta".
Karl,

105

Ecco un esempio dei documenti oggetto Date sulla rete di sviluppatori Mozilla usando una funzione "pad" personalizzata, senza dover estendere il prototipo Number di Javascript. La pratica funzione che danno come esempio è

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

E di seguito viene utilizzato nel contesto.

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

3
Modo molto carino di farlo. Penso che la risposta accettata sia davvero carina, ma secondo me ancora più pulita
Binke,

1
questo potrebbe portare a bug imprevisti perché genera una stringa per <10 e un numero per> = 10
David Fregoli,

@DavidFregoli, tutte quelle funzioni date da stringa restituiscono una stringa, quindi se si inserisce una stringa, vengono pademesse solo stringhe.
Rohmer,

56

Il nuovo modo moderno per farlo è quello di utilizzare toLocaleDateString, poiché non solo ti consente di formattare una data con una corretta localizzazione, ma puoi anche passare le opzioni di formato per archiviare il risultato desiderato:

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

Quando salti il ​​primo argomento, rileverà invece la lingua del browser. In alternativa, puoi utilizzare anche 2-digitl'opzione dell'anno.

Se non hai bisogno di supportare vecchi browser come IE10, questo è il modo più pulito per fare il lavoro. IE10 e le versioni precedenti non capiranno l'argomento delle opzioni.

Nota: Inoltre, esiste anche toLocaleTimeString, se si desidera localizzare o formattare l'ora di una data.


3
Questo è esattamente quello che stavo cercando, grazie. Maggiori informazioni sulle opzioni disponibili per toLocaleDateString qui: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
JoseLinares

1
@JoseLinares Ciao, grazie per aver ricollegato questo link nei giorni. Ho appena deciso di migliorare la mia risposta per rendere la soluzione più accattivante per scenari comuni, dal momento che puoi saltare il primo argomento e IE10 non è più pertinente. Con questo in mente, ho incluso il tuo link nella mia risposta.
Martin Braun,

@modiX, mi dispiace che sia stato un mio errore nel codice e ho preso nel modo sbagliato la descrizione, Sì, le impostazioni locali (prima variabile) sono opzionali .
Kanhaiya lal,

@Kanhaiyalal Non preoccuparti, possono verificarsi errori. Sono rimasto sorpreso solo dal fatto che 2 dei 3 revisori abbiano approvato anche la modifica sbagliata.
Martin Braun,


30

Per voi persone dal futuro (ECMAScript 2017 e oltre)

Soluzione

"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

spiegazione

la String.prototype.padStart(targetLength[, padString])aggiunge il maggior numero possibile padStringnel String.prototypebersaglio in modo che la nuova lunghezza del bersaglio è targetLength.

Esempio

"use strict"

let month = "9"

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

let byte = "00000100"

byte = byte.padStart(8, "0") // "00000100"

4
Questo fa parte di ES2017 o ES8. Quindi non è corretto dire "ES6 +" in quanto non fa parte di ES6 ed ES7.
Noel Llevares,

1
Questo dovrebbe tecnicamente essere .padStart(2, '0')dato che il secondo parametro è una stringa, anche se probabilmente non importerà a meno che tu non stia usando TypeScript
bmaupin

Hai ragione, modificherò la mia risposta.
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 uso:

(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
*/

10

Ho trovato il modo più breve per farlo:

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

aggiungerà zeri iniziali a tutte le cifre singole e singole


Mi piace questa soluzione, potresti forse chiarire un po 'cosa succede lì?
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();

5

È possibile utilizzare l'operatore ternario per formattare la data come un'istruzione "if".

Per esempio:

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

Così

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

sarebbe simile a un'istruzione if, dove if getDate () restituisce un valore inferiore a 10, quindi restituisce uno '0' + la data, oppure restituisce la data se maggiore di 10 (poiché non è necessario aggiungere il valore iniziale 0). Lo stesso per il mese.

Modifica: ho dimenticato che getMonth inizia con 0, quindi ho aggiunto +1 per renderlo conto. Ovviamente potresti anche dire d.getMonth () <9:, ma ho pensato che usare il +1 avrebbe aiutato a capire meglio.


grazie per aver spiegato il +1
Bryan A

5

C'è un altro approccio per risolvere questo problema, usando slicein JavaScript.

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

la datestringdata di ritorno con il formato previsto: 2019-09-01

un altro approccio sta usando la dateformatlibreria: https://github.com/felixge/node-dateformat


Fai attenzione a scrivere "JavaScript".
Basil Bourque,

3

Semplifica la vita e usa Moment.js del codice di esempio:

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

// Now will print 30-06-2015 17:55
console.log(beginDateTime);

4
moment.js -> non è una buona soluzione grazie ai suoi 19,8k di codice rispetto alle soluzioni di dimensioni 0,3k qui.
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();
}

3

È possibile fornire opzioni come parametro per formattare la data. Il primo parametro è per le impostazioni internazionali che potrebbero non essere necessarie e il secondo per le opzioni. Per maggiori informazioni visita 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));

1
Grazie per i suggerimenti
MJ55

2

Ho racchiuso la risposta corretta di questa domanda in una funzione che può aggiungere più zero iniziali ma per impostazione predefinita aggiunge 1 zero.

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

per lavorare solo con numeri e non più di 2 cifre, questo è anche un approccio:

function zeroFill(i) {
    return (i < 10 ? '0' : '') + i
  }

1

Un'altra opzione, utilizzando una funzione integrata per eseguire il riempimento (ma risulta in un codice piuttosto lungo!):

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

// '12/06/2017'

E un altro, manipolando le stringhe con espressioni regolari:

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

// '2017/06/12'

Ma sappi che uno mostrerà l'anno all'inizio e il giorno alla fine .


mi è piaciuto di più: myDate.getDate (). toLocaleString ('en-US', {minimumIntegerDigits: 2})
Max Alexander Hanna

1

Aggiungendo alla risposta @modiX, questo è ciò che funziona ... NON LASCIARLO come vuoto

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

1

Ecco un esempio molto semplice di come gestire questa situazione.

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


0

Lo scopo seguente è quello di estrarre la configurazione, agganciarla Date.protoypee applicarla.

Ho usato un Arrayper memorizzare i blocchi di tempo e quando io push() thiscome Dateoggetto, mi restituisce la lunghezza per iterare. Quando ho finito, posso usare joinil returnvalore.

Questo sembra funzionare abbastanza velocemente: 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/


0

Quello che vorrei fare è creare il mio aiutante personalizzato per la data che assomigli a questo:

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

(vedi anche questo violino )


0

Aggiungi un po 'di padding per consentire uno zero iniziale - dove necessario - e concatenalo usando il delimitatore scelto come stringa.

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('/');

0

Come suggerisce @ John Henckel, iniziare a usare il metodo toISOString () semplifica le cose

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


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
  }

puoi anche descrivere in breve cosa cerchi.
Shiv Kumar Baghel,

0

prova questo per una funzione di base, non sono necessarie librerie

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

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())}`);

2
Mentre questo codice può rispondere alla domanda, fornire un contesto aggiuntivo riguardo a come e / o perché risolve il problema migliorerebbe il valore a lungo termine della risposta.
leopal

0

Puoi usare String.slice () che estrae una sezione di una stringa e la restituisce come una nuova stringa, senza modificare la stringa originale:

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

Oppure puoi anche usare una libreria come Moment.js per formattare la data:

const moment = require("moment")
const currentDate = moment().format("YYYY-MM-DD") // 2020-04-16
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.