javascript - hours - Moment.js: comenzando la semana el lunes con isoWeekday()
moment to timestamp (6)
Estoy creando un calendario donde imprimo semanas en formato tabular. Un requisito es que pueda comenzar las semanas el lunes o el domingo, según alguna opción de usuario. Me está costando usar el método isoWeekday del momento.
// 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);
}
EDITAR No isoWeekday
lo que isoWeekday
realmente estaba haciendo. Pensé que establecía la variable "qué día de la semana es el primer día de la semana" (eso no existe). Lo que realmente hace es simplemente cambiar el día de la semana, al igual que moment.weekday()
, pero utiliza un rango de 1-7 en lugar del 0-6.
Aquí hay una solución más genérica para cualquier día de la semana. Demostración de trabajo en 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);
De esta manera puede establecer el día inicial de la semana.
moment.locale(''en'', {
week: {
dow: 6
}
});
moment.locale(''en'');
Asegúrese de usarlo con moment().weekday(1);
en lugar de moment.isoWeekday (1)
Llame a startOf
antes de isoWeekday
.
var begin = moment(date).startOf(''week'').isoWeekday(1);
Para aquellos que quieren que isoWeek
sea el predeterminado, puedes modificar el comportamiento del momento como tal:
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);
};
Ahora puede simplemente usar someDate.startOf(''week'')
sin preocuparse de que llegue el domingo o tener que pensar si usar isoweek
o isoWeek
etc.
Además, puede almacenar esto en una variable como const period = ''week''
y usarla de forma segura en operaciones de subtract()
o add()
, por ejemplo, moment().subtract(1, period).startOf(period);
. Esto no funcionará con el período siendo isoWeek
.
intente usar begin.startOf(''isoWeek'');
en lugar de begin.startOf(''week'');
pensé que agregaría esto para cualquier futuro pío. Siempre se asegurará de que sea lunes si es necesario, también se puede usar para garantizar siempre el domingo. Para mí, siempre necesito el lunes, pero el local depende de la máquina que se use, y esta es una solución fácil:
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'');