【问题标题】:Find minimum and maximum dates查找最小和最大日期
【发布时间】:2012-09-05 15:16:06
【问题描述】:

有一个数组:

var a = new Array();

它包含这样的日期条目:'2012-09-12 09:20'等

我需要使用 javascript 查找最小和最大日期。此代码不适用于时间值。

var minT = Math.min.apply(Math, a);
var maxT = Math.max.apply(Math, a);

如何在 javascript 中解决这个问题?这似乎很复杂,因为我对这种语言不是很有经验。

【问题讨论】:

  • 您的数组是否包含日期字符串或Date 对象?
  • @Rocket:字符串,它可以与Date 对象一起使用;-)
  • 只是为了添加一些东西 - 将您的日期转换为 unix 时间戳,您可以使用 Math.min.applyMath.max.apply,因为 unix 时间戳是一个整数。
  • @Rocket 将它们转换为对象是一种将它们转换为时间戳的方法。您可以轻松获得自 1970-01-01 00:00:00 UTC 以来的毫秒数(没有闰秒)。

标签: javascript date datetime max minimum


【解决方案1】:

应该这样做:

var maxT=new Date(Math.max.apply(null,a));
var minT=new Date(Math.min.apply(null,a));

如果你必须使用字符串,你可以定义一个函数:

function maxDate(data){
    var max = '';
    for(var i=0; i<data.length; i++)
        if(data[i]>max)
            max=data[i];
    return max;
}

然后:

var maxT=maxDate(a);

免责声明:第二种方法仅适用于所有日期字符串格式相同的情况,如果您的数组中有不同格式的日期,您将无法使用此功能。 p>

【讨论】:

  • 这仅在数组包含Date 对象时有效。它在此处包含字符串。
  • @Rocket 你是对的,编辑了我的答案以正确回答问题
【解决方案2】:

试试这个:

var maxDate=new Date(Math.max.apply(null,dates));
var minDate=new Date(Math.min.apply(null,dates));

我在之前的 question 上找到了它

【讨论】:

    【解决方案3】:

    数组中是否填充了 Date 对象? 如果是这样,请使用它们进行比较,并使用许多已知算法之一对它们进行排序。

    如果没有,则使用 Date 对象重新创建数组,每个对象一个,然后按照我上面所说的对数组进行排序。

    【讨论】:

      【解决方案4】:

      Math.min/max 只比较数字,不比较字符串。不要使用它们来表示日期,而是使用Date objects - 它们将通过它们的内部时间戳编号进行比较。尽管如此,最大/最小将返回该内部数字,因此您需要将其转换回Date(请参阅Min/Max of dates in an array?):

      但是,如果您想使用字符串或不能使用重新创建的日期,则需要手动运行数组 - 使用 for 循环或仅限 ES5.1 的迭代器方法.reduce()

      var min = datestrings.reduce(function(min, cur) {
          return cur < min ? cur : min;
      });
      
      // is equivalent to
      var min = datestrings[0];
      for (var i=1; i<datestrings.length; i++)
          if (datestrings[i] < min)
              min = datestrings[i];
      

      如果您的代码不需要高效,您也可以对数组进行排序并获取第一个和最后一个值。默认的字母数字排序将为您的日期格式执行此操作,所以这非常简单:

      datestrings.sort();
      var min = datestrings[0],
          max = datestrings[datestrings.lengh-1];
      

      【讨论】:

        【解决方案5】:

        如果您的数组包含Date 对象,那么这应该可以工作。如果它只包含像'2012-09-12 09:20' 这样的字符串,那么您可以对它们进行排序,并获取第一个和最后一个元素。

        a.sort(function(a, b){
            return Date.parse(a) - Date.parse(b);
        });
        
        var maxT = a[a.length-1];
        var minT = a[0];
        

        【讨论】:

        • 很好,只是数组中项目的顺序被重新组织并且它创建了很多对象(如果有很多日期可能会出现问题)
        • 对数组进行排序并不是很有效 - O(n log n) 而 min&max 需要 O(2n)。此外,您的排序方法会在每次比较中创建两个 Date 对象 - 而字母数字排序将具有相同的结果。
        • @Bergi 字母数字排序仅适用于 Par 的顺序正确的 Y-M-D H:M:S,不适用于 D/M/Y 或 M/D/Y。
        • 嗯。为什么[new Date('2015-01-01'), new Date('2015-03-01'), new Date('2015-02-01')].sort() 是从大到小排序(至少在 Chrome 中),而 [new Date('2015-01-01'), new Date('2015-03-01'), new Date('2015-02-01')].sort(function(a,b) { return a-b; }) 按升序正确排序?
        • 啊,谢谢,有道理。隐式转换太多。很抱歉让这个话题跑题了。
        猜你喜欢
        • 1970-01-01
        • 2015-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-29
        • 1970-01-01
        • 2012-07-16
        • 1970-01-01
        相关资源
        最近更新 更多