Bắt đầu một tuần vào Thứ Hai với isoWeekday ()


116

Tôi đang tạo một lịch trong đó tôi in ra các tuần ở định dạng bảng. Một yêu cầu là tôi có thể bắt đầu các tuần vào Thứ Hai hoặc Chủ Nhật, theo một số tùy chọn của người dùng. Tôi đang gặp khó khăn khi sử dụng phương pháp isoWeekday của moment .

// 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

CHỈNH SỬA Tôi đã hiểu sai những gì isoWeekdayđang thực sự làm. Tôi nghĩ rằng nó đặt biến "ngày nào trong tuần là ngày đầu tiên trong tuần" (điều đó không tồn tại). Những gì nó thực sự làm chỉ đơn giản là thay đổi ngày trong tuần, giống như moment.weekday(), nhưng sử dụng phạm vi 1-7 thay vì 0-6.

Câu trả lời:


246

thử sử dụng begin.startOf('isoWeek');thay vìbegin.startOf('week');


10
startOf('week')phụ thuộc vào ngôn ngữ hiện tại, nơi Chủ nhật rõ ràng là ngày bắt đầu của tuần trong trường hợp của bạn. startOf('iweek')ISO sẽ bắt đầu vào thứ Hai. Nhưng bạn nói đúng, tôi không tìm thấy bất kỳ tài liệu trên trang web chính thức ...
devnull69

15
Phiên bản hiện tại của moment.js đang sử dụng isoweek.
saveer

2
Đã chỉnh sửa theo nhận xét của @ saveer và các tài liệu hiện tại :)
Matchu

20
isoWeek, với chữ W viết hoa, trong phiên bản mới nhất
Michiel

8
Tài liệu ở đây: Bắt đầu thời gian
Vladimir Kornea

13

Gọi startOftrước isoWeekday.

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

Bản demo làm việc


1
Điều này không hoạt động đúng. Đối với ngày hôm nay, 2016-09-05, nó trả về 2016-08-29 là ngày bắt đầu của tuần, điều này không đúng, vì hôm nay là thứ Hai (tuần thứ nhất). câu trả lời thích hợp đã được chấp nhận.
undefinedman

9

Bằng cách này, bạn có thể đặt ngày đầu tiên trong tuần.

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

Đảm bảo sử dụng nó với moment().weekday(1);thay vì moment.isoWeekday (1)


2

Tôi nghĩ rằng tôi sẽ thêm điều này cho bất kỳ lần xem nào trong tương lai. Nó sẽ luôn đảm bảo rằng thứ hai của nó nếu cần, cũng có thể được sử dụng để luôn đảm bảo chủ nhật. Đối với tôi, tôi luôn cần thứ hai, nhưng cục bộ phụ thuộc vào máy được sử dụng và đây là một cách khắc phục dễ dàng:

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
thời điểm tắt có thể có (). isoWeekday (1) .startOf ('isoweek'). format ('dddd DD MM YYYY')
davethecoder

2

Đây là một giải pháp chung hơn cho bất kỳ ngày nào trong tuần nhất định. Bản demo làm việc trên 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

Đối với những người muốn isoWeektrở thành mặc định, bạn có thể sửa đổi hành vi của khoảnh khắc như:

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

Giờ đây, bạn có thể đơn giản sử dụng someDate.startOf('week')mà không cần lo lắng rằng bạn sẽ nhận được chủ nhật hoặc phải suy nghĩ xem có nên sử dụng isoweekhay không, isoWeekv.v.

Thêm vào đó, bạn có thể lưu trữ nó trong một biến như const period = 'week'và sử dụng nó một cách an toàn trong subtract()hoặc các add()hoạt động, ví dụ moment().subtract(1, period).startOf(period);. Điều này sẽ không hoạt động với thời gian isoWeek.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.