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.

penyelamat
sumber

Jawaban:

247

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

tetri
sumber
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

letiagoalves
sumber
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)

Roberto Aguilar
sumber
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');
davethecoder
sumber
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);
Hinrich
sumber
-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.

Adam Reis
sumber