【问题标题】:Get next date from weekday in JavaScript在 JavaScript 中从工作日获取下一个日期
【发布时间】:2010-12-07 10:22:39
【问题描述】:

如何返回给定工作日的下一个日期(可以是数字 0-6 或名称为星期日至星期六)。

例如,如果今天,2009 年 10 月 16 日星期五我通过了:

  • 星期五,它将返回今天的日期 2009 年 10 月 16 日
  • 星期六返回 2009 年 10 月 17 日
  • 星期四 返回 2009 年 10 月 22 日

【问题讨论】:

  • @Josh Stodola:我没有投反对票,因为我喜欢让用户有机会先解决问题。我对许多问题/答案投了反对票,1 分不算什么。我让他重新表述这个问题,如果他这样做了,那么就没有必要投反对票了。
  • 比起不文明的用户,我个人更喜欢措辞不佳的问题。
  • @Andy, @Josh 常见问题解答清楚地指出:“只要您的问题……在某个地方至少有其他程序员感兴趣……在这里欢迎。没有任何问题太琐碎或太‘新手’”。这是提问者的第一个问题,让她/他放松一下——没有人在第一次尝试时就做到完美。
  • 嘿@AndyE,“@slikts”,@“John Stodola”,@“brianpeiris”。希望你一切都好。已经 7.5 年了)我终于有时间编辑问题))
  • 这是最不欢迎新手的网站之一。我宁愿在一个问题上挣扎几个小时,也不愿在这里发布问题。

标签: javascript datetime weekday


【解决方案1】:

要扩展 user 190106answer,此代码应该可以满足您的需求:

function getNextDay(day, resetTime){
  var days = {
    sunday: 0, monday: 1, tuesday: 2,
    wednesday: 3, thursday: 4, friday: 5, saturday: 6
  };

  var dayIndex = days[day.toLowerCase()];
  if (dayIndex !== undefined) {
    throw new Error('"' + day + '" is not a valid input.');
  }

  var returnDate = new Date();
  var returnDay = returnDate.getDay();
  if (dayIndex !== returnDay) {
    returnDate.setDate(returnDate.getDate() + (dayIndex + (7 - returnDay)) % 7);
  }

  if (resetTime) {
    returnDate.setHours(0);
    returnDate.setMinutes(0);
    returnDate.setSeconds(0);
    returnDate.setMilliseconds(0);
  }
  return returnDate;
}

alert(getNextDay('thursday', true));

【讨论】:

    【解决方案2】:

    如果您不想通过数字而是工作日名称(星期日 - 星期六)来查找某个工作日的未来日期,那么这也可以帮助您:

    function getDateOfWeekday(refday){
        var days = {
            monday: 1,
            tuesday: 2,
            wednesday: 3,
            thursday: 4,
            friday: 5,
            saturday: 6,
            sunday: 0
        };
        if(!days.hasOwnProperty(refday))throw new Error(refday+" is not listed in "+JSON.stringify(days));
        var currDate = new Date();
        var currTimestamp = currDate.getTime();
        var triggerDay = days[refday];
        var dayMillDiff=0;
        var dayInMill = 1000*60*60*24;
        // add a day to dayMillDiff as long as the desired refday (sunday for instance) is not reached
        while(currDate.getDay()!=triggerDay){
            dayMillDiff += dayInMill;
            currDate = new Date(currDate.getTime()+dayInMill);
        }
        return new Date(currTimestamp + dayMillDiff);
    }
    
    var sunday = getDateOfWeekday("sunday");
    document.write("Next Sunday is at: <strong>"+sunday.toLocaleString()+"</strong><br/>");
    
    var thursday = getDateOfWeekday("thursday");
    thursday.setHours(0,0,0,0); // set hours/minutes/seconds and millseconds to zero
    document.write("Next Thursday is at: <strong>"+thursday.toLocaleString()+"</strong> on midnight<br/>");
    
    var tuesday = getDateOfWeekday("tuesday");
    document.write("Next Tuesday is at: <strong>"+tuesday.toLocaleString()+"</strong><br/>");

    【讨论】:

      【解决方案3】:

      这是另一个简单的解决方案

      //takes dayIndex from sunday(0) to saturday(6)
      function nextDate(dayIndex) {
          var today = new Date();
          today.setDate(today.getDate() + (dayIndex - 1 - today.getDay() + 7) % 7 + 1);
          return today;
      }
      document.write("Next Sunday is: "+nextDate(0).toLocaleString()+"<br/>");
      document.write("Next Thursday is: "+nextDate(4).toLocaleString()+"<br/>");
      document.write("Next Saturday is: "+nextDate(6).toLocaleString());

      【讨论】:

      • 唯一对我有帮助的答案。今天是周日,只有这个答案显示下周日的日期,其他人显示今天的日期。
      【解决方案4】:

      这是对 Tim 的回答稍作修改的版本,用于解决特定问题 - 传入日期 d,以及所需的星期几(0-6 日),返回日期

      function nextDay(d, dow){
          d.setDate(d.getDate() + (dow+(7-d.getDay())) % 7);
          return d;
      }
      

      【讨论】:

      • 对于那些需要获得下一周或之后一周的一天:添加一周参数function nextWeekDay(d, dow, w),然后将一周添加到计算中并删除模数:@987654323 @
      【解决方案5】:

      【讨论】:

        【解决方案6】:

        仅加 7 并不能解决问题。

        以下函数将为您提供一周中的第二天。

        function nextDay(x){
            var now = new Date();    
            now.setDate(now.getDate() + (x+(7-now.getDay())) % 7);
            return now;
        }
        

        【讨论】:

        • 对于好奇,这就是它的工作原理:代码获取当前日期 (1-31) 并添加星期几 (0-6) 和所需日期之间的差异星期几 (0-6),然后使用 mod 确保新值不超过 6。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-03
        • 1970-01-01
        • 2020-01-06
        • 2016-03-24
        • 2013-10-06
        • 1970-01-01
        相关资源
        最近更新 更多