Javascript ajoute des zéros à ce jour


438

J'ai créé ce script pour calculer la date 10 jours à l'avance au format jj / mm / aaaa:

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

J'ai besoin que la date apparaisse avec des zéros en tête sur le composant jour et mois en ajoutant ces règles au script. Je n'arrive pas à le faire fonctionner.

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

et

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

Si quelqu'un pouvait me montrer où les insérer dans le script, je serais vraiment reconnaissant.


6
Comme bonne convention, vous devez mettre en minuscule le premier caractère de vos noms de variables et réserver le boîtier de chameau pour les objets / prototypes.
zykadelic

Si le format AAAA-MM-JJ est acceptable, ce serait une très bonne réponse: stackoverflow.com/a/28431880/1717535
Fabien Snauwaert

Réponses:


1354

Essayez ceci: 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();

ÉDITER:

Pour expliquer, .slice(-2)nous donne les deux derniers caractères de la chaîne.

Peu importe quoi, nous pouvons ajouter "0" au jour ou au mois, et demander simplement les deux derniers puisque ce sont toujours les deux que nous voulons.

Donc si le MyDate.getMonth()retour 9, ce sera:

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

donc en ajoutant .slice(-2)cela nous donne les deux derniers caractères qui sont:

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

Mais si MyDate.getMonth()revient 10, ce sera:

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

donc l'ajout .slice(-2)nous donne les deux derniers caractères, ou:

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

27
Forked - format de date AAAA-MM-JJ jsfiddle.net/j6qJp/1 Cela peut être utile pour quelqu'un. Merci
tomexx

3
Quelqu'un peut-il expliquer pourquoi c'est mieux que la réponse fournie par @Aleross ci-dessous? Il n'est pas immédiatement clair ce qu'il fait par rapport à la fonction pad qui est explicitement claire.
claudio

2
Sans oublier qu'aujourd'hui cet exemple m'a donné le 26/06/2014 au lieu du 06/06/2014
DazManCat

3
@DazManCat: C'est ce qu'il est censé faire. Le code commence par ajouter 20 jours à la date actuelle. MyDate.setDate(MyDate.getDate() + 20);
monstre cookie

3
@ n00b et @Phil Cooper, sans m'attarder sur une discussion sur les tenants et les aboutissants du chronométrage des routines JavaScript, j'ai trouvé que la slice()technique dans la réponse acceptée est environ 1/10 de seconde plus rapide que la technique de @Aleross pad()sur 1 million d'itérations. jsFiddle . "Payez votre argent, faites votre choix".
Karl

105

Voici un exemple tiré de la documentation de l'objet Date sur le réseau de développeurs Mozilla utilisant une fonction "pad" personnalisée, sans avoir à étendre le prototype Number de Javascript. La fonction pratique qu'ils donnent à titre d'exemple est

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

Et ci-dessous, il est utilisé dans son contexte.

/* 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
Très belle façon de le faire. Je pense que la réponse acceptée est vraiment sympa, mais c'est encore plus propre à mon avis
Binke

1
cela pourrait conduire à des bugs inattendus car il génère une chaîne pour <10 et un nombre pour> = 10
David Fregoli

@DavidFregoli, toutes ces fonctions date à chaîne renvoient une chaîne, donc si vous entrez une chaîne, padne produit que des chaînes.
Rohmer

56

La nouvelle façon moderne de le faire est d'utiliser toLocaleDateString, car elle ne vous permet pas seulement de formater une date avec une localisation appropriée, vous pouvez même passer des options de format pour archiver le résultat souhaité:

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

Lorsque vous ignorez le premier argument, il détectera la langue du navigateur à la place. Alternativement, vous pouvez également utiliser 2-digitl'option de l'année.

Si vous n'avez pas besoin de prendre en charge d'anciens navigateurs comme IE10, c'est la façon la plus propre de faire le travail. IE10 et les versions inférieures ne comprendront pas l'argument des options.

Remarque: En outre, il existe également toLocaleTimeString, si vous souhaitez localiser ou formater l'heure d'une date.


3
C'est exactement ce que je cherchais, merci. Plus d'informations sur les options disponibles pour toLocaleDateString ici: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
JoseLinares

1
@JoseLinares Bonjour, merci d'avoir remis ce lien dans le temps. J'ai juste décidé d'améliorer ma réponse pour rendre la solution plus attrayante pour les scénarios courants, car vous pouvez ignorer le premier argument et IE10 n'est plus pertinent. Dans cet esprit, j'ai inclus votre lien dans ma réponse.
Martin Braun

@modiX, désolé c'était une erreur de code et j'ai mal interprété la description, oui les paramètres régionaux (première variable) sont facultatifs .
Kanhaiya lal

@Kanhaiyalal Ne vous inquiétez pas, des erreurs peuvent survenir. J'ai seulement été surpris que 2 des 3 critiques approuvent également la mauvaise modification.
Martin Braun

51

Vous pouvez définir une fonction "str_pad" (comme en php):

function str_pad(n) {
    return String("00" + n).slice(-2);
}

9
"0" au lieu de "00" suffit
David Fregoli

De loin la meilleure réponse.
Lucas Andrade

30

Pour vous, les gens du futur (ECMAScript 2017 et au-delà)

Solution

"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

Explication

le String.prototype.padStart(targetLength[, padString])ajoute autant que possible padStringdans la String.prototypecible afin que la nouvelle longueur de la cible soit targetLength.

Exemple

"use strict"

let month = "9"

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

let byte = "00000100"

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

4
Cela fait partie de ES2017 ou ES8. Il est donc incorrect de dire "ES6 +" car il ne fait pas partie d'ES6 et ES7.
Noel Llevares

1
Cela devrait être techniquement .padStart(2, '0')puisque le second paramètre est une chaîne, mais il ne sera probablement pas question , à moins que vous utilisez tapuscrit
bmaupin

Vous avez raison, je vais modifier ma réponse.
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;
}

//utilisé:

(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

J'ai trouvé le moyen le plus court de le faire:

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

ajoutera des zéros non significatifs à tous les chiffres solitaires


J'aime cette solution, pouvez-vous peut-être clarifier un peu ce qui s'y passe?
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

Vous pouvez utiliser l'opérateur ternaire pour formater la date comme une instruction "if".

Par exemple:

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

Donc

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

serait similaire à une instruction if, où si getDate () renvoie une valeur inférieure à 10, puis retourne un '0' + la date, ou bien renvoie la date si supérieure à 10 (car nous n'avons pas besoin d'ajouter le début) 0). Idem pour le mois.

Edit: Oublié que getMonth commence par 0, a donc ajouté le +1 pour en tenir compte. Bien sûr, vous pouvez également dire d.getMonth () <9:, mais je pensais que l'utilisation du +1 faciliterait la compréhension.


merci d'avoir expliqué le +1
Bryan A

5

Il existe une autre approche pour résoudre ce problème, à l'aide slicede JavaScript.

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

la datestringdate de retour avec le format que vous attendez: 2019-09-01

une autre approche utilise la dateformatbibliothèque: https://github.com/felixge/node-dateformat


Faites attention à l'orthographe de "JavaScript".
Basil Bourque

3

Simplifiez-vous la vie et utilisez Moment.js un exemple de code:

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

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

4
moment.js -> pas une bonne solution bcos ses 19,8k de code par rapport aux solutions de taille 0,3k ici.
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

Vous pouvez fournir des options comme paramètre pour formater la date. Le premier paramètre est pour les paramètres régionaux dont vous pourriez ne pas avoir besoin et le second est pour les options. Pour plus d'informations, visitez 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
Merci pour vos suggestions.
MJ55

2

J'ai enveloppé la bonne réponse à cette question dans une fonction qui peut ajouter plusieurs zéro de tête mais par défaut, ajouter 1 zéro.

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

pour travailler uniquement avec des nombres et pas plus de 2 chiffres, c'est aussi une approche:

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

1

Une autre option, en utilisant une fonction intégrée pour faire le remplissage (mais résultant en un code assez long!):

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

// '12/06/2017'

Et un autre, manipulant des chaînes avec des expressions régulières:

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

// '2017/06/12'

Mais sachez que l'on affichera l'année au début et le jour à la fin .


a le plus aimé: myDate.getDate (). toLocaleString ('en-US', {minimumIntegerDigits: 2})
Max Alexander Hanna

1

En ajoutant à la réponse @modiX, c'est ce qui fonctionne ... NE LAISSEZ PAS cela comme vide

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

1

Voici un exemple très simple de comment gérer cette situation.

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

Ce qui suit vise à extraire la configuration, à s'y connecter Date.protoypeet à l'appliquer.

J'ai utilisé un Arraypour stocker des morceaux de temps et lorsque je suis push() thisun Dateobjet, il me renvoie la longueur à parcourir. Quand j'ai fini, je peux utiliser joinla returnvaleur.

Cela semble fonctionner assez rapidement: 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();

démo: http://jsfiddle.net/tive/U4MZ3/


0

Ce que je ferais, c'est de créer mon propre assistant de date personnalisé qui ressemble à ceci:

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

(voir aussi ce violon )


0

Ajoutez un peu de remplissage pour permettre un zéro de tête - si nécessaire - et concaténez en utilisant votre délimiteur de choix comme chaîne.

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

Comme le suggère @John Henckel, commencer à utiliser la méthode toISOString () facilite les choses

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
  }

vous pouvez également décrire brièvement ce que vous tentez.
Shiv Kumar Baghel

0

essayez ceci pour une fonction de base, aucune bibliothèque requise

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
Bien que ce code puisse répondre à la question, fournir un contexte supplémentaire concernant la manière et / ou la raison pour laquelle il résout le problème améliorerait la valeur à long terme de la réponse.
leopal

0

Vous pouvez utiliser String.slice () qui extrait une section d'une chaîne et la renvoie comme une nouvelle chaîne, sans modifier la chaîne d'origine:

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

Ou vous pouvez également utiliser une bibliothèque telle que Moment.js pour formater la date:

const moment = require("moment")
const currentDate = moment().format("YYYY-MM-DD") // 2020-04-16
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.