1. ホーム
  2. javascript

[解決済み] moment.js - UTCが間違った日付を表示する

2022-03-02 13:30:02

質問

moment.js UTCはなぜいつも間違った日付を表示するのですか?例えば、クロームのデベロッパーコンソールから。

moment(('07-18-2013')).utc().format("YYYY-MM-DD").toString()
// or
moment.utc(new Date('07-18-2013')).format("YYYY-MM-DD").toString()

どちらも "2013-07-17" なぜ 17日 ではなく 18日 で渡されたものです。

しかし、momentjsをutcなしで使用すると。

moment(new Date('07-18-2013')).format("YYYY-MM-DD").toString()

戻る "2013-07-18" これは、moment.js UTCを使用するときに私が期待するものです。

これは、moment.jsのUTCを使用した場合、正しい日付を取得できないことを意味するのでしょうか?

解決方法は?

デフォルトでは、MomentJSはローカルタイムでパースします。日付文字列(時刻なし)だけが提供された場合、時刻のデフォルトは真夜中になります。

あなたのコードでは、ローカルの日付を作成し、それをUTCタイムゾーンに変換しています(実際には、それによってモーメントインスタンスが UTCモード そのため、フォーマットされたときに、(ローカルタイムに応じて)前方または後方にシフトされます。

ローカルタイムゾーンがUTC+N(Nは正の数)の場合、日付のみの文字列をパースすると、前の日付が取得されます。

以下に例を挙げて説明します(私のローカルタイムオフセットはサマータイム期間中はUTC+3です)。

>>> moment('07-18-2013', 'MM-DD-YYYY').utc().format("YYYY-MM-DD HH:mm")
"2013-07-17 21:00"
>>> moment('07-18-2013 12:00', 'MM-DD-YYYY HH:mm').utc().format("YYYY-MM-DD HH:mm")
"2013-07-18 09:00"
>>> Date()
"Thu Jul 25 2013 14:28:45 GMT+0300 (Jerusalem Daylight Time)"

日付-時刻文字列をUTCとして解釈してほしい場合は、それを明示する必要があります。

>>> moment(new Date('07-18-2013 UTC')).utc().format("YYYY-MM-DD HH:mm")
"2013-07-18 00:00"

または、マット・ジョンソン氏が回答で触れているように、( そしておそらく を使って、UTCの日付としてパースします。 moment.utc() で、曖昧さを防ぐためにフォーマット文字列を第2引数として含めます。

>>> moment.utc('07-18-2013', 'MM-DD-YYYY').format("YYYY-MM-DD HH:mm")
"2013-07-18 00:00"

逆にUTCの日付をローカルの日付に変換するには local() メソッドを使用すると、次のようになります。

>>> moment.utc('07-18-2013', 'MM-DD-YYYY').local().format("YYYY-MM-DD HH:mm")
"2013-07-18 03:00"