Beginn der Woche am Montag mit isoWeekday ()

116

Ich erstelle einen Kalender, in dem ich Wochen in Tabellenform drucke. Eine Voraussetzung ist, dass ich die Wochen entweder am Montag oder am Sonntag beginnen kann, je nach Benutzeroption. Es fällt mir schwer, die isoWeekday- Methode von moment zu verwenden.

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

BEARBEITEN Ich habe falsch verstanden, was isoWeekdaytatsächlich geschah. Ich dachte, es würde die Variable "Welcher Wochentag ist der erste Wochentag" gesetzt (die nicht existiert). Was es tatsächlich tut, ist einfach den Wochentag zu ändern, genau wie moment.weekday(), aber verwendet einen Bereich von 1-7 anstelle des Bereichs 0-6.

Sparer
quelle

Antworten:

244

versuchen Sie es mit begin.startOf('isoWeek');anstelle vonbegin.startOf('week');

Tetri
quelle
10
startOf('week')hängt vom aktuellen Gebietsschema ab, in dem der Sonntag in Ihrem Fall offensichtlich den Beginn der Woche markiert. startOf('iweek')wird den ISO-Start der Woche bekommen, der Montag ist. Aber Sie haben Recht, ich habe keine Dokumentation auf der offiziellen Website gefunden ...
devnull69
15
Die aktuelle Version von moment.js wird verwendet isoweek.
Retter
2
Bearbeitet gemäß dem Kommentar von @ saveer und den aktuellen Dokumenten :)
Matchu
20
isoWeek, mit einem Großbuchstaben W, in der neuesten Version
Michiel
8
Hier dokumentiert: Beginn der Zeit
Vladimir Kornea
13

Rufen Sie startOfvorher an isoWeekday.

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

Arbeitsdemo

letiagoalves
quelle
1
Dies funktioniert nicht richtig. Für das heutige Datum, den 05.09.2016, wird der 29.08.2016 als Startdatum der Woche zurückgegeben, was nicht der Fall ist, da heute Montag (ISO-Woche) ist. Die richtige Antwort wird bereits akzeptiert.
undefinedman
9

Auf diese Weise können Sie den ersten Wochentag einstellen.

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

moment().weekday(1);Stellen Sie sicher, dass Sie es anstelle von moment.isoWeekday (1) verwenden.

Roberto Aguilar
quelle
2

Ich dachte, ich würde dies für zukünftige Blicke hinzufügen. Es wird immer sicherstellen, dass sein Montag bei Bedarf auch verwendet werden kann, um immer Sonntag zu gewährleisten. Für mich brauche ich immer Montag, aber lokal hängt von der verwendeten Maschine ab, und dies ist eine einfache Lösung:

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
quelle
1
Möglicher Shortcut-Moment (). isoWeekday (1) .startOf ('isoweek'). Format ('TTTD TT MM JJJJ')
Davethecoder
2

Hier ist eine allgemeinere Lösung für einen bestimmten Wochentag. Arbeitsdemo auf 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
quelle
-1

Für diejenigen, die isoWeekdie Standardeinstellung sein möchten , können Sie das Verhalten des Moments als solches ändern:

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

Jetzt können Sie einfach verwenden, someDate.startOf('week')ohne sich Sorgen machen zu müssen, dass Sie Sonntag bekommen oder darüber nachdenken müssen, ob Sie isoweekoder verwenden möchtenisoWeek usw.

Außerdem können Sie dies in einer Variablen wie speichern const period = 'week'und sicher in subtract()oder add()Operationen verwenden, z moment().subtract(1, period).startOf(period);. Dies wird nicht mit Periode sein isoWeek.

Adam Reis
quelle