对字符串日期数组排序

我想按升序对数组进行排序。 日期采用字符串格式

["09/06/2015", "25/06/2015", "22/06/2015", "25/07/2015", "18/05/2015"] 

甚至需要一个函数来检查这些日期是否是连续的forms:

 eg - Valid - ["09/06/2015", "10/06/2015", "11/06/2015"] Invalid - ["09/06/2015", "25/06/2015", "22/06/2015", "25/07/2015"] 

示例代码:

 function sequentialDates(dates){ var temp_date_array = []; $.each(dates, function( index, date ) { //var date_flag = Date.parse(date); temp_date_array.push(date); }); console.log(temp_date_array); var last; for (var i = 0, l = temp_date_array.length; i  (24 * 60 * 60 * 1000)) return true; return false; } 

简单的解决方案

无需将字符串转换为日期或使用RegExp。

简单的解决方案是使用Array.sort()方法。 sort函数将日期格式设置为YYYYMMDD,然后比较字符串值。 假设日期输入格式为DD / MM / YYYY。

 data.sort(function(a,b) { a = a.split('/').reverse().join(''); b = b.split('/').reverse().join(''); return a > b ? 1 : a < b ? -1 : 0; // return a.localeCompare(b); // <-- alternative }); 

更新:

一个有用的注释建议使用localeCompare()来简化排序function。 此替代方案显示在上面的代码段中。

运行Snippet进行测试

    

    如果要对字符串进行排序,则需要将字符串转换为日期,并比较这些日期。 您可以使用sort方法接受的参数,以实现此目的:

     var dateStrings = ["09/06/2015", "25/06/2015", "22/06/2015", "25/07/2015", "18/05/2015"]; var sortedStrings = dateStrings.sort(function(a,b) { var aComps = a.split("/"); var bComps = b.split("/"); var aDate = new Date(aComps[2], aComps[1], aComps[0]); var bDate = new Date(bComps[2], bComps[1], bComps[0]); return aDate.getTime() - bDate.getTime(); }); 

    为了减少代码冗余并处理不同的日期格式,您可以添加一个额外的函数来创建sort方法所需的比较器:

     function createSorter(dateParser) { return function(a, b) { var aDate = dateParser(a); var bDate = dateParser(b); return aDate.getTime() - bDate.getTime(); }; } dateStrings.sort(createSorter(function(dateString) { var comps = dateString.split("/"); return new Date(comps[2], comps[1], comps[0]); })); 

    然后,您可以通过将不同的函数传递给createSorter调用来使用不同的日期格式化程序。

    至于你的第二个问题,你可以从你的字符串创建一个(排序的)日期数组,并在该数组上执行你的逻辑:

     function myDateParser(dateString) { var comps = dateString.split("/"); return new Date(comps[2], comps[1], comps[0]); } var sortedDates = dateStrings.map(myDateParser).sort(); 

    您可以遍历sortedDates数组,如果发现两个非连续日期,那么您的日期之间会有差距。

     var dateRE = /^(\d{2})[\/\- ](\d{2})[\/\- ](\d{4})/; function dmyOrdA(a, b){ a = a.replace(dateRE,"$3$2$1"); b = b.replace(dateRE,"$3$2$1"); if (a>b) return 1; if (a b) return -1; if (a b) return 1; if (a b) return -1; if (a  

    要在不更改其值的情况下按升序排序日期字符串,请尝试以下操作:

     var T = ["09/06/2015", "25/06/2015", "22/06/2015", "25/07/2015", "18/05/2015"]; var sortedT = T.sort(s1,s2){ var sdate1 = s1.split('/'); var sdate2 = s2.split('/'); var date1 = s1[1]+'/'+s1[0]+'/'+s1[2]; var date2 = s2[1]+'/'+s2[0]+'/'+s2[2]; if (Date.parse(date1) > Date.parse(date2)) return 1; else if (Date.parse(date1) < Date.parse(date2) return -1; else return 0; } 

    结果数组sortedT应该是日期字符串的排序数组。

    注意:

    您的日期格式以dd/mm/yyyy存储,但JavaScript的标准日期格式为mm/dd/yyyy 。 因此,为了在不使用外部日期格式库的情况下将此字符串解析为Date,因此需要在排序期间转换日期字符串以实现兼容性。