私は 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で日付を表示したくありません。
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')
moment-timezone を使用
moment(date).tz('Europe/Berlin').format(format)
特定のタイムゾーンにアクセスできるようにするには、そのようにロードする必要があります(またはここで説明されている 別の方法を使用します )。
moment.tz.add('Europe/Berlin|CET CEST CEMT|-10 -20 -30')
いくつかの回答では、瞬間 - タイムゾーンがタイムゾーンと名付けられた方法であることをすでに述べています。私はこのライブラリについて、私にとってかなり混乱しやすいことを明確にしたいと思います。これら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クラスにフォールバックする可能性があります
渡された日付にタイムゾーンが指定されていると仮定します。
この場合、両者は同等に振る舞います
それがなぜそのように機能するのか私は理解していますが、これはかなり混乱しやすい機能であり、説明する価値があると思いました。
.zone()は推奨されなくなったので、代わりにutcOffsetを使用してください。
// for a timezone that is +7 UTC hours
moment(1369266934311).utcOffset(420).format('YYYY-MM-DD HH:mm')
Moment.jsでも同じ問題がありました。私はmoment-timezoneをインストールしました、しかし問題は解決されませんでした。それから、ここでそれが公開されているものだけを実行し、タイムゾーンを設定します。それは魅力のように機能します。
moment(new Date({your_date})).zone("+08:00")
どうもありがとう!
これをもう少し早くやってきた、そして私は同じ問題を抱えていたので、私は私が思いついた結果を投稿するだけでよい
解析するとき、あなたはオフセットを更新することができます(すなわち、私はデータを解析しています(1.1.2014)そして私は日付、2014年1月1日だけが欲しいです)。
moment(moment.utc('1.1.2014').format());
さて、私はタイムゾーンを越えてサポートするために便利になった
B