web-dev-qa-db-ja.com

moment(timezone).jsを使用してユーザーのブラウザーからタイムゾーンを取得します

Moment.jsおよびmoment-timezone.jsを使用する場合、クライアントのタイムゾーンを取得して他のタイムゾーンに変換する最良の方法は何ですか

クライアントのタイムゾーンとは何かを知り、後で彼の日付と時刻を他のタイムゾーンに変換したいと思います。

誰かこれを経験したことがありますか?

51
nemo_87

var timedifference = new Date()。getTimezoneOffset();

これは、UTC時間からのクライアントのタイムゾーンとの差を返します。その後、好きなようにそれをいじることができます。

14
jogoe

Moment.jsを使用する場合は、次を使用します。

var tz = moment.tz.guess();

米国太平洋時間帯のAmerica/Los_AngelesなどのIANA時間帯識別子を返します。

ここに記載 です。

内部的には、最初に次の呼び出しを使用してブラウザからタイムゾーンを取得しようとします。

Intl.DateTimeFormat().resolvedOptions().timeZone

この機能をサポートする最新のブラウザーのみをターゲットにしており、Moment-Timezoneを他に必要としない場合は、それを直接呼び出すことができます。

Moment-Timezoneがその関数から有効な結果を取得できない場合、またはその関数が存在しない場合は、Dateオブジェクトに対していくつかの異なる日付と時刻をテストしてタイムゾーンを「推測」します振る舞い。通常、推測は十分な近似値ですが、コンピューターのタイムゾーン設定と正確に一致することは保証されません。

164

moment.js を使用する場合、moment(date).utcOffset()は、ブラウザー時間とUTCの間の時間差を分単位で返します引数として渡された日付で(または、日付が渡されなかった場合は今日)。
しない変数にこの差を設定し、選択した日付に使用します。

// this is WRONG! don't do it like this!
const OFFSET_UTC = moment().utcOffset();

上記は、現在の差を作業するすべての日付に適用し、夏時間帯にいる場合、年の後半にある場合、日付は1時間ずれます。

選択した日付の正しいオフセットを解析する関数は次のとおりです。

function getUtcOffset(date) {
  return moment(date)
    .add(
      moment(date).utcOffset(), 
      'minutes')
    .utc()
}
5

次のJSコードを使用して、希望の時間を取得することもできます。

new Date(`${post.data.created_at} GMT+0200`)

この例では、受け取った日付はGMT + 0200タイムゾーンでした。代わりに、すべてのタイムゾーンを使用できます。返されるデータは、タイムゾーンの日付になります。これが時間の節約に役立つことを願っています

1
David

Momentライブラリを使用して、そのWebサイトを参照-> https://momentjs.com/timezone/docs/#/using-timezones/converting -to-zone /

私は彼らが自分のウェブサイトで自分のライブラリも使用していることに気づいたので、ブラウザコンソールをインストールする前に試してみることができます

moment().tz(String);

The moment#tz mutator will change the time zone and update the offset.

moment("2013-11-18").tz("America/Toronto").format('Z'); // -05:00
moment("2013-11-18").tz("Europe/Berlin").format('Z');   // +01:00

This information is used consistently in other operations, like calculating the start of the day.

var m = moment.tz("2013-11-18 11:55", "America/Toronto");
m.format();                     // 2013-11-18T11:55:00-05:00
m.startOf("day").format();      // 2013-11-18T00:00:00-05:00
m.tz("Europe/Berlin").format(); // 2013-11-18T06:00:00+01:00
m.startOf("day").format();      // 2013-11-18T00:00:00+01:00

Without an argument, moment#tz returns:

    the time zone name assigned to the moment instance or
    undefined if a time zone has not been set.

var m = moment.tz("2013-11-18 11:55", "America/Toronto");
m.tz();  // America/Toronto
var m = moment.tz("2013-11-18 11:55");
m.tz() === undefined;  // true
0
Philippe