【问题标题】:Most efficient way to get the dates for the past 7 days?获取过去 7 天日期的最有效方法?
【发布时间】:2014-04-03 23:34:32
【问题描述】:

我有两个函数可以用来获取过去 7 天的日期并将其格式化为特定格式,但是速度很慢,有没有人知道更好的方法可能是使用循环或类似的方法?

 function formatDate(date){

    var dd = date.getDate();
    var mm = date.getMonth()+1;
    var yyyy = date.getFullYear();
    if(dd<10) {dd='0'+dd}
    if(mm<10) {mm='0'+mm}
    date = mm+'/'+dd+'/'+yyyy;
    return date
 }

 function Last7Days () {

      var today = new Date();
      var oneDayAgo = new Date(today);
      var twoDaysAgo = new Date(today);
      var threeDaysAgo = new Date(today);
      var fourDaysAgo = new Date(today);
      var fiveDaysAgo = new Date(today);
      var sixDaysAgo = new Date(today);

      oneDayAgo.setDate(today.getDate() - 1);
      twoDaysAgo.setDate(today.getDate() - 2);
      threeDaysAgo.setDate(today.getDate() - 3);
      fourDaysAgo.setDate(today.getDate() - 4);
      fiveDaysAgo.setDate(today.getDate() - 5);
      sixDaysAgo.setDate(today.getDate() - 6);

      var result0 = formatDate(today);
      var result1 = formatDate(oneDayAgo);
      var result2 = formatDate(twoDaysAgo);
      var result3 = formatDate(threeDaysAgo);
      var result4 = formatDate(fourDaysAgo);
      var result5 = formatDate(fiveDaysAgo);
      var result6 = formatDate(sixDaysAgo);

      var result = result0+","+result1+","+result2+","+result3+","+result4+","+result5+","+result6;

      return(result);
 }

【问题讨论】:

  • 循环,它们很有用。数组,它们也很有用。
  • 在代码大小或运行时方面效率低?

标签: javascript date days


【解决方案1】:
function Last7Days () {
    var result = [];
    for (var i=0; i<7; i++) {
        var d = new Date();
        d.setDate(d.getDate() - i);
        result.push( formatDate(d) )
    }

    return(result.join(','));
}

FIDDLE

或者整个事情的另一种解决方案

function Last7Days () {
    return '0123456'.split('').map(function(n) {
        var d = new Date();
        d.setDate(d.getDate() - n);

        return (function(day, month, year) {
            return [day<10 ? '0'+day : day, month<10 ? '0'+month : month, year].join('/');
        })(d.getDate(), d.getMonth(), d.getFullYear());
    }).join(',');
 }

FIDDLE

【讨论】:

  • @gerdhübner - 这只是使用map 进行迭代的一种技巧,如果您需要的迭代次数超过 9 次,请找到某种方法来创建具有超过 9 个索引的数组……显然! (想到new Array(12)
  • 在第二种解决方案中,必须将 +1 添加到 month 以产生正确的结果。
【解决方案2】:

或者ES6方式:

const dates = [...Array(7)].map((_, i) => {
    const d = new Date()
    d.setDate(d.getDate() - i)
    return d
})

【讨论】:

    【解决方案3】:

    使用Moment.js

    daysAgo = {}
    for(var i=1; i<=7; i++) {
      daysAgo[i] = moment().subtract(i, 'days').format("DD MM YYYY")
    }
    return daysAgo
    

    【讨论】:

    • 为什么这么讨厌&lt;8
    • 可能应该返回一个数组,而不是一个对象。
    【解决方案4】:

    我喜欢尽可能简短高效的代码,可能不是最好的,但 IMO 两全其美:

    Array(7) // Create empty array of specified length, here a week.
        .fill(new Date()) // Fill it with dates of your choice, here today.
        .map((today, i) => today - 8.64e7 * i) // Subtract days worth of time times the index
        .map(day => formatDate(day)) // format your dates however you like
    

    【讨论】:

      【解决方案5】:
      var dates = Array.apply(null, new Array(7))
           .map(function() {
               return new Date();
           })
           .map(function(v, i) {
               v.setDate(v.getDate() - i);
               return v;
           })
           .map(function(v) {
               return formatDate(v);
           })
           .reverse()
           .join(',');
      

      JSFiddle:http://jsfiddle.net/R5dnu/1/

      【讨论】:

      • 我认为 OP 想要高效的东西? ;-)
      • @RobG:“效率”是一个模糊的术语。从可读性和可维护性的角度来看,这段代码效率更高。
      • 是的,“高效”应该是合格的(代码量?速度?可维护性?)。可读性在旁观者的眼中。 :-) 就速度而言,OP 可能和任何其他的一样快,但肯定是冗长的。您可以将Array.apply(null, new Array(7)) 替换为[0,0,0,0,0,0,0],但不知道是否有帮助。
      • @RobG:是的,[0,0,0,0,0,0,0] 确实可以使用。它没有明确说明7,因此您必须手动计算:-)
      • 该代码看起来并不比 an alternative version 更具可读性,后者在单个映射函数中做的事情几乎相同。我看不出多次调用map 没有任何好处。
      【解决方案6】:

      嗯,再来一个不会有什么坏处。请注意,m/d/y 格式的日期对许多人来说非常令人困惑。

      // Get 7 days prior to provided date or today
      function last7Days(d) {
        d = +(d || new Date()), days = [], i=7;
        while (i--) {
          days.push(formatUSDate(new Date(d-=8.64e7)));
        }
        return days;
      }
      
      // Return date string in mm/dd/y format
      function formatUSDate(d) {
        function z(n){return (n<10?'0':'')+ +n;}
        return z(d.getMonth() + 1) + '/' + z(d.getDate()) + '/' + d.getFullYear();
      }
      
      console.log(last7Days().join('\n'));
      

      【讨论】:

      • 我相信这可能会在那些日子里失败,如果您的当前时间(分别)在最后一小时或一天的第一个小时。 (私人笔记:斯托克顿博士的鬼魂再次来袭!)
      • 它调整时间值,它是UTC,因此不受夏令时的影响。无论如何,夏令时更改是在 02:00,因此无论哪种方式一小时都不会更改日期。
      • 也许我理解错了,但是通过从 23 小时或 25 小时的一天中减去 24 小时,看起来您可能会遇到使用 setDate() 方法时不会遇到的问题其他答案。但我还没有实际测试过。
      • 经过测试。如果我传入(来自美国)new Date(2014, 02, 12, 0, 30),那么输出会跳过 3 月 9 日。如果我传入new Date(2014, 10, 4, 23, 30),那么我会得到两次 11 月 2 日。
      • 我认为你是对的。我通常从不使用时间来调整日期,所以现在它做了设置日期的事情。 :-/ 在测试时,我认为我发现了 Safari 如何创建日期的错误。
      【解决方案7】:

      基于@adeneo 解决方案,我认为我们可以发送天数...不是 7 天解决方案,但这可能是更好的方法:

      function LastDays (n, option) {
        let arr = Array.apply(0, Array(n)).map(function(v,i){return i}),
        		weekday = new Array(7);
            
        weekday[0] = "Sunday";
        weekday[1] = "Monday";
        weekday[2] = "Tuesday";
        weekday[3] = "Wednesday";
        weekday[4] = "Thursday";
        weekday[5] = "Friday";
        weekday[6] = "Saturday";
        
        return arr.map(function(n) {
          let date = new Date();
          date.setDate(date.getDate() - n);
          return (function(day, month, year, weekendDay) {
          	switch(option) {
            	case 'weekday': return weekday[weekendDay];
            	default: return [day<10 ? '0'+day : day, month<10 ? '0'+month : month, year].join('/');
            }
          })(date.getDate(), date.getMonth(), date.getFullYear(), date.getDay());
        }).join(', ');
      }
      
      document.getElementById("testA").innerHTML = LastDays(3)
      document.getElementById("testB").innerHTML = LastDays(5,'weekday')
      <div id="testA"></div>
      
      <hr/>
      
      <div id="testB"></div>

      FIDDLE

      【讨论】:

        【解决方案8】:
        function last7Days() {
              let today = new Date();
              let lastSevenDays = [today.toLocaleDateString()];
              let dateOffset;
              for (let i = 1; i < 7; i++) {
                dateOffset = (24 * 60 * 60 * 1000) //Reset the value evry iteration
                dateOffset *= i;
                today = new Date(); //Reset the day value evry iteration
                today.setTime(today.getTime() - dateOffset);
                lastSevenDays.push(today.toLocaleDateString());
              }
              return lastSevenDays;
            }
            console.log(last7Days());
        

        【讨论】:

        • 代码转储不能提供好的答案。你应该解释如何为什么这可以解决他们的问题。我推荐阅读,“How do I write a good answer?"。这可以帮助未来的用户学习并最终将这些知识应用到他们自己的代码中。当代码被解释时,你也可能会得到用户的积极反馈/赞成。
        猜你喜欢
        • 2020-01-13
        • 1970-01-01
        • 2021-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多