使用moment.js排序:弃用警告:提供的值不是可识别的RFC2822或ISO格式

时间:2018-02-08 18:49:42

标签: javascript sorting date momentjs

我解析了从带有Moment的API获得的日期,我需要在收集数据时对数组进行排序。我目前有这个:

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构造落后于js Date(),这在所有浏览器和版本中都不可靠。不鼓励使用非RFC2822 / ISO日期格式,并将在即将发布的主要版本中删除。有关详细信息,请参阅http://momentjs.com/guides/#/warnings/js-date/

我怎样才能让它发挥作用?

2 个答案:

答案 0 :(得分:7)

正如其他人所说,格式" DD / MM / YYYY"不是ISO 8601格式,结果字符串可能不明确。

您应该使用日期或时刻对象,而不是字符串。

当您在数组对象中存储日期时,请不要调用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>
&#13;
&#13;
&#13;

答案 1 :(得分:3)

根据警告中指向momentjs文档的链接,浏览器在解析您提供"DD/MM/YYYY"的格式时可能不可靠或不一致。如果需要保留此格式,一种解决方案是在计算diff时将字符串转换回时刻对象时提供格式。所以你可以做到 return moment.utc(left.timeStamp, 'DD/MM/YYYY').diff(moment.utc(right.timeStamp, 'DD/MM/YYYY'))