223

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

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

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

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

console.log({ m1, m2 })
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>

しかし、特定のタイムゾーンで日付をフォーマットするにはどうすればよいですか?

ブラウザーの現在の時刻に関係なく一貫した結果が必要ですが、日付を UTC で表示したくありません。

4

8 に答える 8

300

Manto's answerで指摘されている.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で非推奨になりました。タイムゾーン識別子 (例: "-0400" または "-04:00" は -4 時間) を含む文字列、または 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')
于 2013-05-23T00:03:59.220 に答える
66

瞬間タイムゾーンを使用

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

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

moment.tz.add('Europe/Berlin|CET CEST CEMT|-10 -20 -30')
于 2015-04-18T18:52:51.547 に答える
23

.zone() は廃止されました。代わりに utcOffset を使用する必要があります。

// for a timezone that is +7 UTC hours
moment(1369266934311).utcOffset(420).format('YYYY-MM-DD HH:mm')
于 2015-08-19T23:45:11.927 に答える
6

これを超えて来ただけで、同じ問題があったので、思いついた結果を投稿するだけです

解析時にオフセットを更新できます (つまり、データ (1.1.2014) を解析していて、2014 年 1 月 1 日の日付のみが必要です。GMT+1 では 31.12.2013 を取得します。したがって、最初に値をオフセットします。

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

まあ、タイムゾーンを超えてサポートするのに便利でした

B

于 2015-05-27T10:26:39.523 に答える