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

Mritunjay
la source
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);
DriveByPoster
la source
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
46

Vous pouvez consulter Moment.js , Luxon , date-fns ou Day.js pour une manipulation de date agréable.

Ou extrayez simplement la première partie de votre chaîne ISO, elle contient déjà ce que vous voulez. Voici un exemple en fractionnant sur le T:

"2013-03-10T02:00:00Z".split("T")[0] // "2013-03-10"
antoine129
la source
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"
Harris
la source
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]);

Aravindh Gopi
la source
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.

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

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

Utilisation:

new Date().toISOString().substring(0, 10);
Ankita
la source
4

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

let date = new Date();
date = date.toISOString().slice(0,10);
sebhs
la source
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, '-');
rk rk
la source
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"
Jook
la source
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)

Илья Зеленько
la source
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"));
Airwavezx
la source
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/

Alan
la source
0

    var d = new Date("Wed Mar 25 2015 05:30:00 GMT+0530 (India Standard Time)");
    alert(d.toLocaleDateString());

Abilash Raghu
la source
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;
Fuite de mémoire
la source
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
asiniy
la source
-4

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

let currentDate = new Date()
currentDate.toISOString()
Mohammad Bilal
la source