1. ホーム
  2. javascript

[解決済み] JavaScriptでタイムゾーンオフセットを含むISO 8601形式の日付を作成するには?

2022-05-13 19:55:41

質問

目標 を検索します。 local timeUTC time offset であれば、以下のような形式でURLを作成します。

URLの例です。 /Actions/Sleep?duration=2002-10-10T12:00:00−05:00

フォーマットは W3C勧告 . とドキュメントに書かれています。

例えば、2002-10-10T12:00:00-05:00(2002年10月10日の正午。 米国中部夏時間および東部標準時) は、2002-10-10T12:00:00Z から5時間後の 2002-10-10T17:00:00Z に相当します。

つまり、私の理解では、ローカルタイムは次のようにして求める必要があります。 new Date() を使用し、次に getTimezoneOffset() 関数で差分を計算し、それを文字列の末尾に付加します。

  1. でローカルタイムを取得します。 format

    var local = new Date().format("yyyy-MM-ddThh:mm:ss"); // 2013-07-02T09:00:00
    
    
  2. UTC時間オフセットを時間単位で取得する

    var offset = local.getTimezoneOffset() / 60; // 7
    
    
  3. 構築URL(時間部分のみ)

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

上記の出力は、私の現地時間が2013/07/02 9amで、UTCとの差が7時間であることを意味します(UTCは現地時間より7時間進んでいます)。

ここまではうまくいっているように見えますが、次のような場合はどうでしょうか。 getTimezoneOffset() は-120のような負の値を返しますか?

W3Cのドキュメントを見ても分からないので、このような場合、どのような書式になるのか気になります。

どのように解決するのですか?

JSの日付をフォーマットしてくれる簡単なヘルパー関数を紹介します。

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));