Moment.js UTCが常に間違った日付を表示するのはなぜですか。たとえば、Chromeの開発者コンソールから:
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"を返します。なぜ渡されたのは18thではなく17thを返すのですか?.
しかし、utcなしでmomentjsを使用する場合:
moment(new Date('07-18-2013')).format("YYYY-MM-DD").toString()
私は戻ってきます"2013-07-18"これは、moment.js UTCを使用するときにも予想されます。
これは、moment.js UTCを使用するときに正しい日付を取得できないことを意味しますか?
デフォルトでは、MomentJSは現地時間で解析します。日付文字列(時刻なし)のみが提供される場合、時刻はデフォルトで午前0時になります。
コードでは、ローカル日付を作成し、UTCタイムゾーンに変換します(実際、瞬間インスタンスを UTCモードに切り替えます )。したがって、フォーマットされると、シフトされます(ローカルに応じて時間)前方または後方。
ローカルタイムゾーンがUTC + N(Nは正の数)で、日付のみの文字列を解析すると、以前の日付が取得されます。
これを説明するための例をいくつか示します(私のローカルタイムオフセットはDST中の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"
または、Matt Johnsonが答えで言及しているように、 moment.utc()
を使用して最初にUTC日付として解析し(とshould)、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"
Date
とmoment
はどちらも、デフォルトでブラウザのローカルタイムゾーンの入力文字列を解析します。ただし、Date
はこの点と矛盾する場合があります。文字列が具体的にYYYY-MM-DD
で、hyphensを使用する場合、またはYYYY-MM-DD HH:mm:ss
である場合、現地時間。 Date
とは異なり、moment
は常に解析方法について一貫しています。
入力した瞬間を、指定した形式でUTCとして解析する正しい方法は次のようになります。
moment.utc('07-18-2013', 'MM-DD-YYYY')
このドキュメント を参照してください。
その後、出力用に別の形式にする場合は、次のようにします。
moment.utc('07-18-2013', 'MM-DD-YYYY').format('YYYY-MM-DD')
toString
を明示的に呼び出す必要はありません。
入力形式を提供することが非常に重要であることに注意してください。これがないと、ブラウザのカルチャ設定に応じて、01-04-2013
などの日付が1月4日または4月1日に処理される場合があります。