Moment: Se devuelve un número de semana incorrecto de la función "week ()"

Creado en 19 jul. 2018  ·  5Comentarios  ·  Fuente: moment/moment

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

ejemplo en vivo de jsbin

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"

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.

Todos 5 comentarios

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 .

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

M-Zuber picture M-Zuber  ·  3Comentarios

Shoroh picture Shoroh  ·  3Comentarios

ninigix picture ninigix  ·  3Comentarios

benhathaway picture benhathaway  ·  3Comentarios

tanepiper picture tanepiper  ·  3Comentarios