JavaScript中按日期排序字符串数组

5
我尝试使用underscorejs的min和max方法,但它们不能处理字符串。根据我所读和学习的内容,因为我从两者都得到了无穷大。
我的数组看起来像:dateData = ["26/06/2016", "04/06/2016", "13/05/2016", "20/07/2016"]
如何抓取这些中的最后一个和第一个日期?
我也尝试使用sort,看起来像:_.chain(dateData).sort().first().value(),但我得到的是数组中的最后一项,而不是数组中的最后一个日期。

排序吧..从排序后的数组中获取第一个和最后一个项目.. - Rayon
@Rayon 我尝试过 _.chain(dateData).sort().last().value() 但返回的是数组中的最后一项,而不是最后一个日期。不过我可能只是太蠢了 :) - pourmesomecode
2
@SmurfEkko,你需要编写一个自定义比较函数来指定排序行为。 - zzzzBov
@zzzzBov 那么做这件事的方法是读取数组中的每个项目,并找出前两位数哪一个更大,然后继续到第二个,再到第三个?我应该这样做吗? - pourmesomecode
@SmurfEkko,不,你需要将值解析为日期,然后比较日期对象。考虑使用像momentjs这样的库进行正确的日期解析。 - zzzzBov
@zzzzBov 哦,好的,谢谢你,我会试一下的! :) - pourmesomecode
7个回答

12

var dateData = ["26/06/2016", "04/06/2016", "13/05/2016", "20/07/2016"];

function dateToNum(d) {
  // Convert date "26/06/2016" to 20160626
  d = d.split("/"); return Number(d[2]+d[1]+d[0]);
}

dateData.sort(function(a,b){
  return dateToNum(a) - dateToNum(b);
});

console.log( dateData );

获取第一个和最后一个日期:

var firstDate = dateData[0];
var lastDate  = dateData[dateData.length -1];

基本上,如果你首先将所有的26/06/2016转换为一个日期数字,比如 20160626,那么你就可以对这些数字进行.sort()排序。

你实际上是在对以下内容进行排序:


20140626  
20140604  
20140513  
20140720  

导致:
[  
  "13/05/2016",  
  "04/06/2016",  
  "26/06/2016",  
  "20/07/2016"  
]

2
谢谢,这正是我在寻找的。我甚至没有考虑事先排序。我试图只是迭代数组中的每个项目并从那里解决它。这是一个更好的方法。再次感谢! - pourmesomecode

2
如果我们可以将日期字符串按照特定格式进行格式化,那么将它们作为字符串排序也会将它们作为日期排序,例如YYYY-MM-DD。
您可以使用localeCompare比较字符串。您可以使用以下代码对日期进行排序:

dateData = ["26/06/2016", "04/06/2016", "13/05/2016", "20/07/2016"]

dateData.sort(function(a, b){
  var A = a.split("/");
  var B = b.split("/");
  var strA = [ A[2], A[1], A[0] ].join("/");
  var strB = [ B[2], B[1], B[0] ].join("/");
  return strA.localeCompare( strB );      
});

console.log( dateData );

一旦排序完成,您可以按以下方式获取最小和最大日期:

var minDate = dateData[0];
var maxDate = dateData[ dateData.length - 1 ];

1

getTime() 方法返回指定日期的通用时间对应的数字值。Date.getTime()

dateData = ["26/06/2016", "04/06/2016", "13/05/2016", "20/07/2016"]
.map(a=>a.split('/').reverse().join('/'))
.sort((a,b)=>new Date(a).getTime() - new Date(b).getTime());
console.log(dateData);


1
一些人已经提到过这个问题,但是你需要将日期字符串转换为可以在排序函数中比较的格式。我没有看到分享如何获取第一个和最后一个日期的方法。这应该可以解决问题:
//original date array
var dateData = ["04/06/2016", "13/05/2016", "20/07/2016","26/06/2016"];

//map through the original array and convert the dates to js date objects
var formattedDates = dateData.map(function(date){
    var splitDate = date.split("/")
    return new Date(splitDate[2],splitDate[1]-1,splitDate[0])
})

//sort the dates
formattedDates.sort(function(a,b){
  // Turn your strings into dates, and then subtract them
  // to get a value that is either negative, positive, or zero.
  return new Date(a) - new Date(b);
});

//Now you can get the first and last dates:
var firstDate = formattedDates[0]
var lastDate = formattedDates[formattedDates.length-1];

//log to check:
console.log('first date: ', firstDate)
console.log('last date: ', lastDate)

0

我知道一种方法可以使用字符串的 .sort() 函数来实现。https://msdn.microsoft.com/en-us/library/4b4fbfhk(v=vs.94).aspx

您需要将数组更改为 YYYY-MM-DD 格式

然后您可以使用以下代码

var dateData = ["2016/06/26", "2016/06/04", "2016/05/13", "2016/07/20"]; dateData.sort(); var first = dateData[0]; var last = dateData[dateData.length-1];

其中 first 是最早的日期,last 是最晚的日期


0
为了方便后续操作,请将格式更改为:YYYY/MM/DD。 这样常规排序将正确获取最小值和最大值,您无需进一步解析。 排序的辅助函数应该像这样:
for(var i=0;i<dateData.length;++i)
{
    var split = dateData[i].split("/");
    dateData[i] = split.reverse().join("/");
}

0

Roko的答案对我有用,+1。Jose也有类似的想法,+1...
...有一种更简单和更强大的方法:.valueOf()

将日期字符串转换为数字

const dateAsNumber = new Date(dateAsString).valueOf()

JS内置了一个用于计算自某个日期以来经过的毫秒数的方法/函数; 这就是.valueOf(),它可以在Date对象上调用。因此,将您的日期字符串转换为Date对象(使用带有日期字符串作为参数的"new Date()"),然后转换为毫秒。

之后,正常的.sort()函数就可以正常工作了。如下所示,供您参考:

const arrayOfDateStrings = ["5/01/2012", "10/01/2020", "10/01/2019", "11/30/2016", "10/01/2021", "02/01/2020"];

const sortedArray = arrayOfDateStrings.sort((a,b)=>new Date(a).valueOf() - new Date(b).valueOf());

console.log(sortedArray);

或者使用 Moment.js 代替内置的 Date 对象/函数,它们的工作方式非常相似。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接