Memulai minggu pada hari Senin dengan isoWeekday ()


117

Saya membuat kalender tempat saya mencetak minggu dalam format tabel. Salah satu persyaratannya adalah saya dapat memulai minggu-minggu tersebut pada hari Senin atau Minggu, sesuai dengan beberapa opsi pengguna. Saya mengalami kesulitan menggunakan metode isoWeekday momen .

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

EDIT Saya salah paham tentang apa isoWeekdayyang sebenarnya saya lakukan. Saya pikir itu menetapkan variabel "hari mana dalam seminggu yang merupakan hari pertama dalam minggu" (yang tidak ada). Apa yang sebenarnya dilakukannya hanyalah mengubah hari dalam seminggu, seperti halnya moment.weekday(), tetapi menggunakan rentang 1-7, bukan 0-6.

Jawaban:


247

coba gunakan, begin.startOf('isoWeek');bukanbegin.startOf('week');


10
startOf('week')tergantung pada lokasi saat ini di mana hari Minggu jelas menandai awal minggu dalam kasus Anda. startOf('iweek')akan mendapatkan ISO awal minggu ini, yaitu Senin. Tapi Anda benar, saya tidak menemukan dokumentasi apapun di situs resmi ...
devnull69

15
Versi moment.js saat ini sedang digunakan isoweek.
penabung

2
Diedit menurut komentar @ savinger dan dokumen saat ini :)
Matchu

20
isoWeek, dengan huruf besar W, dalam versi terbaru
Michiel

8
Didokumentasikan di sini: Awal Waktu
Vladimir Kornea

13

Telepon startOfsebelumnya isoWeekday.

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

Demo kerja


1
Ini tidak bekerja dengan baik. Untuk tanggal hari ini, 2016-09-05 mengembalikan 2016-08-29 sebagai tanggal awal minggu yang tidak benar, karena hari ini adalah Senin (minggu iso). jawaban yang tepat sudah diterima.
undefinedman

9

Dengan cara ini Anda dapat mengatur hari pertama dalam seminggu.

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

Pastikan untuk menggunakannya dengan moment().weekday(1);bukannya moment.isoWeekday (1)


2

Saya pikir saya akan menambahkan ini untuk mengintip di masa depan. Itu akan selalu memastikan bahwa seninnya jika diperlukan, juga dapat digunakan untuk selalu memastikan hari minggu. Bagi saya, saya selalu membutuhkan hari Senin, tetapi lokal tergantung pada mesin yang digunakan, dan ini adalah perbaikan yang mudah:

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
kemungkinan momen pintas (). isoWeekday (1) .startOf ('isoweek'). format ('dddd DD MM YYYY')
davethecoder

2

Berikut adalah solusi yang lebih umum untuk hari kerja tertentu. Demo kerja di 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

Bagi yang ingin isoWeekmenjadi bawaan Anda bisa mengubah tingkah laku momen seperti:

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

Sekarang Anda dapat dengan mudah menggunakan someDate.startOf('week')tanpa khawatir Anda akan mendapatkan hari Minggu atau harus memikirkan apakah akan menggunakan isoweekatau isoWeekdll.

Selain itu, Anda dapat menyimpan ini dalam variabel seperti const period = 'week'dan menggunakannya dengan aman dalam operasi subtract()atau add(), mis moment().subtract(1, period).startOf(period);. Ini tidak akan berhasil dengan makhluk haid isoWeek.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.