158

目標:を見つけて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-10T17:00:00Z と等しくなります。 2002-10-10T12:00:00Z より 5 時間遅れています。

したがって、私の理解に基づいて、関数を使用して差を計算し、それを文字列の最後に添付して、現地時間を見つける必要が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 午前 9 時であり、UTC との差が 7 時間であることを意味します (UTC は現地時間より 7 時間進んでいます)。

これまでのところ動作しているように見えますがgetTimezoneOffset()、-120 のような負の値を返すとどうなるでしょうか?

W3Cのドキュメントからはわからないので、そのような場合にフォーマットがどのように見えるべきか疑問に思っています。

4

12 に答える 12

258

これは、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));

于 2013-07-02T00:35:10.413 に答える
76

getTimezoneOffset()参照した仕様で必要な形式の反対の符号を返します。

この形式はISO8601としても知られていますが、より正確にはRFC3339としても知られています。

この形式では、UTC は で表され、Z他のすべての形式は UTC からのオフセットで表されます。意味は JavaScript と同じですが、減算の順序が逆なので、結果の符号が逆になります。

また、ネイティブDateオブジェクトには と呼ばれるメソッドがないformatため、これを実現するためにライブラリを使用しない限り、#1 の関数は失敗します。このドキュメントを参照してください。

この形式で直接動作するライブラリを探している場合は、moment.jsを試すことをお勧めします。実際、これはデフォルトの形式であるため、次のように簡単に実行できます。

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

これは十分にテストされたクロスブラウザー ソリューションであり、他にも多くの便利な機能があります。

于 2013-07-02T00:58:46.053 に答える
7

これはクライアントのタイムゾーンに対する私の関数です。軽量でシンプルです

  function getCurrentDateTimeMySql() {        
      var tzoffset = (new Date()).getTimezoneOffset() * 60000; //offset in milliseconds
      var localISOTime = (new Date(Date.now() - tzoffset)).toISOString().slice(0, 19).replace('T', ' ');
      var mySqlDT = localISOTime;
      return mySqlDT;
  }
于 2018-05-25T22:08:13.803 に答える
2

moment.js は必要ありません:これは、ISOLocal 文字列を GMT の UTC 秒に出力して戻す「datetime-local」の入力タイプからの完全なラウンド トリップの回答です。

<input type="datetime-local" value="2020-02-16T19:30">

isoLocal="2020-02-16T19:30"
utcSeconds=new Date(isoLocal).getTime()/1000

//here you have 1581899400 for utcSeconds

let isoLocal=new Date(utcSeconds*1000-new Date().getTimezoneOffset()*60000).toISOString().substring(0,16)
2020-02-16T19:30
于 2020-01-15T03:49:42.667 に答える