web-dev-qa-db-ja.com

Moment.js:特定のタイムゾーンで日付をフォーマットする

私は Moment.js を使って私のWebアプリの日付を解析しフォーマットしています。私のバックエンドサーバーはJSONオブジェクトの一部として、UTCエポック(Unixオフセット)からのミリ秒数として日付を送ります。

特定のタイムゾーンでの日付の解析は簡単です - 解析する前に、文字列の末尾にRFC 822タイムゾーン識別子を追加するだけです。

// response varies according to your timezone
moment('3/11/2012 13:00').utc().format("MM/DD HH:mm")

// problem solved, always "03/11 17:00"
moment('3/11/2012 13:00 -0400').utc().format("MM/DD HH:mm")

しかし、どのようにして日付を特定のタイムゾーンにフォーマットするのですか?ブラウザの現在時刻に関係なく一貫した結果が欲しいのですが、UTCで日付を表示したくありません。

138
quietmint

Mantoの答え で指摘されているように、 .utcOffset() はMoment 2.9.0以降では好ましい方法です。この機能は、逆オフセットではなく、UTCからの実オフセットを使用する(例えば、DST中のニューヨークでは−240)。 "+ 0400"のようなオフセット文字列は以前と同じように機能します。

// always "2013-05-23 00:55"
moment(1369266934311).utcOffset(60).format('YYYY-MM-DD HH:mm')
moment(1369266934311).utcOffset('+0100').format('YYYY-MM-DD HH:mm')

設定者としての古い .zone() でした/ Moment.js 2.9.0では 非推奨 。タイムゾーンの識別子を含む文字列(例:-4時間の場合は "-0400"または "-04:00")またはUTCの分後ろを表す数値(例:DST中のニューヨークの場合は240) 。

// always "2013-05-23 00:55"
moment(1369266934311).zone(-60).format('YYYY-MM-DD HH:mm')
moment(1369266934311).zone('+0100').format('YYYY-MM-DD HH:mm')

数値オフセットの代わりに名前付きタイムゾーンを使用するには、 Moment Timezone を含めて、代わりに.tz()を使用します。

// determines the correct offset for America/Phoenix at the given moment
// always "2013-05-22 16:55"
moment(1369266934311).tz('America/Phoenix').format('YYYY-MM-DD HH:mm')
195
quietmint

moment-timezone を使用

moment(date).tz('Europe/Berlin').format(format)

特定のタイムゾーンにアクセスできるようにするには、そのようにロードする必要があります(またはここで説明されている 別の方法を使用します )。

moment.tz.add('Europe/Berlin|CET CEST CEMT|-10 -20 -30')
40
Philip Nuzhnyy

いくつかの回答では、瞬間 - タイムゾーンがタイムゾーンと名付けられた方法であることをすでに述べています。私はこのライブラリについて、私にとってかなり混乱しやすいことを明確にしたいと思います。これら2つのステートメントには違いがあります。

moment.tz(date, format, timezone)

moment(date, format).tz(timezone)

渡された日付にタイムゾーンが指定されていないと仮定します。

最初のコードは日付を受け取り、タイムゾーンが渡されたものと想定します。2番目のコードは日付を取得し、ブラウザからのタイムゾーンを想定し、渡されたタイムゾーンに従って時間とタイムゾーンを変更します。

例:

moment.tz('2018-07-17 19:00:00', 'YYYY-MM-DD HH:mm:ss', 'UTC').format() // "2018-07-17T19:00:00Z"

moment('2018-07-17 19:00:00', 'YYYY-MM-DD HH:mm:ss').tz('UTC').format() // "2018-07-18T00:00:00Z"

私のタイムゾーンはutcから+5です。そのため、最初の場合は変更されず、日付と時刻がutcタイムゾーンに設定されます。

2番目のケースでは、渡された日付が-5であると仮定し、それをUTCに変換します。そのため、日付「2018-07-18T00:00:00Z」が表示されます。

注:formatパラメータはとても重要です。省略した場合、予期しない動作をする可能性があるDateクラスにフォールバックする可能性があります


渡された日付にタイムゾーンが指定されていると仮定します。

この場合、両者は同等に振る舞います


それがなぜそのように機能するのか私は理解していますが、これはかなり混乱しやすい機能であり、説明する価値があると思いました。

21
Nicola Pedretti

.zone()は推奨されなくなったので、代わりにutcOffsetを使用してください。

// for a timezone that is +7 UTC hours
moment(1369266934311).utcOffset(420).format('YYYY-MM-DD HH:mm')
16
Manto

Moment.jsでも同じ問題がありました。私はmoment-timezoneをインストールしました、しかし問題は解決されませんでした。それから、ここでそれが公開されているものだけを実行し、タイムゾーンを設定します。それは魅力のように機能します。

moment(new Date({your_date})).zone("+08:00")

どうもありがとう!

4
facundofarias

これをもう少し早くやってきた、そして私は同じ問題を抱えていたので、私は私が思いついた結果を投稿するだけでよい

解析するとき、あなたはオフセットを更新することができます(すなわち、私はデータを解析しています(1.1.2014)そして私は日付、2014年1月1日だけが欲しいです)。

moment(moment.utc('1.1.2014').format());

さて、私はタイムゾーンを越えてサポートするために便利になった

B

3
Bard Rotzer