【问题标题】:How to get the date ranges of a given week number in JS如何在JS中获取给定周数的日期范围
【发布时间】:2017-07-26 17:09:24
【问题描述】:

如果该周恰好是连续 2 个月,我需要知道该周所在的确切月份。例如,2016 年的第 52 周在 2016 年 12 月和 2017 年 1 月之间。另外,2017 年的第 5 周从 2017 年 1 月 30 日到 2 月 5 日开始。

所以给定一年中的周数,我可以得到它所在的月份。我需要知道是否有任何 JS 库可以轻松实现这一点。

我知道我可以从特定日期值中获取周数,但还没有找到一种方法来获取日期所在的日期范围,以便我可以从中得出月份。如果momentJS 或任何其他 lib 都可以做到这一点,我该如何使用它们来实现这一点?

提前致谢

【问题讨论】:

    标签: javascript date reactjs momentjs


    【解决方案1】:

    我们想为给定一周的开始和结束创建一个日期对象。

    momentjs 是一个很好的库,可以更轻松地使用日期对象。

    var moment = require('moment');
    
    function getMonths(weekNumber) {
      var beginningOfWeek = moment().week(weekNumber).startOf('week');
      var endOfWeek = moment().week(weekNumber).startOf('week').add(6, 'days');
      console.log(beginningOfWeek.format('MMMM'));
      console.log(endOfWeek.format('MMMM'));
    }
    

    给定一个星期数,我们将创建一个时刻对象,并在六天后创建另一个。然后我们在一周的开始和结束时记录月份。

    这是一个例子:

    getMonths(5);
    

    一月

    二月

    【讨论】:

    • 这考虑到哪一年?2017?如果是,getMonths(0) 中的 0 是指 2017 年的第一周吗?但 2017 年的第一周在 1 月开始和结束,而不是 12 月。
    • 好点,似乎moment().week(0) 给出了一年中的最后一周,所以week(1) 将是一年中的第一周(尽管他们的docs 没有明确解释这一点)。我提供了一个更合乎逻辑的例子。此外,我更新了我的代码以修复导致早期错误结果的逻辑问题(即选择一周的第一天而不是当天)。
    【解决方案2】:

    您可以通过添加更多 6 天轻松获得周结束日期

    function getDateOfISOWeek(w, y) {
            var simple = new Date(y, 0, 1 + (w - 1) * 7);
            var dow = simple.getDay();
            var ISOweekStart = simple;
            if (dow <= 4)
                ISOweekStart.setDate(simple.getDate() - simple.getDay() + 1);
            else
                ISOweekStart.setDate(simple.getDate() + 8 - simple.getDay());
            return ISOweekStart;
        }
    
    
        function getDateRangeOfWeek(w, y) {
            var monthNames = ["January", "February", "March", "April", "May", "June",
      "July", "August", "September", "October", "November", "December"
    ];
            var date = getDateOfISOWeek(w, y);
            var monthStart = monthNames[date.getMonth()];
            // easily get ending date by adding 6 days more
            date.setDate(date.getDate() + 6);
            // then you can have months
            var monthEnd = monthNames[date.getMonth()];
            return (monthStart == monthEnd) ? monthStart : [monthStart, monthEnd];
        }
        
        console.log(getDateRangeOfWeek(52, 2016));
        console.log(getDateRangeOfWeek(51, 2016));
        console.log(getDateRangeOfWeek(5, 2017));

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-30
      • 1970-01-01
      • 1970-01-01
      • 2023-01-12
      • 1970-01-01
      • 1970-01-01
      • 2021-06-22
      相关资源
      最近更新 更多