无法使用格式dd / MM / yyyy HH:mm在javascript中对日期时间进行排序

时间:2017-04-05 05:04:04

标签: javascript sorting datetime

我无法按照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"}];

预期结果:最新日期时间应该在列表中第一位

  • 04/04/2017 17:47
  • 31/02/2017 12:00
  • 31/02/2017 10:00
  • 05/01/2015 12:35

目前的结果:

  • 31/02/2017 12:00
  • 31/02/2017 10:00
  • 04/04/2017 17:47
  • 05/01/2015 12:35

我使用的排序逻辑:

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);​

我使用的参考链接:

提前致谢。

3 个答案:

答案 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,或将它们转换为日期并对其进行排序,例如

&#13;
&#13;
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;
&#13;
&#13;

请注意,解析函数不会验证日期值,因此2017年2月31日将被视为2017年3月3日。如果您要验证日期值,那就是另外一行代码。

排序为字符串的替代方法可能是:

&#13;
&#13;
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;
&#13;
&#13;