【问题标题】:Starting the week on Monday with isoWeekday()使用 isoWeekday() 从星期一开始一周
【发布时间】:2013-09-23 09:56:58
【问题描述】:

我正在创建一个日历,以表格格式打印出周数。一个要求是我可以根据某些用户选项在周一或周日开始一周。我很难使用 moment 的 isoWeekday 方法。

// Start of some date range. Can be any day of the week.
var startOfPeriod = moment("2013-06-23T00:00:00"),

    // We begin on the start of the first week.
    // Mon Tues Wed Thur Fri Sat Sun
    // 20  21   22  23   24  25  26
    begin = moment(startOfPeriod).isoWeekday(1); // will pull from user setting

console.log(begin.isoWeekday()); // 1 - all good

// Let's get the beginning of this first week, respecting the isoWeekday
begin.startOf('week');

console.log(begin.isoWeekday()); // 7 - what happened ???

// Get column headers
for (var i=0; i<7; i++) {
    console.log(begin.format('ddd')); // I want Monday first!
    begin.add('d', 1);
}

jsFiddle

编辑我误解了 isoWeekday 实际在做什么。我认为它设置了“一周中的哪一天是一周的第一天”变量(不存在)。它实际上所做的只是更改星期几,就像moment.weekday(),但使用 1-7 范围而不是 0-6。

【问题讨论】:

    标签: javascript momentjs


    【解决方案1】:

    您只需将begin.startOf('isoWeek'); 替换为begin.startOf('week');

    【讨论】:

    • startOf('week') 取决于当前的语言环境,在您的情况下,星期日显然标志着一周的开始。 startOf('iweek') 将获得本周的 ISO 开始时间,即星期一。但是你说得对,我在官方网站上没有找到任何文档...
    • moment.js 的当前版本使用isoweek
    • 根据@savinger 的评论和current docs 编辑:)
    • isoWeek,大写W,最新版本
    • 记录在这里:Start of Time
    【解决方案2】:

    isoWeekday之前致电startOf

    var begin = moment(date).startOf('week').isoWeekday(1);
    

    Working demo

    【讨论】:

    • 这不能正常工作。对于今天的日期 2016-09-05 它返回 2016-08-29 作为一周的开始日期,这是不正确的,因为今天是星期一(iso 周)。正确答案已被接受。
    【解决方案3】:

    我想我会为以后的任何窥视添加这个。如果需要,它将始终确保其星期一,也可用于始终确保星期日。对我来说,我总是需要星期一,但本地取决于所使用的机器,这是一个简单的解决方法:

    var begin = moment().isoWeekday(1).startOf('week');
    var begin2 = moment().startOf('week');
    // could check to see if day 1 = Sunday  then add 1 day
    // my mac on bst still treats day 1 as sunday    
    
    var firstDay = moment().startOf('week').format('dddd') === 'Sunday' ?     
    moment().startOf('week').add('d',1).format('dddd DD-MM-YYYY') : 
    moment().startOf('week').format('dddd DD-MM-YYYY');
    
    document.body.innerHTML = '<b>could be monday or sunday depending on client: </b><br />' + 
    begin.format('dddd DD-MM-YYYY') + 
    '<br /><br /> <b>should be monday:</b> <br>' + firstDay + 
    '<br><br> <b>could also be sunday or monday </b><br> ' + 
    begin2.format('dddd DD-MM-YYYY');
    

    【讨论】:

    • 可能的快捷方式 moment().isoWeekday(1).startOf('isoweek').format('dddd DD MM YYYY')
    【解决方案4】:

    对于任何给定的工作日,这是一个更通用的解决方案。 Working demo on jsfiddle

    var myIsoWeekDay = 2; // say our weeks start on tuesday, for monday you would type 1, etc.
    
    var startOfPeriod = moment("2013-06-23T00:00:00"),
    
    // how many days do we have to substract?
    var daysToSubtract = moment(startOfPeriod).isoWeekday() >= myIsoWeekDay ?
        moment(startOfPeriod).isoWeekday() - myIsoWeekDay :
        7 + moment(startOfPeriod).isoWeekday() - myIsoWeekDay;
    
    // subtract days from start of period
    var begin = moment(startOfPeriod).subtract('d', daysToSubtract);
    

    【讨论】:

      【解决方案5】:

      这样您可以设置一周的第一天。

      moment.locale('en', {
          week: {
              dow: 6
          }
      });
      moment.locale('en');
      

      确保将其与moment().weekday(1); 一起使用,而不是moment.isoWeekday(1)

      【讨论】:

      • 只需更新,新版本还需要doy(一年中的第一天)。它对我有用,谢谢。
      【解决方案6】:

      对于那些希望 isoWeek 成为默认值的人,您可以像这样修改时刻的行为:

      const moment = require('moment');
      const proto = Object.getPrototypeOf(moment());
      
      const {startOf, endOf} = proto;
      proto.startOf = function(period) {
        if (period === 'week') {
          period = 'isoWeek';
        }
        return startOf.call(this, period);
      };
      proto.endOf = function(period) {
        if (period === 'week') {
          period = 'isoWeek';
        }
        return endOf.call(this, period);
      };
      

      现在您可以简单地使用someDate.startOf('week'),而不必担心您会遇到星期天或不必考虑是使用isoweek 还是isoWeek 等。

      另外,您可以将其存储在 const period = 'week' 之类的变量中,并在 subtract()add() 操作中安全使用它,例如moment().subtract(1, period).startOf(period);。这不适用于句号isoWeek

      【讨论】:

        猜你喜欢
        • 2017-12-14
        • 1970-01-01
        • 1970-01-01
        • 2012-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 1970-01-01
        相关资源
        最近更新 更多