jquery 对字符串日期数组排序

ujv3wf0j  于 2023-06-22  发布在  jQuery
关注(0)|答案(5)|浏览(150)

我想按升序对数组排序。日期为字符串格式

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

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

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 < l; i++) {

          var cur = new Date();
          cur.setTime(temp_date_array[i]);
          last = last || cur;
          //console.log(last+' '+cur);

          if (isNewSequence(cur, last)) {
            console.log("Not Sequence");
          }
        }

        //return dates;
    }

     function isNewSequence(a, b) {
          if (a - b > (24 * 60 * 60 * 1000))
              return true;
          return false;
      }
ngynwnxp

ngynwnxp1#

简单解决方案

不需要将字符串转换为日期或使用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()来简化排序函数。上面的代码片段显示了这种替代方法。

运行测试片段

<!doctype html>
<html>
<body style="font-family: monospace">
<ol id="stdout"></ol>
<script>
  var data = ["09/06/2015", "25/06/2015", "22/06/2015", "25/07/2015", "18/05/2015"];

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

for(var i=0; i<data.length; i++) 
  stdout.innerHTML += '<li>' + data[i];
</script>
</body>
</html>
disbfnqx

disbfnqx2#

如果要对字符串进行排序,您需要将字符串转换为日期,并比较这些日期。您可以使用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数组,如果你发现两个不连续的日期,那么你的日期之间有间隔。

k5ifujac

k5ifujac3#

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;
return 0; }
function dmyOrdD(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;
return 0; }
function mdyOrdA(a, b){
a = a.replace(dateRE,"$3$1$2");
b = b.replace(dateRE,"$3$1$2");
if (a>b) return 1;
if (a <b) return -1;
return 0; }
function mdyOrdD(a, b){
a = a.replace(dateRE,"$3$1$2");
b = b.replace(dateRE,"$3$1$2");
if (a>b) return -1;
if (a <b) return 1;
return 0; } 

dateArray = new Array("09/06/2015", "25/06/2015", "22/06/2015", "25/07/2015", "18/05/2015");
var c = dateArray.sort( dmyOrdA );

console.log(c);
inn6fuwd

inn6fuwd4#

这是另一个使用es6箭头函数的解决方案;在两行中完成工作。
我在这里看到的投票最多的答案的问题是,当前导零丢失为个位数的天/月时,它会失败。
例如:var data = ["9/6/2015", "12/6/2015", "22/6/2015", "25/7/2015", "18/5/2015"];
最可靠的方法是使用日期排序而不是字符串排序。尽管从性能的Angular 来看,将这些字符串强制转换为Date看起来可能是一种开销。

<!doctype html>
<html>

  <body style="font-family: monospace; font-size: 16px;">
  <ol id="demo"></ol>

  <script>
    var data = ["09/06/2015", "25/06/2015", "22/06/2015", "25/07/2015", "18/05/2015"];
    const toDate = (el) => new Date(el.split('/').reverse().join('-'));
    data.sort((a, b) => toDate(a) - toDate(b));

    // renders the results in an ordered list
    for(var i=0; i<data.length; i++) 
      demo.innerHTML += `<li> ${data[i]}`;
  </script>

</body></html>
icnyk63a

icnyk63a5#

要对日期字符串进行升序排序 * 而不改变其值 *,请尝试以下操作:

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,因此需要在排序期间转换日期字符串以实现兼容性。

相关问题