web-dev-qa-db-fra.com

Obtenir la chaîne au format AAAAMMJJ à partir de l'objet de date JS?

J'essaie d'utiliser JS pour transformer un date object en une chaîne au format YYYYMMDD. Existe-t-il un moyen plus simple que de concaténer Date.getYear(), Date.getMonth() et Date.getDay()?

351
IVR Avenger

Morceau de code altéré 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();
584
o-o

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;
287
Pierre Guilbert

Vous pouvez utiliser la fonction toISOString:

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

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

160
Ramzi SAYAGH

Moment.js pourrait être votre ami

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

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

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

D'habitude, je n'aime pas importer trop de bibliothèques. Mais jQuery UI est tellement utile que vous l’utiliserez probablement ailleurs dans votre projet.

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

36
NLemay

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

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

En plus de la réponse de o-o, je vous recommande de séparer les opérations logiques du retour et de les placer sous forme de ternaires dans les variables.

Utilisez également concat() pour assurer la concaténation sécurisée 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 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();
   var hh = this.getHours() < 10 ? "0" + this.getHours() : this.getHours();
   var min = this.getMinutes() < 10 ? "0" + this.getMinutes() : this.getMinutes();
   return "".concat(yyyy).concat(mm).concat(dd).concat(hh).concat(min);
  };

 Date.prototype.yyyymmddhhmmss = 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();
   var hh = this.getHours() < 10 ? "0" + this.getHours() : this.getHours();
   var min = this.getMinutes() < 10 ? "0" + this.getMinutes() : this.getMinutes();
   var ss = this.getSeconds() < 10 ? "0" + this.getSeconds() : this.getSeconds();
   return "".concat(yyyy).concat(mm).concat(dd).concat(hh).concat(min).concat(ss);
  };

var d = new Date();
d.yyyymmdd();
d.yyyymmddhhmm();
d.yyyymmddhhmmss();

Un peu plus DRY fiddle comme suggéré par RiZKiT

https://jsfiddle.net/EricHerlitz/tuhhfxz9/

23
Eric Herlitz
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'
20
gongqj

Je n'aime pas modifier les objets natifs et je pense que la multiplication est plus claire que la chaîne qui remplit 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/

16
D-Money

Solution Plain JS (ES5) sans aucun problème de saut de date provoqué par l’impression Date.toISOString () au format 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.

13
Dormouse
// 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
10
Kus
var someDate = new Date();
var dateFormated = someDate.toISOString().substr(0,10);

console.log(dateFormated);
8
Tomas Šivickas

Une autre méthode consiste à utiliser toLocaleDateString avec des paramètres régionaux dotés d'un format de format big-endian , tels que 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 chiffres non numériques:

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
trincot

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

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

Version un 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
Hero Qu

Ce code corrige la réponse de Pierre Guilbert:

(cela fonctionne même après 10000 ans)

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

Ce mec ici => http://blog.stevenlevithan.com/archives/date-time-format a écrit une fonction format() pour l'objet Date de Javascript, afin qu'il puisse être utilisé avec des formats littéraux familiers.

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

4
Strelok

Il semble que mootools fournisse Date().format(): https://mootools.net/more/docs/1.6.0/Types/Date

Je ne suis pas sûr que cela vaille la peine d’y inclure uniquement pour cette tâche particulière.

3
Oren_H

Que diriez-vous de Day.js ?

C'est seulement 2 Ko, et vous pouvez aussi dayjs().format('YYYY-MM-DD').

https://github.com/iamkun/dayjs

3
NoobTW

Répondre à un autre pour plus de simplicité et de lisibilité.
De plus, la modification de 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);
3

J'utilise habituellement 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, nous pouvons ajouter "0" au jour ou au mois, et demander les deux derniers, car ce sont toujours les deux que nous voulons.

Donc, si MyDate.getMonth () renvoie 9, il sera:

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

donc ajouter. Slice (-2) sur 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 ajouter. Slice (-2) nous donne les deux derniers caractères, ou:

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

"10"
3
Ogglas

En travaillant à partir de la réponse de @ o-o, cela vous redonnera la chaîne de la date selon une chaîne de format. Vous pouvez facilement ajouter une regex année à 2 chiffres pour l'année et les millisecondes et autres, 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 pas à quel point c'est efficace, en particulier parce qu'il utilise beaucoup de regex. Il pourrait probablement utiliser un travail que je ne maîtrise pas js pur.

3
Tom Toms

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

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

dateformat est un paquet très utilisé et je le trouve beaucoup plus robuste et facile à utiliser que moment.js .

Comment utiliser:

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

var dateFormat = require('dateformat');

et ensuite formatez simplement vos fichiers:

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

3
Milkncookiez

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

new Date().format("{yyyy}{MM}{dd}")
2
andersh

date-shortcode à la rescousse!

const dateShortcode = require('date-shortcode')
dateShortcode.parse('{YYYYMMDD}', new Date())
//=> '20180304'
2
Kodie Grantham

Javascript natif:

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

Voici une approche plus générique qui permet à la fois aux composants date et time et est identifiable comme un nombre ou une chaîne.

Selon l'ordre des nombres du format Date ISO, convertissez-le en fuseau horaire local et supprimez les chiffres non numériques. 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
}

tilisation

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
chriskelly
yyyymmdd=x=>(f=x=>(x<10&&'0')+x,x.getFullYear()+f(x.getMonth()+1)+f(x.getDate()));
alert(yyyymmdd(new Date));
1
Enam

La solution @ o-o ne fonctionne pas dans mon cas. Ma solution est la suivante:

Date.prototype.yyyymmdd = function() {
  var mm = this.getMonth() + 1; // getMonth() is zero-based
  var dd = this.getDate();
  var ret = [this.getFullYear(), (mm<10)?'0':'', mm, (dd<10)?'0':'', dd].join('');

  return ret; // padding
};
0
fiorentinoing

Voici une petite amélioration à la réponse de https://stackoverflow.com/users/318563/o-o

Date.prototype.ddmmyyyy = function(delimiter) {
    var yyyy = this.getFullYear().toString();
    var mm = (this.getMonth()+1).toString(); // getMonth() is zero-based
    var dd  = this.getDate().toString();
    return (dd[1]?dd:"0"+dd[0]) + delimiter + (mm[1]?mm:"0"+mm[0]) + delimiter +yyyy  ; // padding
};

J'espère être utile pour tout le monde!

:)

0
Ismael Terreno

J'essaie d'écrire une bibliothèque simple pour manipuler un objet de date JavaScript. Vous pouvez essayer ça.

var dateString = timeSolver.getString(date, "YYYYMMDD")

Bibliothèque ici: https://github.com/sean1093/timeSolver

0
sean1093

Sympa et facile:

    var date = new Date();
    var yyyy = date.getFullYear();
    var mm = date.getMonth() + 1; // getMonth() is zero-based
    if (mm < 10) mm='0'+mm;
    var dd = date.getDate();
    if (dd < 10) dd='0'+dd;
    /*date.yyyymmdd();*/

    console.log('test - '+yyyy+'-'+mm+'-'+dd);
0
user6750900

Pour obtenir la date locale, dans un format AAAAMMJJ, utilisez:

var todayDate = (new Date()).toLocaleString('en-GB').slice(0,10).split("\/").reverse().join("");
0
Boaz Saragossi
Try this:

function showdate () {

var a = new Date();
var b = a.getFullYear();
var c = a.getMonth();
(++c < 10)? c = "0" + c : c;
var d = a.getDate();
(d < 10)? d = "0" + d : d;
var final = b + "-" + c + "-" + d; 

return final;


} 

document.getElementById("todays_date").innerHTML = showdate();
0
Devin Gray

Date.js a beaucoup de méthodes d'analyse de date utiles.

require("datejs")

(new Date()).toString("yyyyMMdd")

0
Tan Wang

cet article m'a aidé à écrire cette aide, je la partage donc si quelqu'un recherche cette solution, elle prend en charge toutes les variantes de aaaa, mm, jj

Date.prototype.formattedDate = function (pattern) {
    formattedDate = pattern.replace('yyyy', this.getFullYear().toString());
    var mm = (this.getMonth() + 1).toString(); // getMonth() is zero-based
    mm = mm.length > 1 ? mm : '0' + mm;
    formattedDate = formattedDate.replace('mm', mm);
    var dd = this.getDate().toString();
    dd = dd.length > 1 ? dd : '0' + dd;
    formattedDate = formattedDate.replace('dd', dd);
    return formattedDate;
};

d = new Date();
pattern = 'yyyymmdd';  // 20150813
d.formattedDate(pattern);

pattern = 'yyyy-mm-dd';
d.formattedDate(pattern); // 2015-08-13
0
talsibony

J'espère que cette fonction sera utile

function formatDate(dDate,sMode){       
        var today = dDate;
        var dd = today.getDate();
        var mm = today.getMonth()+1; //January is 0!
        var yyyy = today.getFullYear();
        if(dd<10) {
            dd = '0'+dd
        } 
        if(mm<10) {
            mm = '0'+mm
        } 
        if (sMode+""==""){
            sMode = "dd/mm/yyyy";
        }
        if (sMode == "yyyy-mm-dd"){
            return  yyyy + "-" + mm + "-" + dd + "";
        }
        if (sMode == "dd/mm/yyyy"){
            return  dd + "/" + mm + "/" + yyyy;
        }

    }
0
Matias Osmerini

Vous pouvez créer vous-même la fonction ci-dessous

function toString(o, regex) {
    try {
        if (!o) return '';
        if (typeof o.getMonth === 'function' && !!regex) {
            let splitChar = regex.indexOf('/') > -1 ? '/' : regex.indexOf('-') > -1 ? '-' : regex.indexOf('.') > -1 ? '.' : '';
            let dateSeparate = regex.split(splitChar);
            let result = '';
            for (let item of dateSeparate) {
                let val = '';
                switch (item) {
                    case 'd':
                        val = o.getDate();
                        break;
                    case 'dd':
                        val = this.date2Char(o.getDate());
                        break;
                    case 'M':
                        val = o.getMonth() + 1;
                        break;
                    case 'MM':
                        val = this.date2Char(o.getMonth() + 1);
                        break;
                    case 'yyyy':
                        val = o.getFullYear();
                        break;
                    case 'yy':
                        val = this.date2Char(o.getFullYear());
                        break;
                    default:
                        break;
                }
                result += val + splitChar;
            }
            return result.substring(0, result.length - 1);
        } else {
            return o.toString();
        }
    } catch(ex) { return ''; }
}

function concatDateToString(args) {
    if (!args.length) return '';
    let result = '';
    for (let i = 1; i < args.length; i++) {
        result += args[i] + args[0];
    }
    return result.substring(0, result.length - 1);
}

function date2Char(d){
    return this.rightString('0' + d);
}

function rightString(o) {
    return o.substr(o.length - 2);
}

Utilisé:

var a = new Date();
console.log('dd/MM/yyyy: ' + toString(a, 'dd/MM/yyyy'));
console.log('MM/dd/yyyy: ' + toString(a, 'MM/dd/yyyy'));
console.log('dd/MM/yy: ' + toString(a, 'dd/MM/yy'));
console.log('MM/dd/yy: ' + toString(a, 'MM/dd/yy'));
0
Trung

Bien sûr, vous pouvez créer une fonction spécifique pour chaque variante des représentations de chaînes de date. Si vous envisagez des formats de date internationaux, vous vous retrouvez avec des dizaines de fonctions spécifiques avec des noms rigoureux et difficiles à distinguer.

Il n'y a pas de fonction raisonnable qui correspond à tous les formats, mais une composition de fonction raisonnable qui:

const pipe2 = f => g => x =>
  g(f(x));

const pipe3 = f => g => h => x =>
  h(g(f(x)));

const invoke = (method, ...args) => o =>
  o[method] (...args);

const padl = (c, n) => s =>
  c.repeat(n)
    .concat(s)
    .slice(-n);

const inc = n => n + 1;

// generic format date function

const formatDate = stor => (...args) => date =>
  args.map(f => f(date))
    .join(stor);

// MAIN

const toYYYYMMDD = formatDate("") (
  invoke("getFullYear"),
  pipe3(invoke("getMonth")) (inc) (padl("0", 2)),
  pipe2(invoke("getDate")) (padl("0", 2)));

console.log(toYYYYMMDD(new Date()));

Oui, cela fait beaucoup de code. Mais vous pouvez exprimer littéralement chaque représentation de date sous forme de chaîne en modifiant simplement les arguments de la fonction transmis à la fonction supérieure formatDate. Tout est explicite et déclaratif, c’est-à-dire que vous pouvez presque lire ce qui se passe.

0
user10675354