Descripción del problema y pasos para reproducirlo:
Al crear una fecha, por ejemplo [2018, 11, 29]
, y realizar la función week
, el resultado es 52
, pero para [2018, 11, 30]
y para 31
también devuelve 1
. El resultado esperado es 52
.
Ejemplo
const a = moment([2018, 11, 29]);
console.log('a', a.year(), a.week());
//a 2018 52
const b = moment([2018, 11, 30]);
console.log('b', b.year(), b.week());
//b 2018 1
Medio ambiente:
Safari 11.1.2 on OSX
Otra información que puede ser útil:
"Thu Jul 19 2018 16:52:11 GMT+0200 (CEST)"
"7/19/2018, 4:52:11 PM"
-120
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1.2 Safari/605.1.15"
"2.14.1"
Nos encontramos con el mismo problema.
console.log(moment("2018-w15", "YYYY-[w]WW").add(38, "weeks").format("YYYY-[w]WW"))
muestra 2018-w01
@ numen31337 Probablemente quieras usar weekYear () en lugar de year()
@Blapi WW
es la Semana ISO, por lo que lo más probable es que necesite usar GGGG
lugar de YYYY
al formatear ( GGGG
es la "Semana Año" ISO )
Aclararé esto un poco, aquí hay un código con fechas y salida relacionada:
const a = moment([2018, 11, 29]);
console.log(
`a year: ${a.year()}`, //a year: 2018
`a month: ${a.month()}`, //a month: 11
`a date: ${a.date()}`, //a date: 29
`a week: ${a.week()}`, //a week: 52
`a weekYear: ${a.weekYear()}`, //a weekYear: 2018
);
const b = moment([2018, 11, 30]);
console.log(
`b year: ${b.year()}`, //b year: 2018
`b month: ${b.month()}`, //b month: 11
`b date: ${b.date()}`, //b date: 30
`b week: ${b.week()}`, //b week: 1 <=== Why 1?
`b weekYear: ${b.weekYear()}`, //b weekYear: 2019 <=== Why 2019?
);
El problema para mí es que week
por 2018, 11, 30
devuelve 1
lugar de 52
. ¿Quizás entendí mal algunos conceptos de esta biblioteca? A largo plazo, mi tarea fue calcular el número de semanas calendario entre dos fechas y lo hice con la siguiente solución:
const fromDateStartWeek = fromDate.startOf('week');
const toDateStartWeek = toDate.startOf('week');
return toDateStartWeek.diff(fromDateStartWeek, 'weeks');
Pero todavía estoy divagando acerca de esta función week
. ¿Es esto un error o me pierdo algo? Vengo del desarrollo nativo y soy bastante nuevo en javascript. Gracias.
Creo que probablemente tenga una expectativa de cómo funciona la numeración de semanas que difiere de la práctica establecida.
Por ejemplo, cree que el 1 de enero es siempre en la semana 1 y el 31 de diciembre es siempre en la semana 52/53 y, para ser justos, algunos calendarios de pared muestran una numeración de semanas como esa.
Cuando se trata de estandarizar los números de las semanas, la preferencia es asegurarse de que una semana siempre contenga 7 días. Para el estándar ISO: las semanas van de lunes a domingo y la semana 1 contiene el primer jueves del año. Lo que significa que de lunes a miércoles de la semana 1 _ puede caer en el año anterior. (esto sucederá en 2019/2020: del 29 al 31 de diciembre de 2019 se consideran parte de la Semana 1 de 2020)
No está utilizando los métodos ISO ( isoWeek()
/ isoWeekYear()
), por lo que está confiando en la definición de su configuración regional de una semana, que se ejecuta de domingo a sábado.
El 30 de diciembre de 2018 es domingo y el primer día de la semana en su localidad. Solo 2 días de esa semana caen en 2018, el resto es en 2019. Las reglas de su ubicación se utilizan para decidir si esa semana (los 7 días) se clasifica como 2018 semana 53 o 2019 semana 1. En su caso , han dicho 2019 semana 1.
Gracias por la aclaración. Eso es realmente sorprendente para mí. Realmente extraño la API como de Apple Calendar dateComponents (_: from: to :) donde puedes pedir una diferencia en componentes específicos, en mi caso Calendar.current.dateComponents([.weekOfYear], from: sinceDay, to: targetDay)
y recibir la diferencia en las semanas reales del año, no solo days / 7
.
Comentario más útil
Creo que probablemente tenga una expectativa de cómo funciona la numeración de semanas que difiere de la práctica establecida.
Por ejemplo, cree que el 1 de enero es siempre en la semana 1 y el 31 de diciembre es siempre en la semana 52/53 y, para ser justos, algunos calendarios de pared muestran una numeración de semanas como esa.
Cuando se trata de estandarizar los números de las semanas, la preferencia es asegurarse de que una semana siempre contenga 7 días. Para el estándar ISO: las semanas van de lunes a domingo y la semana 1 contiene el primer jueves del año. Lo que significa que de lunes a miércoles de la semana 1 _ puede caer en el año anterior. (esto sucederá en 2019/2020: del 29 al 31 de diciembre de 2019 se consideran parte de la Semana 1 de 2020)
No está utilizando los métodos ISO (
isoWeek()
/isoWeekYear()
), por lo que está confiando en la definición de su configuración regional de una semana, que se ejecuta de domingo a sábado.El 30 de diciembre de 2018 es domingo y el primer día de la semana en su localidad. Solo 2 días de esa semana caen en 2018, el resto es en 2019. Las reglas de su ubicación se utilizan para decidir si esa semana (los 7 días) se clasifica como 2018 semana 53 o 2019 semana 1. En su caso , han dicho 2019 semana 1.