Moment: `weekOfYear` incorrecta para ciertos combos dow / doy

Creado en 21 dic. 2014  ·  13Comentarios  ·  Fuente: moment/moment

Parece que el algoritmo de cálculo de la semana no es lo suficientemente genérico, ya que parece manejar incorrectamente ciertas combinaciones dow / doy:

// see http://en.wikipedia.org/wiki/Seven-day_week#cite_ref-15
moment.locale(moment.locale(), { week: { dow: 6, doy: 1 } });
moment("2012-12-28", "YYYY-MM-DD").week(); // 51 -- should be 52?
moment("2012-12-29", "YYYY-MM-DD").week(); // 52 -- should be 1
moment("2013-01-01", "YYYY-MM-DD").week(); // 52 -- should be 1
moment("2013-01-08", "YYYY-MM-DD").week(); // 53 -- should be 2
moment("2013-01-11", "YYYY-MM-DD").week(); // 53 -- should be 2
moment("2013-01-12", "YYYY-MM-DD").week(); // 1 -- should be 3
moment().weeksInYear(2012); // 52

Supongo que algo está un poco mal en la función weekOfYear , a menos que esté haciendo algo mal.

Bug

Comentario más útil

No puedo explicar el razonamiento de la forma, cómo se define doy , pero puede establecerlo en 7 + dow - janX donde janX es el x-ésimo de enero que debe pertenecer a la semana No. 1.

Entonces, si el 1 de enero debe pertenecer a la semana No. 1 y el sábado es el primer día de la semana, entonces doy = 7 + 6 - 1 = 12 . Para ISO sería doy = 7 + 1 - 4 = 4 para EE. UU. Sería doy = 7 + 0 - 1 = 6 .

Todos 13 comentarios

¿Alguna idea? Esto afecta a muchos lugares donde el primer día de la semana no es domingo ni lunes. Si se verifica el error, ¿debo enviar una solicitud de extracción para un mejor cálculo de weekOfYear , o ya hay planes para corregir el algoritmo actual?

Tengo que admitir que la configuración doy me confunde bastante. { dow: 6, doy: 12 } significa que la semana comienza el sábado y que la semana 1 es la semana con el 1 de enero. Si lo entiendo correctamente, {dow:6, doy: 1} significaría que la primera semana contiene el 26 de diciembre.

He agregado una prueba con { dow: 6, doy: 12 } a la solicitud de extracción.

¿Te refieres a { dow: 6, doy: 1 } ? Creo que un doy mayor que 7 no tiene ningún significado real. ¿Fue un error tipográfico?

No, me refiero a {dow: 6, doy: 12} . Tenga en cuenta que doy _no_ es el día de enero que corresponde a la primera semana. {dow: 6, doy: 12} es el estándar en los países árabes: la semana comienza el sábado y la primera semana es la que contiene el 1 de enero.

En realidad, el error no estaba en el cálculo de la semana a partir de la fecha, sino en la otra dirección.

Vaya, si ese es el caso, entonces he estado malinterpretando doy todo este tiempo ...

De hecho, según los documentos localeData.firstDayOfYear() puede devolver cualquier número entero entre 0 y 15 inclusive, pero eso me parece muy extraño.

Solo para ayudarme a entender, ¿puede explicar por qué es 12 y no 1? ¿Y qué significaría un doy de 1 o 4 en este caso? ¿Cómo, exactamente, funcionan las matemáticas aquí? Parece que comprende bien esto ...

Encontré una buena explicación , que hace que sea más obvio qué es doy , aunque todavía parece que no puedo imaginar cómo puede ser mayor que 6 ..

@icambron , ¿puedes

@usmonster Ha pasado mucho tiempo desde que miré esto, pero fuera de mi cabeza ... sí, tampoco lo entiendo. Lo siento, no puedo ser más útil. Cada vez que escribía la explicación vinculada, acababa de escribir un montón de implementación de Moment para el manejo de semanas, así que probablemente lo entendí entonces, pero esa explicación no parece coincidir con doy valores> 6, así que ... .

No puedo explicar el razonamiento de la forma, cómo se define doy , pero puede establecerlo en 7 + dow - janX donde janX es el x-ésimo de enero que debe pertenecer a la semana No. 1.

Entonces, si el 1 de enero debe pertenecer a la semana No. 1 y el sábado es el primer día de la semana, entonces doy = 7 + 6 - 1 = 12 . Para ISO sería doy = 7 + 1 - 4 = 4 para EE. UU. Sería doy = 7 + 0 - 1 = 6 .

Ah, si se _implementa_ de esta manera, creo que es un problema con la implementación. Ninguna otra definición que haya visto (es decir, ISO, Unicode TR35) define el cálculo de la semana del año como este. Los comentarios en la API ni siquiera insinúan que esto es lo que está sucediendo, aunque ahora noto que se han escrito pruebas que asumen esta misma lógica, por ejemplo, veo líneas como esta:

dow : 1, // Monday is the first day of the week.
doy : 7  // The week that contains Jan 1st is the first week of the year.

Y en otro archivo:

dow : 6, // Saturday is the first day of the week.
doy : 12  // The week that contains Jan 1st is the first week of the year.

Entonces, su evaluación de la implementación parece precisa. Aún así, se siente asqueroso, como si las pruebas se escribieran para coincidir con una implementación defectuosa.

Esto es especialmente frustrante ya que una cosa más limpia habría sido simplemente arreglar la implementación para que haga lo que es intuitivo (tome el " janX " que debe estar en la primera semana), pero arreglarlo ahora no lo haría ' t ser compatible con versiones anteriores. Ugh.

Una alternativa sería desaprobar doy e introducir una nueva opción a la configuración de la semana, por ejemplo, minDays o dom , para especificar el número mínimo de "días de enero" (1- 7) que debería ser en la primera semana del año. Esto anularía doy si se especificara accidentalmente.

¿Alguna idea?

Bueno, por lo que puedo decir, teníamos el código configurado para iso semanas, luego abusamos del hecho y nos aseguramos de que los números lo hicieran funcionar.

Si cambiamos la semántica para que sea algo más significativa para los usuarios, sería mejor. Pero debería ser compatible con versiones anteriores (por lo que los nuevos métodos exponen nuevos números).

A partir de su ejemplo, puede hacer que funcione si agrega 7 varias veces para doy, porque es relativo a dow.

Cerrando esto a favor del # 2336

Hola @ichernev. :) Volviendo a esto un año después, todavía estoy a favor de implementar semánticas más significativas, aunque estoy casi seguro de que no es posible hacer algo compatible con versiones anteriores sin cambiar también la sintaxis.

puede hacer que funcione si agrega 7 varias veces al doy, porque es relativo al dow.

No estoy convencido de que este sea siempre el caso. Por ejemplo, { dow: 0, doy: 6 } no significaría lo mismo antes y después del cambio semántico propuesto. (Es por eso que propuse desaprobar doy a favor de otro nombre).

¿Dónde debo buscar más comentarios sobre esto? Este problema en particular está cerrado, aunque puedo mover la conversación a moment / momentjs.com # 279 o abrir un nuevo problema si es más apropiado.

También me gustaría mejorar esto, ya que pasé un día más tratando de averiguar cómo funciona doy y tuve que descargar la fuente del momento para hacerlo. Sería genial introducir una nueva variable de configuración más relevante semánticamente, como sugiere @usmonster .

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