Момент.js-Начало недели в понедельник с isoWeekday()
Я создаю календарь, где я распечатываю недели в табличном формате. Одно из требований заключается в том, что я могу начать недели либо в понедельник, либо в воскресенье, в соответствии с некоторыми пользовательскими опциями. Мне трудно использовать moment's 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);
}
EDIT я понял, что isoWeekday на самом деле делал. Я думал, что он установил переменную" какой день недели является первым днем недели " (это не так существовать.) То, что он на самом деле делает, просто меняет день недели, так же, как moment.weekday(), но использует диапазон 1-7 вместо 0-6.
6 ответов:
думал, что я добавлю это для любых будущих заглядывает. Он всегда будет убедиться, что его понедельник, если это необходимо, также может быть использован, чтобы всегда обеспечить воскресенье. Для меня мне всегда нужен понедельник, но 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');
таким образом, вы можете установить первый день недели.
moment.locale('en', { week: { dow: 6 } }); moment.locale('en');обязательно используйте его с
moment().weekday(1);вместо момента.isoWeekday (1)
вот более общее решение для любого данного дня недели. рабочий пример на 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по умолчанию вы можете изменить поведение момент, как например: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илиisoWeeketc.плюс вы можете хранить это в переменную типа
const period = 'week'и использовать его безопасно вsubtract()илиadd()операции, например,moment().subtract(1, period).startOf(period);. Это не будет работать с периодомisoWeek.
Comments