1. ホーム
  2. javascript

[解決済み] ユーザーのタイムゾーンを無視して強制的にDate()で特定のタイムゾーンを使用する方法

2022-09-29 06:07:07

質問

JSアプリでタイムスタンプ(eq. 1270544790922 )をサーバから受け取る(Ajax)。

そのタイムスタンプを元に Date オブジェクトを使用します。

var _date = new Date();
_date.setTime(1270544790922);

今すぐ _date はタイムスタンプを現在のユーザーロケールのタイムゾーンでデコードしています。私はそれを望んでいません。

私は _ を希望します。 date で、このタイムスタンプをヨーロッパのヘルシンキ市の現在時刻に変換します (ユーザーの現在のタイムゾーンは無視します)。

どうすればよいのでしょうか。

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

Dateオブジェクトの基礎となる値は、実際にはUTCです。これを証明するために、もしあなたが new Date(0) と入力すると、次のようなものが表示されることに注意してください。 Wed Dec 31 1969 16:00:00 GMT-0800 (PST) . 0 は GMT では 0 として扱われますが .toString() メソッドはローカルタイムを表示します。

大きな注意点として、UTC は ユニバーサル の略で、世界共通の時刻コードです。2つの異なる場所での現在の時刻は同じUTCですが、出力は異なるフォーマットで出力されます。

ここで必要なのは、いくつかのフォーマットです

var _date = new Date(1270544790922); 
// outputs > "Tue Apr 06 2010 02:06:30 GMT-0700 (PDT)", for me
_date.toLocaleString('fi-FI', { timeZone: 'Europe/Helsinki' });
// outputs > "6.4.2010 klo 12.06.30"
_date.toLocaleString('en-US', { timeZone: 'Europe/Helsinki' });
// outputs > "4/6/2010, 12:06:30 PM"

これは動作しますが......他の日付メソッドはユーザーのタイムゾーンを記述するため、あなたの目的には使えません。あなたが欲しいのは、ヘルシンキのタイムゾーンに関連する日付オブジェクトです。この時点では、サードパーティのライブラリ(私はこれをお勧めします)を使用するか、日付オブジェクトをハックしてそのメソッドのほとんどを使用できるようにすることが選択肢となります。

オプション 1 - moment-timezoneのようなサードパーティ製のもの

moment(1270544790922).tz('Europe/Helsinki').format('YYYY-MM-DD HH:mm:ss')
// outputs > 2010-04-06 12:06:30
moment(1270544790922).tz('Europe/Helsinki').hour()
// outputs > 12

これは、次にやろうとしていることよりもずっとエレガントに見えます。

オプション2 - 日付オブジェクトをハックする

var currentHelsinkiHoursOffset = 2; // sometimes it is 3
var date = new Date(1270544790922);
var helsenkiOffset = currentHelsinkiHoursOffset*60*60000;
var userOffset = _date.getTimezoneOffset()*60000; // [min*60000 = ms]
var helsenkiTime = new Date(date.getTime()+ helsenkiOffset + userOffset);
// Outputs > Tue Apr 06 2010 12:06:30 GMT-0700 (PDT)

これはまだ GMT-0700 (PDT) だと思われていますが、あまり目を凝らさないようにすれば、目的に合った日付オブジェクトと勘違いすることができるかもしれません。

私は都合よくある部分を飛ばしてしまいました。を定義できるようにする必要があります。 currentHelsinkiOffset . もし、あなたが date.getTimezoneOffset() を使うか、あるいは if 文を使ってタイムゾーンの変更がいつ行われるかを記述すれば、問題は解決するはずです。

結論 - 特にこの目的のためには、以下のような日付ライブラリを使うべきだと思います。 モーメントタイムゾーン .