Convertir une date ISO au format de date aaaa-mm-jj en JavaScript


109

Comment puis-je obtenir une date au format aaaa-mm-jj à partir d'une date ISO 8601 ?

Ma date 8601 est

2013-03-10T02:00:00Z

Comment puis-je obtenir ce qui suit?

2013-03-10

2
Avez-vous réellement essayé de le faire? Ce n'est pas une nouvelle question à laquelle on a répondu plusieurs fois.
bPratik


14
date.split("T")[0]would do
Aravindh Gopi

Réponses:


100

Essaye ça

date = new Date('2013-03-10T02:00:00Z');
date.getFullYear()+'-' + (date.getMonth()+1) + '-'+date.getDate();//prints expected format.

Mettre à jour:-

Comme indiqué dans les commentaires, je mets à jour la réponse pour imprimer les zéros non significatifs pour la date et le mois si nécessaire.

date = new Date('2013-08-03T02:00:00Z');
year = date.getFullYear();
month = date.getMonth()+1;
dt = date.getDate();

if (dt < 10) {
  dt = '0' + dt;
}
if (month < 10) {
  month = '0' + month;
}

console.log(year+'-' + month + '-'+dt);


17
Remarque, je ne pense pas que cela imprimera un zéro non
significatif

2
D'accord avec @ user3413723 cela ne répond pas à la question car il supprime le 0 de début et ne répond donc pas aux exigences du format AAAA-MM-JJ
James Murphy

Working fine @Mritunjay
Ravi Delixan

C'est plus long et plus sujet aux fautes de frappe par rapport à la réponse de DriveByPoster. Mais je ne donnerai pas un vote défavorable car il est plus indépendant de la langue. Il n'utilise tout simplement pas les outils simples à notre disposition.
RoboticRenaissance

monsieur pouvez-vous s'il vous plaît me dire comment passer 2013 3 1 ce format date dans la nouvelle Date (date)
Kapil soni

144

Recadrez simplement la chaîne:

var date = new Date("2013-03-10T02:00:00Z");
date.toISOString().substring(0, 10);

Ou si vous n'avez besoin que d'une date hors chaîne.

var strDate = "2013-03-10T02:00:00Z";
strDate.substring(0, 10);

3
Je pense que c'est la solution la plus simple et la plus élégante de toutes, mais y a-t-il un inconvénient à cela?
Aida_Aida

30
@Aida_Aida Le seul problème auquel je peux penser est que si votre code traite du temps à l'échelle géologique d'au moins 8000 ans dans le futur, votre code pourrait se rompre car le format sera YYYYY-MM-DDdans l'année 10000. Pour éviter cela, vous pourriez diviser sur le Tcaractère à la place. (Voir en.wikipedia.org/wiki/Year_10,000_problem )
apsillers

9
Cette manière ne gérera pas correctement les fuseaux horaires car l'ISOString est UTC mais l'objet Date est local. Vous devez prendre cela en considération.
Guillaume F.

3
@GuillaumeF. une considération importante mais elle est conforme aux exigences de l'OP
jamesjansson

Je ne peux pas comprendre pourquoi la chaîne doit être analysée à une date. L' option de sous-chaîne semble être la réponse la plus simple.
RobG


15

Moment.js gérera le formatage de la date pour vous. Voici comment l'inclure via une balise JavaScript, puis un exemple d'utilisation de Moment.js pour formater une date.

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.14.1/moment.min.js"></script>

moment("2013-03-10T02:00:00Z").format("YYYY-MM-DD") // "2013-03-10"

Bien que cet extrait de code puisse résoudre la question, inclure une explication aide vraiment à améliorer la qualité de votre message. N'oubliez pas que vous répondez à la question aux lecteurs à l'avenir, et que ces personnes pourraient ne pas connaître les raisons de votre suggestion de code. Essayez également de ne pas surcharger votre code avec des commentaires explicatifs, car cela réduit la lisibilité du code et des explications!
Au revoir StackExchange

2
momentest une bibliothèque assez énorme à utiliser uniquement pour le formatage. Utilisez plutôt des dates-fns qui sont beaucoup plus petites et donnent les mêmes fonctionnalités.
Hozefa

@Hozefa, puis répondez à la question OP avec votre solution.
Harris

1
@Harris - a fait le travail en douceur!
HadidAli

J'aimerais que le moment ait une fonction comme .toISODateString(), parce que c'est un cas très fréquent ...
Lev Lukomsky

12

C'est ce que je fais pour obtenir une date uniquement:

let isoDate = "2013-03-10T02:00:00Z";

alert(isoDate.split("T")[0]);


2
C'est la première réponse à proposer l'idée de split () comme réponse pour autant que je sache et j'aime cette solution pour l'effort vs la fiabilité vs effectivement le facteur bien que j'utilise moment () partout où je peux.
rainabba

1
toISOString utilise UTC, qui produira la mauvaise date locale pour la période du décalage du fuseau horaire local à partir de minuit. - RobG
Michael Dimmitt le

9

Moment.js est une bibliothèque assez volumineuse à utiliser pour un seul cas d'utilisation. Je recommande d'utiliser à la date-fnsplace. Il offre essentiellement la plupart des fonctionnalités de Moment.js avec une taille de paquet beaucoup plus petite et beaucoup formatting options.

import format from 'date-fns/format'
format('2013-03-10T02:00:00Z', 'YYYY-MM-DD'); // 2013-03-10, YYYY-MM-dd for 2.x

Une chose à noter est que, comme il s'agit du format d'heure ISO 8601 , le navigateur convertit généralement l'heure UTC en fuseau horaire local. Bien que ce soit un cas d'utilisation simple où vous pouvez probablement le faire '2013-03-10T02:00:00Z'.substring(0, 10);.

Pour des conversions plus complexes, date-fnsc'est la voie à suivre.


6

let isoDate = "2013-03-10T02:00:00Z";
var d = new Date(isoDate);
d.toLocaleDateString('en-GB'); // dd/mm/yyyy
d.toLocaleDateString('en-US'); // mm/dd/yyyy


d.toLocaleDateString ('en-GB'); fonctionne comme un charme. Très bonne réponse!
Donald Shahini le

5

Utilisation:

new Date().toISOString().substring(0, 10);

4

Cela affichera la date au format AAAA-MM-JJ:

let date = new Date();
date = date.toISOString().slice(0,10);

Je ne sais pas pourquoi cela n'obtient pas plus de votes, cela a parfaitement fonctionné et a répondu à la question avec un minimum d'effort
Wolfiebae

4

Passez votre date dans l'objet date:

var d = new Date('2013-03-10T02:00:00Z');
d.toLocaleDateString().replace(/\//g, '-');

1
toLocaleDateString () donnera au format "/". Pas le format "-".
TechCrunch

Vous pouvez utiliser ce qui précède en remplaçant "/" par "-". Pas le plus élégant si toLocaleDateString change jamais
James Murphy

Le résultat de toLocaleDateString n'est pas cohérent pour tous les utilisateurs et peut donc ne pas produire le résultat requis par l'OP.
RobG

4

À tous ceux qui utilisent des tentatives de fractionnement, de tranche et d'autres chaînes pour obtenir la date, vous pouvez vous préparer à des échecs liés au fuseau horaire!

Une chaîne ISO a Zulu-Timezone et une date en fonction de ce fuseau horaire, ce qui signifie qu'elle peut utiliser une date un jour avant ou après le fuseau horaire réel, que vous devez prendre en compte dans votre chaîne de transformation.

Voir cet exemple:

const timeZoneRelatedDate = new Date(2020, 0, 14, 0, 0);

console.log(timeZoneRelatedDate.toLocaleDateString(
    'ja-JP', 
    {
      year: 'numeric',
      month: '2-digit',
      day: '2-digit'
    }
).replace(/\//gi,'-'));

// RESULT: "2020-01-14"

console.log(timeZoneRelatedDate.toISOString());

// RESULT: "2020-01-13T23:00:00.000Z" (for me in UTC+1)

console.log(timeZoneRelatedDate.toISOString().slice(0,10));

// RESULT: "2020-01-13"

3

Si vous avez un objet date:

let date = new Date()
let result = date.toISOString().split`T`[0]

console.log(result)

ou

let date = new Date()
let result = date.toISOString().slice(0, 10)

console.log(result)


1
toISOString utilise UTC, qui produira la mauvaise date locale pour la période du décalage du fuseau horaire local à partir de minuit.
RobG

1

Pour étendre la solution de rk rk : Si vous souhaitez que le format inclue l'heure, vous pouvez ajouter le toTimeString()à votre chaîne, puis supprimer la partie GMT, comme suit:

var d = new Date('2013-03-10T02:00:00Z');
var fd = d.toLocaleDateString() + ' ' + d.toTimeString().substring(0, d.toTimeString().indexOf("GMT"));

0

J'ai utilisé ceci:

HTMLDatetoIsoDate(htmlDate){
  let year = Number(htmlDate.toString().substring(0, 4))
  let month = Number(htmlDate.toString().substring(5, 7))
  let day = Number(htmlDate.toString().substring(8, 10))
  return new Date(year, month - 1, day)
}

isoDateToHtmlDate(isoDate){
  let date = new Date(isoDate);
  let dtString = ''
  let monthString = ''
  if (date.getDate() < 10) {
    dtString = '0' + date.getDate();
  } else {
    dtString = String(date.getDate())
  }
  if (date.getMonth()+1 < 10) {
    monthString = '0' + Number(date.getMonth()+1);
  } else {
    monthString = String(date.getMonth()+1);
  }
  return date.getFullYear()+'-' + monthString + '-'+dtString
}

Source: http://gooplus.fr/en/2017/07/13/angular2-typescript-isodate-to-html-date/



0
let dt = new Date('2013-03-10T02:00:00Z');
let dd = dt.getDate();
let mm = dt.getMonth() + 1;
let yyyy = dt.getFullYear();

if (dd<10) {
    dd = '0' + dd;
}
if (mm<10) {
    mm = '0' + mm;
}
return yyyy + '-' + mm + '-' + dd;

0

Une meilleure version de réponse de @Hozefa .

Si vous avez date-fnsinstallé, vous pouvez utiliser la fonction formatISO

const date = new Date(2019, 0, 2)
import { formatISO } from 'date-fns'
formatISO(date, { representation: 'date' }) // '2019-01-02' string

-4

Utilisez le code ci-dessous. Cela vous est utile.

let currentDate = new Date()
currentDate.toISOString()
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.