![](/img/trans.png)
[英]Generate all dates of a week using current date also show week starting date on Monday and weekends on Sunday
[英]Starting the week on Monday with isoWeekday()
我正在創建一個日歷,在其中以表格格式打印出幾周。 一個要求是我可以根據某些用戶選項在星期一或星期日開始一周。 我很難使用 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);
}
編輯我誤解了isoWeekday
實際在做什么。 我認為它設置了“一周中的哪一天是一周的第一天”變量(不存在)。 它實際上所做的只是改變一周中的哪一天,就像moment.weekday()
,但使用 1-7 范圍而不是 0-6。
你只需要替換begin.startOf('isoWeek');
用begin.startOf('week');
.
通過這種方式,您可以設置一周的初始日期。
moment.locale('en', {
week: {
dow: 6
}
});
moment.locale('en');
確保將它與moment().weekday(1);
而不是 moment.isoWeekday(1)
以為我會為以后的任何窺視添加這個。 如果需要,它將始終確保其星期一,也可用於始終確保星期日。 對我來說,我總是需要星期一,但本地取決於正在使用的機器,這是一個簡單的解決方法:
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');
這是任何給定工作日的更通用的解決方案。 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);
對於那些希望isoWeek
成為默認值的人,您可以像這樣修改 moment 的行為:
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);
. 這不適用於 period 為isoWeek
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.