使用moment的isoWeekday创建日期网格

时间:2017-03-06 17:05:53

标签: javascript date calendar momentjs

我正在尝试为日历创建日期网格。当星期天被指定为"一周的第一天时,我有它工作。"

使用星期日作为一周的开始日期(工作)

鉴于2017年3月,网格将以Sunday, February 26, 2017开头,并以Saturday, April 1, 2017结束。我就是这样做的:



let now = moment('2017/03/06/', 'YYYY/MM/DD');
let startOfGrid = now.clone().startOf('month').startOf('week');
let endOfGrid = now.clone().endOf('month').endOf('week');

console.log(startOfGrid.format()); // Sunday, Febrary 26, 2017
console.log(endOfGrid.format()); // Saturday, April 1, 2017

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script>
&#13;
&#13;
&#13;

然后我将这两个日期通过,以填写之间的日期,这些日期为我提供了日历网格的所有日期。

使用星期六或星期一作为一周的开始日期(不工作)

我需要能够支持星期六或星期一开始的一周,但我似乎无法正确设置,结果在几个月内并不一致。让我们以星期六为例:

再次给出3月,但将周开始设置为saturday,并使用startOf('isoWeek'),我最终将星期一作为本周的开始(应该是星期六):

&#13;
&#13;
let now = moment('2017/03/06/', 'YYYY/MM/DD');
let startOfGrid = now.clone().startOf('month').isoWeekday('saturday').startOf('isoWeek');
let endOfGrid = now.clone().endOf('month').isoWeekday('saturday').endOf('isoWeek');

console.log(startOfGrid.format()); // Monday, Febrary 27, 2017
console.log(endOfGrid.format()); // Sunday, April 2, 2017
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script>
&#13;
&#13;
&#13;

我应该将星期六作为网格的开头,将星期五作为结束。

我怎样才能让它发挥作用?

1 个答案:

答案 0 :(得分:2)

根据https://momentjs.com/docs/#/customization/https://momentjs.com/docs/#/i18n/changing-locale/汇总的一些内容,您可以使用moment.updateLocale全局覆盖语言环境配置,如下所示:

moment.updateLocale('en', {
    week: {
        dow: 6  //week starts on saturday
    }
});

这将影响将来创建的所有时刻对象,但不会影响已创建的对象。或者,如果您想要更灵活,可以定义自己的语言环境:

moment.defineLocale('en-mod', {
    parentLocale: 'en',
    week: {
        dow: 6  //week starts on saturday
    }
});

请注意,这也将全局设置区域设置,因此您可能希望立即调用moment.locale('en');以更改回默认值(或您最初设置的任何区域设置)。

然后,使用自定义区域设置定义,您可以在单个时刻对象上使用它,即:moment().locale('en-mod');