9

データベースに保存する現在のUTC日付を取得しようとしています。私の現地時間は午後9時11分です。これはUTC午前1時11分に相当します。データベースを見ると、午後1時11分に書き込まれていることがわかります。よくわかりません。JavaScriptでUTC時刻を取得するために、次のコードを使用しています。

var currentDate = new Date();
var utcDate = Date.UTC(currentDate.getFullYear(), currentDate.getMonth(), currentDate.getDate(), currentDate.getHours(), currentDate.getMinutes(), currentDate.getSeconds(), currentDate.getMilliseconds());
var result = new Date(utcDate);

私は何が間違っているのですか?

4

3 に答える 3

3

少し検索すると、これを行うことができます:

var now = new Date(),
    utcDate = new Date(
        now.getUTCFullYear(),
        now.getUTCMonth(),
        now.getUTCDate(),
        now.getUTCHours(),
        now.getUTCMinutes(), 
        now.getUTCSeconds()
    );

さらに短い:

var utcDate = new Date(new Date().toUTCString().substr(0, 25));

JavaScriptの日付をUTCに変換するにはどうすればよいですか?

これは、ISO8601文字列を作成する代わりに、UTCの日付と時刻を取得するために一般的に使用される方法です。文字列を使用すると、のすべてのネイティブメソッドを使用できなくなりDate()、一部の人はそのために正規表現を使用する可能性があります。これは、ネイティブメソッドよりも低速です。

ただし、のようなデータベースにlocalstorage保存する場合は、タイムゾーンオフセットも保存できるため、ISO8601文字列をお勧めしますが、この場合、すべてdateがUTCに変換されるため、タイムゾーンは実際には重要ではありません。

于 2012-05-21T01:31:25.813 に答える
2

ローカル日付オブジェクトのUTC時刻が必要な場合は、UTCメソッドを使用して取得します。すべてのjavascript日付オブジェクトはローカル日付です。

var date = new Date(); // date object in local timezone

UTC時刻が必要な場合は、実装に依存するtoUTCString方法を試すことができます。

var UTCstring = date.toUTCString();

しかし、私はそれを信用しません。UTC時間でISO8601文字列(ほとんどのデータベースが必要)が必要な場合は、次のようにします。

var isoDate = date.getUTCFullYear() + '-' +
              addZ((date.getUTCMonth()) + 1) + '-' +
              addZ(date.getUTCDate()) + 'T' +
              addZ(date.getUTCHours()) + ':' +
              addZ(date.getUTCMinutes()) + ':' +
              addZ(date.getUTCSeconds()) + 'Z';

ここで、addZ関数は次のとおりです。

function addZ(n) {
  return (n<10? '0' : '') + n;
}

それに合わせて変更します。

編集

UTCと同じ時刻を表示するようにローカル日付オブジェクトを調整するには、タイムゾーンオフセットを追加するだけです。

function adjustToUTC(d) {
  d.setMinutes(d.getMinutes() + d.getTimezoneOffset()); 
  return d;
}

alert(adjustToUTC(new Date())); // shows UTC time but will display local offset

上記に注意してください。UTC + 5hrsと言うと、5時間前の日付オブジェクトが返されますが、それでも「UTC+5」と表示されます。

UTC ISO8601文字列をローカル日付オブジェクトに変換する関数:

function fromUTCISOString(s) {
  var b = s.split(/[-T:\.Z]/i);
  var n= new Date(Date.UTC(b[0],b[1]-1,b[2],b[3],b[4],b[5]));
  return n;
}

alert(fromUTCISOString('2012-05-21T14:32:12Z'));  // local time displayed
于 2012-05-21T02:41:23.563 に答える
1
var now = new Date();
var utc = new Date(now.getTime() + now.getTimezoneOffset() * 60000);
于 2019-01-28T15:12:11.043 に答える