เริ่มต้นสัปดาห์ในวันจันทร์ด้วย isoWeekday ()


117

ฉันกำลังสร้างปฏิทินที่จะพิมพ์สัปดาห์ในรูปแบบตาราง ข้อกำหนดประการหนึ่งคือฉันสามารถเริ่มสัปดาห์ได้ในวันจันทร์หรือวันอาทิตย์ตามตัวเลือกของผู้ใช้ ฉันมีปัญหาในการใช้วิธี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

คำตอบ:


247

ลองใช้begin.startOf('isoWeek');แทนbegin.startOf('week');


10
startOf('week')ขึ้นอยู่กับสถานที่ในปัจจุบันซึ่งเห็นได้ชัดว่าวันอาทิตย์เป็นจุดเริ่มต้นของสัปดาห์ในกรณีของคุณ startOf('iweek')จะได้รับ ISO เริ่มต้นของสัปดาห์ซึ่งก็คือวันจันทร์ แต่คุณพูดถูกฉันไม่พบเอกสารใด ๆ ในเว็บไซต์อย่างเป็นทางการ ...
devnull69

15
รุ่นปัจจุบันของ moment.js isoweekใช้
ประหยัด

2
แก้ไขตามความคิดเห็นของ @ saveer และเอกสารปัจจุบัน :)
Matchu

20
isoWeekด้วยตัวพิมพ์ใหญ่ W ในเวอร์ชันล่าสุด
Michiel

8
เอกสารที่นี่: เริ่มต้นเวลา
Vladimir Kornea

13

โทรstartOfมาก่อนisoWeekday.

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

การสาธิตการทำงาน


1
สิ่งนี้ทำงานไม่ถูกต้อง สำหรับวันที่วันนี้ 2016-09-05 จะส่งคืน 2016-08-29 เป็นวันที่เริ่มต้นของสัปดาห์ซึ่งไม่เป็นความจริงเนื่องจากวันนี้เป็นวันจันทร์ (iso week) คำตอบที่ถูกต้องได้รับการยอมรับแล้ว
undefinedman

9

ด้วยวิธีนี้คุณสามารถกำหนดวันเริ่มต้นของสัปดาห์ได้

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

อย่าลืมใช้moment().weekday(1);แทน moment.isoWeekday (1)


2

คิดว่าฉันจะเพิ่มสิ่งนี้สำหรับทุกคนในอนาคต จะตรวจสอบให้แน่ใจเสมอว่าวันจันทร์หากจำเป็นสามารถใช้เพื่อให้แน่ใจว่าวันอาทิตย์ได้เสมอ สำหรับฉันฉันต้องการวันจันทร์เสมอ แต่ในพื้นที่ขึ้นอยู่กับเครื่องที่ใช้และนี่เป็นการแก้ไขที่ง่าย:

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
ช่วงเวลาทางลัดที่เป็นไปได้ (). isoWeekday (1) .startOf ('isoweek') รูปแบบ ('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')โดยไม่ต้องกังวลว่าคุณจะได้รับวันอาทิตย์หรือต้องคิดว่าจะใช้isoweekหรือisoWeekอื่น ๆ

พลัสที่คุณสามารถจัดเก็บในตัวแปรเหมือนconst period = 'week'และใช้งานได้อย่างปลอดภัยในsubtract()หรือการดำเนินงานเช่นadd() นี้จะไม่ทำงานกับระยะเวลาที่เป็นอยู่moment().subtract(1, period).startOf(period);isoWeek

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.