web-dev-qa-db-fra.com

Obtenir une chaîne ISO à partir d'une date sans fuseau horaire

Ma configuration est le fuseau horaire de Lisbonne. Lorsque je fais new Date(), je reçois ma date/heure locale actuelle qui est Fri Apr 28 2017 01:10:55 GMT+0100 (GMT Daylight Time)

Lorsque j'obtiens la chaîne ISO avec toISOString(), le fuseau horaire est appliqué et le résultat est le suivant:

2017-04-28T00:10:55.964Z

Le problème est qu'il y a quelques minutes, l'heure de la date était la suivante (hier):

2017-04-27T23:45:05.654Z

J'ai essayé moment.js (nouveau) et j'ai fait quelque chose comme ça

document.write(moment('2017-04-28').format())

Mais je reçois ce 2017-04-28T00:00:00+01:00 qui n'est pas 2017-04-28T00:00:00.000Z 

Je souhaite passer cette valeur en tant que paramètre d'une méthode reposante afin de l'analyser automatiquement en tant que type DateTime, mais si je transmets la sortie du format moment.js, elle sera analysée sous la forme 2017-04-27 23:00:00.00

Si je crée une nouvelle date avec new Date() ou avec new Date('2017-04-27') (portion de date), je souhaite simplement obtenir le format ISO comme suit, sans heure ni fuseau horaire

2017-04-28T00:00:00.000Z

Existe-t-il une méthode javascript telle que toISOString () ou utilisant peut-être un moment pour obtenir ce format?

Quel que soit le fuseau horaire ou le moment de la journée, je veux simuler l’heure de minuit.

8
Maximus Decimus

Ce que vous demandez est très difficile à comprendre. Si vous voulez que la date UTC avec les heures soit toujours égale à 0, définissez les heures UTC sur 0 et utilisez toISOString, par exemple.

var d = new Date();
d.setUTCHours(0,0,0,0);
console.log(d.toISOString());

Bien sûr, cela affichera la date UTC, qui peut être différente de la date sur le système qui a généré la date.

Également,

new Date('2017-04-27').toISOString();

devrait renvoyer 2017-04-27T00: 00: 00Z (c.-à-d. qu'il devrait être analysé au format UTC conformément à la norme ECMA-262, ce qui est contraire à la norme ISO 8601 qui la traiterait comme locale), mais cela n'est pas fiable dans tous implémentations en cours d'utilisation.

Si vous voulez juste obtenir la date actuelle au format ISO 8601, vous pouvez faire:

if (!Date.prototype.toISODate) {
  Date.prototype.toISODate = function() {
    return this.getFullYear() + '-' +
           ('0'+ (this.getMonth()+1)).slice(-2) + '-' +
           ('0'+ this.getDate()).slice(-2);
  }
}

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

Cependant, étant donné que toISOString intégré utilise UTC, cela peut prêter à confusion. Si la date UTC est requise, alors:

if (!Date.prototype.toUTCDate) {
  Date.prototype.toUTCDate = function() {
    return this.getUTCFullYear() + '-' +
           ('0'+ (this.getUTCMonth()+1)).slice(-2) + '-' +
           ('0'+ this.getUTCDate()).slice(-2);
  }
}

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

5
RobG

Pour ce faire, vous pouvez simplement formater tout ce dont vous avez besoin à l'aide de moment.format(), puis ajouter simplement le Z supplémentaire à la chaîne. Vous devez le faire car le moment JS est réservé pour la sortie.

var date = moment('2014-08-28').format("YYYY-MM-DDT00:00:00.000") + "Z";

Exemple de violon https://jsfiddle.net/2avxxz6q/

3
li x

Vous n'avez pas besoin de la bibliothèque moment.js, vous pouvez simplement analyser et connecter les composants de date. Par exemple

type Components = {
  day: number,
  month: number,
  year: number
}

export default class DateFormatter {
  // 2018-11-11T00:00:00
  static ISOStringWithoutTimeZone = (date: Date): string => {
    const components = DateFormatter.format(DateFormatter.components(date))
    return `${components.year}-${components.month}-${components.day}T00:00:00`
  }

  static format = (components: Components) => {
    return {
      day: `${components.day}`.padStart(2, '0'),
      month: `${components.month}`.padStart(2, '0'),
      year: components.year
    }
  }

  static components = (date: Date): Components => {
    return {
      day: date.getDate(),
      month: date.getMonth() + 1,
      year: date.getFullYear()
    }
  }
}
0
onmyway133

Je suppose que vous souhaitez obtenir la date actuelle dans ISO 8601 pour la transmettre à votre API? Peut-être que l’utilisation d’un wrapper moment.js pour JavaScript natif est mentionnée ici pourrait aider?

Comme dans votre exemple:

document.write(moment('01/12/2016', 'DD/MM/YYYY', true).toISOString());

Fragment:

$(function(){
  var displaysTime = $('#divTime');
  displaysTime.text(moment.utc('27/04/2017', 'DD/MM/YYYY', true).toISOString());
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.5.1/moment.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>

<div id="divTime">
</div>

0
Smit