web-dev-qa-db-ja.com

moment.jsでソート:非推奨の警告:提供された値が認識されたRFC2822またはISO形式ではありません

APIから取得した日付をMomentで解析し、データの収集が完了したら配列を並べ替える必要があります。私は現在これを持っています:

_myobject.name = name;
myobject.time = Moment(ajaxinfo.startdate).format('DD/MM/YYYY');
array.Push(myobject);
// ... more data is added ...
array.sort((left, right) => {
    return Moment.utc(left.time).diff(Moment.utc(right.time));
});
_

_ajaxinfo.startdate_はAPIから取得した文字列で、_"2018-01-28T13:00:00+00:00"_のように見えます

しかし、上記のコードは機能しません。それは私に警告を与えます:

非推奨の警告:提供された値は、認識されているRFC2822またはISO形式ではありません。 momentの構築はjsDate()にフォールバックしますが、これはすべてのブラウザーとバージョンで信頼できるわけではありません。 RFC2822/ISO以外の日付形式は推奨されておらず、今後のメジャーリリースで削除される予定です。詳細については、 http://momentjs.com/guides/#/warnings/js-date/ を参照してください。

どうすればそれを機能させることができますか?

5

他の人が述べているように、「DD/MM/YYYY」の形式はISO8601形式ではなく、結果の文字列があいまいになる可能性があります。

文字列ではなく、Dateオブジェクトまたはmomentオブジェクトを実際に操作する必要があります。

したがって、配列オブジェクトに日付を格納するときにformatを呼び出さないでください。日付をレンダリングする必要がある場合は、その時点でformatを呼び出します。

const Moment = moment;

// Sample strings
var ajaxinfos = [
    { name: "x", startdate: "2018-01-28T13:00:00+00:00" },
    { name: "y", startdate: "2018-01-26T18:00:00+00:00" }
];

const array = [];
for (const ajaxinfo of ajaxinfos) {
    const myobject = {};
    myobject.name = ajaxinfo.name;
    myobject.time = Moment(ajaxinfo.startdate);  // don't call format
    array.Push(myobject);
}

// No more need to convert strings to dates while sorting:
array.sort((left, right) => left.time.diff(right.time));
console.log(array);

// Whenever you need to format:
const formatted = array.map(info => info.time.format("MM/DD/YYYY"));
console.log(formatted);
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.15.0/moment.min.js"></script>
8
trincot