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


201

このドキュメントでは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を取得できますか?


どのバージョンのモーメントを使用していますか?ドキュメントによると、定数は2.7.0で追加されました。
ジョーズ2014

@joews 2.7.0。問題の明確化。私が理解した私の答えを見てください。ただし、ドキュメントはあまり明確ではありません。
Sennett 2014

ええ、彼らは構文解析の文脈で特別なフォーマットについてのみ言及しています。奇数。
ジョーズ14

2
u can trymoment().toISOString()
Saahithyan Vigneswaran 2017年

回答:


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

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

アップデート の回答に基づいて:@sennetと@dvlsgによってコメントによっては、(参照フィドルを)間に差があることに留意すべきであるformattoISOString。どちらも正しいですが、基本的なプロセスが異なります。toISOStringDateオブジェクトに変換し、UTCに設定してから、ネイティブのDateプロトタイプ関数を使用して、ミリ秒(YYYY-MM-DD[T]HH:mm:ss.SSS[Z])でISO8601をUTCで出力します。一方、formatYYYY-MM-DDTHH:mm:ssZミリ秒なしのデフォルト形式()を使用し、タイムゾーンのオフセットを維持します。

予期しない結果につながる可能性があると考えて、問題をオープンしました。


1
@Yashuaに同意します。「format()」の使用は直感的ではないため、避けるべきだと思います。また、ネイティブの "toISOString()"をラップするだけの関数は存在しないはずです。そうは言っても、おそらく「toISO8601()」のような新しい関数を与えて、タイムゾーンと適切なドキュメンテーションを維持するオプションがより良いでしょう。
GreivinLópez2017

4
あなたはUTC時間をしたいが、その代わりにISO8601の、独自の道をフォーマットした場合は、次の操作を行うことができますmoment().utc().format("OUTPUT_FORMAT")
StinkyCat

キバナで日付をフォーマットするのに便利なwhnですが、JSにアクセスできません。
Brice

1
ローカルタイムゾーンを維持する場合は、を使用しますmoment().toISOString(true);
Benny Neugebauer

83

使用するformatパラメータを指定せずに:

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

http://jsfiddle.net/8gvhL1dz/


31
余談ですが、これら2つの回答はどちらもISO形式の要件を満たしていますが、同じではありません。date.toISOString()ミリ秒を維持し、UTCを使用しますdate.format()(ミリ秒)をドロップすると、あなたの地域のタイムゾーンを使用します(あるいは、少なくとも、それは私が現在、クロームに取得しています行動だ- jsfiddle.net/8gvhL1dz/22
dvlsg

アラビア語のロケールで.format()を使用すると、英語の記号ではなくアラビア語の記号が表示されます。これはおそらく望ましくありません。
user393274 2017年

toISOStringはローカルタイムゾーンで出力しません-常に(ゼロオフセット)UTCです。
JoeTidee

11

バニラJSでも可能

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

3
タイムゾーンを維持せずに、UTCで必要な場合のみ。
JoeTidee

8

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

moment.format() 

2018-04-17T20:00:00Z

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

2018-04-17T20:00:00.000Z

3

日付部分だけが必要な場合(例: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
}

0
var x = moment();

//date.format(moment.ISO_8601); // error

moment("2010-01-01T05:06:07", ["YYYY", moment.ISO_8601]);; // error
document.write(x);

2
このコードは質問に対する解決策を提供するかもしれませんが、それがなぜ/どのように機能するかに関してコンテキストを追加する方が良いです。これは、将来のユーザーが学習し、その知識を自分のコードに適用するのに役立ちます。また、コードが説明されている場合は、賛成票の形でユーザーから肯定的なフィードバックを受ける可能性があります。
borchvm
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.