ユーザーのタイムゾーンを無視して、Date() に特定のタイムゾーンを使用させる方法 質問する

ユーザーのタイムゾーンを無視して、Date() に特定のタイムゾーンを使用させる方法 質問する

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

そのタイムスタンプに基づいて、Date次を使用してオブジェクトを作成します。

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

現在、_date現在のユーザー ロケールのタイム ゾーンでデコードされたタイムスタンプ。これは不要です。

このタイムスタンプをヨーロッパのヘルシンキ市の現在の時刻に変換したいと思いますdate(ユーザーの現在のタイムゾーンは無視します)。

どうやってやるの?

ベストアンサー1

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 ステートメントをいくつか使用すれば、問題は解決するはずです。

結論- 特にこの目的には次のような日付ライブラリを使うべきだと思います瞬間-タイムゾーン

おすすめ記事