【问题标题】:Getting incorrect date range from the week number in JavaScript从 JavaScript 中的周数获取不正确的日期范围
【发布时间】:2020-11-09 07:14:45
【问题描述】:

我有一个 javascript 函数,它根据周数计算日期范围

Date.prototype.getWeek = function weekCalc() {
  const date = new Date(this.getTime());
  date.setHours(0, 0, 0, 0);
  date.setDate((date.getDate() + 3 - (date.getDay() + 6)) % 7);
  const week1 = new Date(date.getFullYear(), 0, 4);

  return 1 + Math.round((((date.getTime() - week1.getTime()) / 86400000 - 3 + (week1.getDay() + 6)) % 7) / 7);
};

const getDateRangeOfWeek = (weekNo, y) => {
  const d1 = new Date(`${y}`);
  const pastDays = d1.getDay() - 1;
  d1.setDate(d1.getDate() - pastDays);
  d1.setDate(d1.getDate() + 7 * (weekNo - d1.getWeek()));
  const rangeIsFrom = `${`0${d1.getDate()}`.slice(-2)}/${`0${d1.getMonth() + 1}`.slice(-2)}/${d1.getFullYear().toString().substring(2)}`;
  d1.setDate(d1.getDate() + 6);
  const rangeIsTo = `${`0${d1.getDate()}`.slice(-2)}/${`0${d1.getMonth() + 1}`.slice(-2)}/${d1.getFullYear().toString().substring(2)}`;
  return `${rangeIsFrom}-${rangeIsTo}`;
};

console.log(getDateRangeOfWeek(52, 2016));

当您根据 ISO 8061 在 2016 年第 52 周对其进行测试时,它会给出

getDateRangeOfWeek(52, 2016);
"19/12/16-25/12/16"

这有点不正确,请查看https://www.calendar-week.org/2016/52

我不确定上面的实现出了什么问题?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    我没有费心挖掘您的代码,但我确实拼凑了一个可以检索所需结果的解决方案:

    function addDays(date, days) {
      let newDate = new Date(date);
      newDate.setDate(newDate.getDate() + days)
      return newDate;
    }
    
    let locale = new Intl.DateTimeFormat('en-GB',{ dateStyle: 'short'});
    
    function formatDate(date) {
      return locale.format(date)
    }
    
    function getDateOfISOWeek(w, y) {
      let simple = new Date(y, 0, 1 + (w - 1) * 7);
      let dow = simple.getDay();
      let ISOweekStart = simple;
      if (dow <= 4)
          ISOweekStart.setDate(simple.getDate() - simple.getDay() + 1);
      else
          ISOweekStart.setDate(simple.getDate() + 8 - simple.getDay());
      let ISOweekEnd = addDays(ISOweekStart, 6);
    
      //let dateSpanLong = `${ISOweekStart} to ${ISOweekEnd}`; // date objects to do with what you please;
      let dateSpanShort = `${formatDate(ISOweekStart)} to ${formatDate(ISOweekEnd)}`;
      return dateSpanShort;
    }
    
    console.log(getDateOfISOWeek(52,2016)) // returns '26/12/2016 to 01/01/2017'
    

    这是Intl.DateTimeFormat options 的一个很好的参考...

    我从 adding the 6 days 借来的另一个 StackOverflow 帖子...

    我用它来获取correct start of the week

    【讨论】:

    • 很抱歉,但我看不出这对他有什么帮助。他想知道为什么他的代码不工作,而不是一个有效的解决方案。而且由于我们确实返回了一个日期范围,所以他的命名更好。
    • 你可能是对的。但以防万一他需要一个可行的解决方案,我想我会提供它,因为编译只需要几分钟......
    • @Doomd 这就是为什么我赞成你的答案但没有接受它的原因。因为我想知道它在某些情况下失败的原因。感谢您的参考和答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 2012-06-24
    相关资源
    最近更新 更多