webentwicklung-frage-antwort-db.com.de

Moment.js - Beginn der Woche am Montag mit isoWeekday ()

Ich erstelle einen Kalender, in dem ich Wochen in tabellarischer Form ausdrucken kann. Eine Voraussetzung ist, dass ich die Wochen entweder montags oder sonntags beginnen kann, je nach Option eines Benutzers. Ich habe es schwer mit der isoWeekday -Methode von 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

EDIT Ich habe missverstanden, was isoWeekday tatsächlich tat. Ich dachte, es würde die Variable "welcher Wochentag ist der erste Tag der Woche" gesetzt (das gibt es nicht). Tatsächlich ändert es einfach den Wochentag, genau wie moment.weekday(), verwendet jedoch einen Bereich von 1 bis 7 anstelle von 0 bis 6.

94
savinger

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

190
tetri

Rufen Sie startOf vor isoWeekday auf.

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

Arbeitsdemo

9
letiagoalves

ich dachte, ich würde dies für zukünftige Blicke hinzufügen. Es wird immer dafür sorgen, dass der Montag bei Bedarf auch verwendet werden kann, um immer den Sonntag sicherzustellen. 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');
2
davethecoder

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

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

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

1
Roberto Aguilar

Hier ist eine generischere 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);
1
Hinrich

Für diejenigen, die möchten, dass isoWeek die Standardeinstellung ist, 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 someDate.startOf('week') verwenden, ohne sich Sorgen machen zu müssen, dass Sie Sonntag haben oder darüber nachdenken müssen, ob Sie isoweek oder isoWeek usw. verwenden sollen.

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

0
Adam Reis