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);
}
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.
versuchen Sie es mit begin.startOf('isoWeek');
anstelle von begin.startOf('week');
Rufen Sie startOf
vor isoWeekday
auf.
var begin = moment(date).startOf('week').isoWeekday(1);
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');
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.
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);
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.