Obtenir une chaîne au format AAAAMMJJ à partir d'un objet de date JS?


398

J'essaie d'utiliser JS pour transformer date objectune chaîne en YYYYMMDDformat. Est - il un moyen plus facile que concaténer Date.getYear(), Date.getMonth()et Date.getDay()?


4
Concaténer ces trois est la voie à suivre
Juan Cortés

5
si vous voulez une chaîne qui analysera la même date, n'oubliez pas d'incrémenter le mois. Pour correspondre à vos spécifications, vous devez également
saisir des

Réponses:


621

Morceau de code modifié que j'utilise souvent:

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
Vous devez remplacer [1]par .length===2, car un indexeur sur une chaîne n'est pas entièrement pris en charge. Voir cette réponse pour les raisons.
Aidiakapi

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

7
Pour ceux qui veulent un exemple pratique du correctif de @Aidiakapi, je crée un violon ici: jsfiddle.net/pcr8xbt5/1
killercowuk

1
Si vous voulez avoir un séparateur de points:[this.getFullYear(), mm<10 ? '0'+ mm: mm, dd<10 ? '0'+ dd : dd].join('.')
Kamil Kiełczewski

3
@ 9dan ne devrait-il pas êtrevar mm = (this.getMonth() + 101).toString().substring(1, 3)
Pnar Sbi Wer

318

Je n'ai pas aimé ajouter au prototype. Une alternative serait:

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
Si vous n'avez pas besoin de la rightNowvariable, vous pouvez envelopper new Dateet tout récupérer en une seule ligne:(new Date()).toISOString().slice(0,10).replace(/-/g,"")
BigBlueHat

5
Je voulais YYYYMMDDHHmmSSsss, donc je l'ai fait: var ds = (new Date()).toISOString().replace(/[^0-9]/g, "");. Assez simple, mais devrait être encapsulé.
Jess

65
Cela ne fonctionnera pas en général car Date.toISOString () crée une date au format UTC et peut donc dépasser les limites de date en fonction du fuseau horaire. Par exemple en GMT + 1: (nouvelle date (2013,13, 25)). ToISOString () == '2013-12-24T23: 00: 00.000Z'
weberste

26
Cela échouerait si quelqu'un en l'an 10000 utilisait votre code «nostalgique».
Trevi Awater

10
Une amélioration suggérée pour faire face aux fuseaux horaires. rightNow.setMinutes(rightNow.getMinutes() - rightNow.getTimezoneOffset()); rightNow.toISOString().slice(0,10)
Andreas

182

Vous pouvez utiliser la toISOStringfonction:

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

Il vous donnera un format "aaaa-mm-jj".


24
Dans certains cas, cela n'inclura pas le bon jour, à cause de la lumière du jour du fuseau horaire, etc.
Miguel

1
Peut-être que ma créativité est brisée @Miguel, mais je ne pense pas à un cas où cela se produirait. Pourriez-vous donner un exemple?
cloudworks

35
Si vous êtes dans un fuseau horaire +1 et avez une date [2015-09-01 00:00:00 GMT + 1], la méthode toISOString () renverra la chaîne '2015-08-31T23: 00: 00.000Z ', car la date est convertie en décalage UTC / 0 avant d'être chaîne.
Luke Baulch

Un peu plus court ... var today = (new Date ()). ToISOString (). Substring (0, 10);
teawithfruit du

Échoue avec différents GMT
Tobia

133

Moment.js pourrait être votre ami

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

18
Eh bien, j'ai ajouté 40 ko (minifié, non gZip) à mon app.js, mais j'y suis allé, merci :).
Bart

meilleure réponse jusqu'à présent!
TrulyXax

9
Je ne prends même pas la peine d'attendre d'avoir inévitablement besoin de plus de temps, je l'ajoute juste au début d'un projet :)
martinedwards

1
Vous pouvez le rendre plus facile:var formattedDate = moment().format('YYYYMMDD');
ns16

37

Si vous n'avez pas besoin d'une solution JS pure, vous pouvez utiliser l'interface utilisateur jQuery pour effectuer le travail comme ceci:

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

Je n'aime généralement pas importer trop de bibliothèques. Mais jQuery UI est si utile que vous l'utiliserez probablement ailleurs dans votre projet.

Visitez http://api.jqueryui.com/datepicker/ pour plus d'exemples


37

Il s'agit d'une seule ligne de code que vous pouvez utiliser pour créer une YYYY-MM-DDchaîne de la date du jour.

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

^ ça! FTW! +1 .. besoin de tester un peu cependant.
Gogol

21
Attention, si votre date était 2016-01-01 00:00:00 GMT +2, elle retournera 2015-12-31 car toISOString()donnera 2015-12-31T22: 00: 00 GMT +0 (deux heures avant).
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
Meilleure soultion.
زياد

Pour une raison quelconque, je devais ajouter du temps (même si 00:00) pour que la conversion ne saute pas un jour en arrière, lorsque j'exécute la formule ici, sur la côte est des États-Unis. Une fois que j'ai fait cela, cela a commencé à fonctionner de manière fiable. Ce que j'aime à ce sujet, c'est qu'il peut prendre la date d'entrée dans plusieurs formats, donc je n'ai plus à m'en soucier. 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

En plus de la réponse de oo, je voudrais recommander de séparer les opérations logiques du retour et de les mettre en tant que ternaires dans les variables.

Aussi, utilisez concat()pour assurer une concaténation sûre des variables

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>


Si quelqu'un aime l'utiliser, je suggère DRY ici, réutilisez les fonctions déjà créées au lieu de recommencer.
RiZKiT

@RiZKiT DRY est un principe et non un modèle mais bien sûr, cela peut être beaucoup amélioré. Si je devais l'utiliser moi-même, j'utiliserais probablement un autre modèle et éloignerais les méthodes du prototype. J'ai principalement écrit l'exemple pour montrer là où d'autres moyens de résoudre le problème. Là où les gens le prennent, c'est à eux de
décider

Agréable! J'utilise ("00" + (this.getDate())).slice(-2)pour obtenir les chiffres à deux chiffres. Il n'y a aucune instruction "if" ou "?:", Et moins d'appels à la fonction .getX (). Si ce n'est pas un peu plus vite, c'est au moins plus lisible.
le hollandais volant

22

Je n'aime pas modifier les objets natifs, et je pense que la multiplication est plus claire que la chaîne remplissant la solution acceptée.

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

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


4
Cette réponse a été rejetée, et je ne sais pas pourquoi. Je pensais que les mathématiques étaient plus rapides et plus claires que la manipulation de chaînes. Si quelqu'un sait pourquoi c'est une mauvaise réponse, faites-le moi savoir.
Darren Griffith

4
Le multiplicateur 10000 est là pour décaler le YYYY de 4 endroits (les chiffres du mois et du jour ont besoin de 2 chiffres chacun) et n'a rien à voir avec le bug Y10K. J'aime cette réponse et elle mérite le respect!
A. Masson

1
Merci pour cette réponse J'ai créé le violon ici jsfiddle.net/amwebexpert/L6j0omb4
A. Masson

1
Je n'avais pas du tout besoin de la multiplication et je ne comprends pas pourquoi elle est là. jsfiddle.net/navyjax2/gbqmv0t5 Sinon, laissez cela de côté, et c'est une excellente réponse et m'a beaucoup aidé.
vapcguy

1
@ D-Money Ah, j'ai compris ce que vous voulez dire - vous faites une concaténation d'un type différent en additionnant les nombres pour éviter qu'ils ne se font une opération mathématique différente - une opération pour interdire la normale qui le ferait '' sinon, je les ai gâchés. Bon travail! Le mien fonctionne parce que j'utilise des séparateurs (que je devrais faire .replace('-', '')pour qu'il réponde à la question de l'OP), alors que vous étiez fidèle à la question d'origine de l'OP et qu'il ne nécessiterait pas cette étape supplémentaire. Excellent!
vapcguy

15

Solution JS simple (ES5) sans aucun problème de saut de date possible causé par l'impression Date.toISOString () en 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, '');

Ceci en réponse au commentaire de @ weberste sur la réponse de @Pierre Guilbert.


now.getMonth () renverra 0 pour janvier, ce devrait être (now.getMonth () + 1)
Jas

2
Faux. La fonction UTC de Date s'attend à ce que le mois soit compris entre 0 et 11 (mais les autres <0 et> 11 sont autorisés).
Loir

Pourquoi remplacez-vous plusieurs tirets par un seul? Peut toISOStringrenvoyer plusieurs tirets successifs?
Michaël Witrant

Michael - il remplace chaque trait d'union trouvé par un seul trait d'union. Je ne sais toujours pas pourquoi (peut-être que la chaîne de remplacement n'est qu'un espace réservé pour un séparateur). Le «g» signifie toutes les occurrences. Le motif auquel vous pensez est / [-] + / g
Gerard ONeill

2
Tu as fait ma journée. Je cherche depuis des jours un moyen simple de contourner l'horrible gestion de TimeZone en Javascript, et cela fait l'affaire!
Guillaume F.12

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


C'est la réponse que j'ai utilisée. Un liner qui prend en compte le fuseau horaire. Pour répondre à la question de l'affiche originale, nous pourrions faire: (nouvelle Date (Date.now () - (nouvelle Date ()). GetTimezoneOffset () * 60000)). ToISOString (). Replace (/ [^ 0-9] / g, "") .slice (0,8)
tomwoods

thx, pour obtenir AAAA-MM-JJ utilisé: nouvelle date (Date.now () - (nouvelle date ()). 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);


Très intelligent. Merci
JMaylin

4
Ne fonctionnera pas car new Date () a un fuseau horaire et Date.toISOString () est UTC. Voir ma réponse.
Loir

@Dormouse n'est-ce pas l'inverse? new Date()crée un nouvel objet date qui est juste un wrapper autour de nr. de ms depuis 1970/01/01 00: 00: 00.000 UTC. Ensuite , toISOStringimprime dans le fuseau horaire local.
Stijn de Witt

Non, Date.toISOString () s'imprime en UTC.
Dormouse

7

Une autre façon est d'utiliser toLocaleDateStringavec un environnement local qui a une norme de format de date big-endian , comme la Suède, la Lituanie, la Hongrie, la Corée du Sud, ...:

date.toLocaleDateString('se')

Pour supprimer les délimiteurs ( -), il suffit de remplacer les non-chiffres:

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

Cela n'a pas l'erreur potentielle que vous pouvez obtenir avec les formats de date UTC: la date UTC peut être un jour de congé par rapport à la date dans le fuseau horaire local.


6

Vous pouvez simplement utiliser ce code d'une ligne pour obtenir la date de l'année

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

5

Version peu simplifiée pour la réponse la plus populaire dans ce fil 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 est un package très utilisé.

Comment utiliser:

Téléchargez et installez à dateformatpartir de NPM. Exigez-le dans votre module:

const dateFormat = require('dateformat');

puis formatez simplement vos trucs:

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


4

Ce gars ici => http://blog.stevenlevithan.com/archives/date-time-format a écrit une format()fonction pour JavascriptDate objet , donc il peut être utilisé avec des formats littéraux familiers.

Si vous avez besoin d'un formatage de date complet dans le Javascript de votre application, utilisez-le. Sinon, si ce que vous voulez faire est unique, la concaténation de getYear (), getMonth (), getDay () est probablement la plus simple.


4

En travaillant à partir de la réponse de @ oo, cela vous rendra la chaîne de la date selon une chaîne de format. Vous pouvez facilement ajouter une expression régulière à 2 chiffres pour l'année et les millisecondes et ainsi de suite si vous en avez besoin.

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

Je ne sais cependant pas à quel point c'est efficace, surtout en termes de performances car il utilise beaucoup d'expressions régulières. Il pourrait probablement utiliser certains travaux que je ne maîtrise pas en pure js.


4

Ce code est corrigé de la réponse de Pierre Guilbert:

(ça marche même après 10000 ans)

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


3

J'utilise généralement le code ci-dessous lorsque je dois le faire.

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

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

Donc, 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 MyDate.getMonth () renvoie 9, ce sera:

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

donc l'ajout de .slice (-2) qui nous donne les deux derniers caractères qui est:

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

"09"

Mais si date.getMonth () renvoie 10, ce sera:

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

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

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

"10"

3

Si vous utilisez AngularJs (jusqu'à 1,5), vous pouvez utiliser le filtre de date :

var formattedDate = $filter('date')(myDate, 'yyyyMMdd')

3

Répondre à un autre pour la simplicité et la lisibilité.
De plus, la modification des membres de classe prédéfinis existants avec de nouvelles méthodes n'est pas encouragée:

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

Si cela ne vous dérange pas d'inclure une bibliothèque supplémentaire (mais petite), Sugar.js fournit de nombreuses fonctionnalités intéressantes pour travailler avec des dates en JavaScript. Pour formater une date, utilisez la fonction de formatage :

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
en ajoutant une description à votre réponse, vous obtiendrez des votes positifs, essayez de décrire un peu ce que vous faites dans ce code afin que les autres puissent le comprendre plus clairement.
Muhammad Omer Aslam

En mode strict ou tapuscrit, utilisez "let f, yyyymmdd = x => ..." à la place. Les fonctions aaaammjj et f ne sont pas définies autrement.
Max


2

Utilisez 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

Voici une approche plus générique qui permet à la fois des composants de date et d' heure et qui peut être triée de manière identique sous forme de nombre ou de chaîne.

En fonction de l'ordre numérique du format Date ISO, convertissez-le en fuseau horaire local et supprimez les non-chiffres. c'est à 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
}

Usage

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 natif:

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

1
Cela ne remplit pas les mois par un 0 pour garantir que le mois comporte 2 chiffres.
Attila Szeremi

Tu as raison. Je l'ai remarqué plus tard moi-même. Vous devez être prudent en testant le formatage de la date sur des mois et des jours à deux chiffres.
Lonnie Best
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.