使用isoWeekday()从星期一开始


116

我正在创建一个日历,以表格格式打印出数周。一个要求是,根据某些用户的选择,我可以在星期一或星期日开始几周。我使用矩的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。

Answers:


245

尝试使用begin.startOf('isoWeek');代替begin.startOf('week');


10
startOf('week')取决于当前的语言环境,在这种情况下,星期日显然标记为您的情况下一周的开始。startOf('iweek')将在本周的ISO开始,即星期一。但是您是对的,我在官方网站上没有找到任何文档...
devnull69 2013年

15
当前版本的moment.js正在使用isoweek
储蓄者2013年

2
根据@savinger的评论和当前文档进行了编辑:)
Matchu 2014年

20
isoWeek,使用大写字母W,最新版本
Michiel 2014年


13

startOf请先致电isoWeekday

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

工作演示


1
这不能正常工作。对于今天的日期2016-09-05,它返回2016-08-29作为一周的开始日期,这是不正确的,因为今天是星期一(等周)。正确的答案已经被接受。
undefinedman

9

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

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

确保使用它moment().weekday(1);而不是moment.isoWeekday(1)


2

以为我会在以后的任何偷窥中添加这个。它将始终确保其星期一(如果需要),也可用于始终确保星期日。对我来说,我总是需要星期一,但是local取决于所使用的计算机,这很容易解决:

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');

1
可能的快捷方式moment()。isoWeekday(1).startOf('isoweek')。format('dddd DD MM YYYY')
davethecoder

2

这是任何给定工作日的通用解决方案。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);

-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'),不用担心,你会得到星期天或不必考虑是否使用isoweekisoWeek

另外,您可以将其存储在类似的变量中,const period = 'week'并在subtract()add()操作中安全地使用它,例如moment().subtract(1, period).startOf(period);。这与时期无关isoWeek

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.