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

IVR Avenger
la source
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();
oo
la source
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;

Pierre Guilbert
la source
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".

Ramzi SAYAGH
la source
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');
H6.
la source
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

NLemay
la source
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);
Brian Powell
la source
^ ç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'
gongqj
la source
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>

Eric Herlitz
la source
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/

Darren Griffith
la source
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.

Loir
la source
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

Kus
la source
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);

Tomas Šivickas
la source
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.

trincot
la source
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();
Muhammad Ahsan
la source
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;
}
Hero Qu
la source
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');

Milkncookiez
la source
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.

Strelok
la source
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.

Tom Tom
la source
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,"")
anmml
la source
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"
Ogglas
la source
3

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

var formattedDate = $filter('date')(myDate, 'yyyyMMdd')
sarin
la source
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);
Manohar Reddy Poreddy
la source
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}")
andersh
la source
2

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

Émail
la source
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

date-shortcode à la rescousse!

const dateShortcode = require('date-shortcode')
dateShortcode.parse('{YYYYMMDD}', new Date())
//=> '20180304'
Kodie Grantham
la source
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('-');
};
yajuliv
la source
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"
chriskelly
la source
1

Javascript natif:

new Date().toLocaleString('zu-ZA').slice(0,10).replace(/-/g,'');
Lonnie Best
la source
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