Rozpoczynanie tygodnia w poniedziałek za pomocą isoWeekday ()

117

Tworzę kalendarz, w którym drukuję tygodnie w formacie tabelarycznym. Jednym z wymagań jest to, żebym mógł rozpocząć tydzień w poniedziałek lub niedzielę, zgodnie z opcją użytkownika. Trudno mi jest używać metody isoWeekday firmy 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

EDYTUJ Źle zrozumiałem, co isoWeekdaywłaściwie robię. Myślałem, że ustawia zmienną „który dzień tygodnia jest pierwszym dniem tygodnia” (która nie istnieje). W rzeczywistości po prostu zmienia dzień tygodnia, tak jak moment.weekday(), ale używa zakresu 1-7 zamiast 0-6.

oszczędzający
źródło

Odpowiedzi:

247

spróbuj użyć begin.startOf('isoWeek');zamiastbegin.startOf('week');

tetri
źródło
10
startOf('week')zależy od aktualnego regionu, w którym niedziela oznacza oczywiście początek tygodnia w twoim przypadku. startOf('iweek')otrzyma ISO początek tygodnia, czyli poniedziałek. Ale masz rację, nie znalazłem żadnej dokumentacji na oficjalnej stronie ...
devnull69
15
Obecna wersja moment.js używa isoweek.
oszczędzający
2
Zredagowane zgodnie z komentarzem @ saveer i aktualną dokumentacją :)
Matchu
20
isoWeek, przez duże W, w najnowszej wersji
Michiel
8
Dokumentowane tutaj: Początek czasu
Vladimir Kornea,
13

Zadzwoń startOfwcześniej isoWeekday.

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

Działające demo

letiagoalves
źródło
1
To nie działa poprawnie. W przypadku dzisiejszej daty 05.09.2016 zwraca 2016-08-29 jako datę rozpoczęcia tygodnia, która nie jest prawdą, ponieważ dzisiaj jest poniedziałek (tydzień iso). właściwa odpowiedź została już zaakceptowana.
undefinedman
9

W ten sposób możesz ustawić pierwszy dzień tygodnia.

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

Upewnij się, że używasz go z moment().weekday(1);zamiast moment.isoWeekday (1)

Roberto Aguilar
źródło
2

pomyślałem, że dodam to dla przyszłych peeps. Zawsze upewni się, że jego poniedziałek, jeśli zajdzie taka potrzeba, może być również wykorzystany, aby zawsze zapewnić niedzielę. Dla mnie zawsze potrzebuję poniedziałku, ale lokalny jest zależny od używanej maszyny, a to jest łatwa naprawa:

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
źródło
1
możliwy moment skrótu (). isoWeekday (1) .startOf ('isoweek'). format ('dddd DD MM RRRR')
davethecoder
2

Oto bardziej ogólne rozwiązanie na dowolny dzień tygodnia. Działające demo na 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
źródło
-1

Dla tych, którzy chcą isoWeekbyć domyślni, możesz zmodyfikować zachowanie momentu w następujący sposób:

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

Teraz możesz po prostu używać someDate.startOf('week')bez obawy, że dostaniesz niedzielę lub będziesz musiał myśleć o tym, czy użyć, isoweekczy isoWeekitp.

Plus można zapisać to w zmiennej jak const period = 'week'i używać go bezpiecznie w subtract()lub add()operacje, np moment().subtract(1, period).startOf(period);. To nie zadziała z okresem isoWeek.

Adam Reis
źródło