Javascript 以isoWeekday()开始本周的星期一
我正在创建一个日历,以表格格式打印周数。一个要求是,我能够开始星期一或星期天,根据一些用户的选择。我很难用矩量法Javascript 以isoWeekday()开始本周的星期一,javascript,momentjs,Javascript,Momentjs,我正在创建一个日历,以表格格式打印周数。一个要求是,我能够开始星期一或星期天,根据一些用户的选择。我很难用矩量法 //某个日期范围的开始。可以是一周中的任何一天。 var startOfPeriod=时刻(“2013-06-23T00:00:00”), //我们从第一周开始。 //周一周二周三周四周五周六周日 // 20 21 22 23 24 25 26 开始=时刻(开始时间)。等工作日(1);//将从用户设置中提取 console.log(begin.isoWeekday()
//某个日期范围的开始。可以是一周中的任何一天。
var startOfPeriod=时刻(“2013-06-23T00:00:00”),
//我们从第一周开始。
//周一周二周三周四周五周六周日
// 20 21 22 23 24 25 26
开始=时刻(开始时间)。等工作日(1);//将从用户设置中提取
console.log(begin.isoWeekday());//1-一切都好
//让我们从第一周开始,尊重等工作日
开始。开始时间(“周”);
console.log(begin.isoWeekday());//发生了什么事???
//获取列标题
对于(var i=0;i您只需将begin.startOf('isoWeek');
替换为begin.startOf('week');
在isoWeekday
之前调用startOf
var begin = moment(date).startOf('week').isoWeekday(1);
我想我会在将来的任何PEEP中添加此选项。如果需要,它将始终确保它是星期一,也可以用于始终确保星期天。对我来说,我始终需要星期一,但本地取决于所使用的机器,这是一个简单的解决方法:
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');
var begin=moment().isoWeekday(1).startOf('week');
var begin2=moment().startOf('week');
//可以检查是否第1天=星期天,然后添加1天
//我在英国夏令时的mac仍然将第一天视为周日
var firstDay=moment().startOf('week').format('ddddd')==='Sunday'?
矩().startOf('week')。添加('d',1)。格式('dddd-MM-YYYY'):
矩().startOf('week')。格式('dddd-MM-YYYY');
document.body.innerHTML='可以是周一或周日,具体取决于客户端:
'+
begin.format('dddd-MM-YYYY')+
“
应该是星期一:
”+第一天+
“
也可以是周日或周一”
+
begin2.格式('dddd-MM-YYYY');
对于任何给定的工作日,这里都有一个更通用的解决方案
通过这种方式,您可以设置一周的第一天
moment.locale('en', {
week: {
dow: 6
}
});
moment.locale('en');
请确保将其与moment().weekday(1);
一起使用,而不是与矩一起使用。isoWeekday(1)对于那些希望将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()
操作中安全使用,例如矩().subtract(1,period).startOf(period);
。这在isoWeek
期间不起作用
取决于当前的区域设置,在您的案例中,星期日明显标志着一周的开始。startOf('iweek'))
将获得本周的ISO开始日期,也就是周一。但是你说得对,我在官方网站上没有找到任何文档……当前版本的moment.js使用的是isoweek
。根据@savinger的评论和:)isoweek
,大写为W,最新版本的文档如下:可能的快捷方式moment().isoWeekday(1).startOf('isoweek').format('dddd-DD-MM-YYYY')这不能正常工作。对于今天的日期2016-09-05,它返回2016-08-29作为一周的开始日期,该日期不正确,因为今天是星期一(iso周)。正确的答案已经被接受。只需更新,新版本也需要doy(每年的第一天)。这对我有用,谢谢。
moment.locale('en', {
week: {
dow: 6
}
});
moment.locale('en');
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);
};