デフォルトでは、MomentJSはローカル時間で解析します。日付文字列(時間なし)のみが指定されている場合、時間のデフォルトは午前0時です。
コードでは、ローカル日付を作成し、それを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日付として解析し、2番目の引数としてフォーマット文字列を含めることができます(おそらくそうする必要があります)moment.utc()
。
>>> 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"
toString()
後で必要になるとは思いませんformat()
(すでに文字列が返されます)。