web-dev-qa-db-ja.com

moment.jsで日付をISO 8601としてフォーマットするにはどうすればよいですか?

このドキュメントはフォーマットオプションとしてmoment.ISO_8601を言及しています(2.7.0 - http://momentjs.com/docs/#/parsing/special-formats/ )しかし、これらのどちらでもない(2.7.0でも):

var date = moment();
date.format(moment.ISO_8601); // error
moment.format(date, moment.ISO_8601); // error

http://jsfiddle.net/b3d6uy05/1/

Moment.jsからISO 8601を取得する方法を教えてください。

153
sennett
moment().toISOString(); // or format() - see below

http://momentjs.com/docs/#/displaying/as-iso-string/

更新答えに基づいて:@sennetによると@dvlsgによるコメント( Fiddle を参照) formattoISOStringには違いがあることに注意してください。どちらも正しいですが、根本的なプロセスは異なります。 toISOStringはDateオブジェクトに変換し、UTCに設定してからネイティブのDateプロトタイプ関数を使用してミリ秒(YYYY-MM-DD[T]HH:mm:ss.SSS[Z])付きでISO 8601をUTCで出力します。一方、formatはミリ秒なしでデフォルトのフォーマット(YYYY-MM-DDTHH:mm:ssZ)を使用し、タイムゾーンオフセットを維持します。

予期しない結果につながる可能性があるため、 問題 を公開しました。

259
cyberwombat

パラメータなしでformatを使用します。

var date = moment();
date.format(); // "2014-09-08T08:02:17-05:00"

http://jsfiddle.net/8gvhL1dz/

68
sennett

Vanilla JSでも可能

new Date().toISOString() // "2017-08-26T16:31:02.349Z"
9
artnikpro

Mongooseを使用して日付をMongoDBに格納するときは、すべての日付がミリ秒のISO日付として格納されるため、toISOString()を使用する必要があります。

moment.format() 

2018-04-17T20:00:00Z

moment.toISOString() -> USE THIS TO STORE IN MONGOOSE

2018-04-17T20:00:00.000Z
5
webmaster

日付部分(2017-06-27など)だけが必要で、タイムゾーンに関係なく、またアラビア語でも機能させたい場合は、以下のコードを作成します。

function isoDate(date) {
    if (!date) {
        return null
    }
    date = moment(date).toDate()

    // don't call toISOString because it takes the time zone into
    // account which we don't want.  Also don't call .format() because it
    // returns Arabic instead of English

    var month = 1 + date.getMonth()
    if (month < 10) {
        month = '0' + month
    }
    var day = date.getDate()
    if (day < 10) {
        day = '0' + day
    }
    return date.getFullYear() + '-' + month + '-' + day
}
4
user393274