我无法按照javascript中的最新日期时间排序。
以下是我的json:
let jsonStr = [{id:1,date:"04/04/2017 17:47"},
{id:2,date:"05/01/2015 12:35"},
{id:3,date:"31/02/2017 10:00"},
{id:4,date:"31/02/2017 12:00"}];
预期结果:最新日期时间应该在列表中第一位
目前的结果:
我使用的排序逻辑:
function sortFunction(a,b){
var dateA = new Date(a.date).getTime();
var dateB = new Date(b.date).getTime();
return dateB > dateA ? 1 : -1;
};
let jsonStr = [{id:1,date:"04/04/2017 17:47"},
{id:2,date:"05/01/2015 12:35"},
{id:3,date:"31/02/2017 10:00"},
{id:4,date:"31/02/2017 12:00"}];
jsonStr.sort(sortFunction);
我使用的参考链接:
提前致谢。
答案 0 :(得分:2)
它没有以你认为的方式解释日期。例如,
console.log(new Date("05/01/2015 12:35"));
为我生产:
Date 2017-05-01T19:35:00.000Z
表明它期望日期为MM / dd / yyyy格式。
<小时/> 您可以推出自己的解决方案,也可以使用其中一个库。有很多解决方案可供选择。我个人喜欢moment.js,它允许date format strings。
另一个引自this answer的例子,将日期解析格式控制添加到字符串中:
String.prototype.toDate = function(format) { var normalized = this.replace(/[^a-zA-Z0-9]/g, '-'); var normalizedFormat= format.toLowerCase().replace(/[^a-zA-Z0-9]/g, '-'); var formatItems = normalizedFormat.split('-'); var dateItems = normalized.split('-'); var monthIndex = formatItems.indexOf("mm"); var dayIndex = formatItems.indexOf("dd"); var yearIndex = formatItems.indexOf("yyyy"); var hourIndex = formatItems.indexOf("hh"); var minutesIndex = formatItems.indexOf("ii"); var secondsIndex = formatItems.indexOf("ss"); var today = new Date(); var year = yearIndex>-1 ? dateItems[yearIndex] : today.getFullYear(); var month = monthIndex>-1 ? dateItems[monthIndex]-1 : today.getMonth()-1; var day = dayIndex>-1 ? dateItems[dayIndex] : today.getDate(); var hour = hourIndex>-1 ? dateItems[hourIndex] : today.getHours(); var minute = minutesIndex>-1 ? dateItems[minutesIndex] : today.getMinutes(); var second = secondsIndex>-1 ? dateItems[secondsIndex] : today.getSeconds(); return new Date(year,month,day,hour,minute,second); };
示例:
"22/03/2016 14:03:01".toDate("dd/mm/yyyy hh:ii:ss"); "2016-03-29 18:30:00".toDate("yyyy-mm-dd hh:ii:ss");
答案 1 :(得分:1)
这是因为当你把一些日期放在日期对象Invalid date
new Date()
例如: 31/02/2017 不是有效日期
如果您输入正确的日期,它将为您提供正确的输出。
答案 2 :(得分:1)
带日期的第一条规则是不要使用Date构造函数(或Date.parse)来解析字符串。手动完成。库可以提供帮助,但是如果你只需要处理一种格式,那么一个简单的函数就足够了。
您可以将字符串转换为排序的格式,例如ISO 8601,或将它们转换为日期并对其进行排序,例如
var data = [{id:1,date:"04/04/2017 17:47"},
{id:2,date:"05/01/2015 12:35"},
{id:3,date:"31/02/2017 10:00"},
{id:4,date:"31/02/2017 12:00"}];
function parseDMYhm(s) {
var b = s.split(/\D/);
return new Date(b[2], b[1]-1, b[2], b[3], b[4]);
}
data.sort(function(a, b) {
return parseDMYhm(a.date) - parseDMYhm(b.date);
});
console.log(data);
&#13;
请注意,解析函数不会验证日期值,因此2017年2月31日将被视为2017年3月3日。如果您要验证日期值,那就是另外一行代码。
排序为字符串的替代方法可能是:
var data = [{id:1,date:"04/04/2017 17:47"},
{id:2,date:"05/01/2015 12:35"},
{id:3,date:"31/02/2017 10:00"},
{id:4,date:"31/02/2017 12:00"}];
// Reformat DD/MM/YYYY HH:mm as YYYY-MM-DDTHH-mm
function formatStringAsISO(s) {
var b = s.split(/\D/);
return b[2] + '-' + b[1] + '-' + b[0] + 'T' + b[3] + ':' + b[4];
}
data.sort(function(a, b) {
return formatStringAsISO(a.date).localeCompare(formatStringAsISO(b.date));
});
console.log(data);
&#13;