Maison  >  Questions et réponses  >  le corps du texte

Comment formater une date avec décalage de fuseau horaire en utilisant ISO 8601 en JavaScript ?

Objectif : Trouver 本地时间UTC时间偏移 puis construire l'URL au format suivant.

Exemple d'URL : /Actions/Sleep?duration=2002-10-10T12:00:00−05:00

Ce format est basé sur les recommandations du W3C. La documentation dit :

Par exemple, 2002-10-10T12:00:00−05:00 (midi le 10 octobre 2002, (heure avancée du Centre et heure normale de l’Est) Égal à 2002-10-10T17:00:00Z, soit cinq heures plus tard que 2002-10-10T12:00:00Z.

Donc, d'après ce que j'ai compris, je dois calculer la différence via la fonction new Date() 查找本地时间,然后使用 getTimezoneOffset(), puis l'ajouter à la fin de la chaîne.

  1. Utilisez format pour obtenir l'heure locale

    var local = new Date().format("yyyy-MM-ddThh:mm:ss"); // 2013-07-02T09:00:00
  2. Obtenir le décalage horaire UTC

    var offset = local.getTimezoneOffset() / 60; // 7
  3. Construire l'URL (partie horaire uniquement)

    var duration = local + "-" + offset + ":00"; // 2013-07-02T09:00:00-7:00

Le résultat ci-dessus signifie que mon heure locale est 9 heures du matin le 2 juillet 2013, soit 7 heures de différence par rapport à UTC (UTC a 7 heures d'avance sur l'heure locale)

Jusqu'à présent, cela semble fonctionner, mais que se passe-t-il si getTimezoneOffset() renvoie une valeur négative (par exemple -120) ?

Je me demande à quoi devrait ressembler le format dans ce cas car je n'arrive pas à le comprendre à partir de la documentation du W3C.

P粉054616867P粉054616867207 Il y a quelques jours678

répondre à tous(2)je répondrai

  • P粉842215006

    P粉8422150062024-03-26 13:16:45

    getTimezoneOffset() Renvoie le signe opposé dans le format requis par la spécification à laquelle vous faites référence.

    Ce format est également connu sous le nom de ISO8601, ou plus précisément RFC3339.

    Dans ce format, UTC est représenté par Z, tandis que tous les autres formats sont représentés par un décalage par rapport à UTC. La signification est la même qu'en JavaScript, mais l'ordre de soustraction est inversé, le résultat a donc le signe opposé.

    Également, des méthodes Date 对象上没有名为 format natives, donc la fonction du n°1 échouera à moins que vous n'utilisiez une bibliothèque à cet effet. Veuillez vous référer à ce document.

    Si vous recherchez une bibliothèque capable de fonctionner directement avec ce format, je vous recommande d'essayer moment.js. En fait, c'est le format par défaut, vous pouvez donc simplement faire ce qui suit :

    var m = moment();    // get "now" as a moment
    var s = m.format();  // the ISO format is the default so no parameters are needed
    
    // sample output:   2013-07-01T17:55:13-07:00

    Il s'agit d'une solution multi-navigateurs bien testée et dotée de nombreuses autres fonctionnalités utiles.

    répondre
    0
  • P粉545956597

    P粉5459565972024-03-26 12:26:52

    Il s'agit d'une fonction d'assistance simple qui formate les dates JS pour vous.

    function toIsoString(date) {
      var tzo = -date.getTimezoneOffset(),
          dif = tzo >= 0 ? '+' : '-',
          pad = function(num) {
              return (num < 10 ? '0' : '') + num;
          };
    
      return date.getFullYear() +
          '-' + pad(date.getMonth() + 1) +
          '-' + pad(date.getDate()) +
          'T' + pad(date.getHours()) +
          ':' + pad(date.getMinutes()) +
          ':' + pad(date.getSeconds()) +
          dif + pad(Math.floor(Math.abs(tzo) / 60)) +
          ':' + pad(Math.abs(tzo) % 60);
    }
    
    var dt = new Date();
    console.log(toIsoString(dt));

    répondre
    0
  • Annulerrépondre