Comenzando la semana el lunes con isoWeekday ()

117

Estoy creando un calendario en el que imprimo semanas en formato tabular. Un requisito es que pueda comenzar las semanas el lunes o el domingo, según alguna opción del usuario. Estoy teniendo dificultades para usar el método isoWeekday de 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

EDITAR Entendí mal lo que isoWeekdayestaba haciendo en realidad. Pensé que establecía la variable "qué día de la semana es el primer día de la semana" (que no existe). Lo que realmente hace es simplemente cambiar el día de la semana, como moment.weekday(), pero usa un rango 1-7 en lugar del 0-6.

salvador
fuente

Respuestas:

247

intenta usar en begin.startOf('isoWeek');lugar debegin.startOf('week');

tetri
fuente
10
startOf('week')depende de la ubicación actual donde el domingo obviamente marca el comienzo de la semana en su caso. startOf('iweek')obtendrá el inicio ISO de la semana, que es el lunes. Pero tienes razón, no encontré ninguna documentación en el sitio oficial ...
devnull69
15
Se está utilizando la versión actual de moment.js isoweek.
Savinger
2
Editado de acuerdo con el comentario de @ savinger y los documentos actuales :)
Matchu
20
isoWeek, con W mayúscula, en la última versión
Michiel
8
Documentado aquí: Start of Time
Vladimir Kornea
13

Llame startOfantes isoWeekday.

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

Demo de trabajo

letiagoalves
fuente
1
Esto no funciona correctamente. Para la fecha de hoy, 2016-09-05, devuelve 2016-08-29 como fecha de inicio de la semana, lo cual no es cierto, porque hoy es lunes (semana iso). ya se acepta la respuesta adecuada.
undefinedman
9

De esta forma puede configurar el día inicial de la semana.

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

Asegúrate de usarlo con en moment().weekday(1);lugar de moment.isoWeekday (1)

Roberto Aguilar
fuente
2

Pensé que agregaría esto para futuros píos. Siempre se asegurará de que sea lunes si es necesario, también se puede utilizar para asegurar siempre el domingo. Para mí, siempre necesito el lunes, pero lo local depende de la máquina que se utilice, 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');
Davethecoder
fuente
1
posible atajo moment (). isoWeekday (1) .startOf ('isoweek'). format ('dddd DD MM YYYY')
davethecoder
2

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);
Hinrich
fuente
-1

Para aquellos que quieran isoWeekser el predeterminado, pueden 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 puedes usarlo someDate.startOf('week')sin preocuparte de que llegue el domingo o de tener que pensar si usarlo isoweeko isoWeeketc.

Además, puede almacenar esto en una variable como const period = 'week'y usarlo de manera segura en operaciones subtract()u add(), por ejemplo moment().subtract(1, period).startOf(period);. Esto no funcionará con el período isoWeek.

Adam Reis
fuente