Moment: Problemas de configuración regional de días de la semana

Creado en 15 jul. 2017  ·  7Comentarios  ·  Fuente: moment/moment

Descripción del problema y pasos para reproducirlo:
Como en el documento oficial,
moment.locale('zh_CN');
moment.weekdays(true); // lists weekdays Monday-Sunday in Chinese
Si es verdadero, los días de la semana se devolverán en el orden específico de la configuración regional. Pero en el caso, la ubicación del momento cambia globalmente.

Entonces, si solo quiero cambiar la configuración regional localmente, uso
moment.localeData('zh_CN').weekdaysShort()
Siempre enumera los días de la semana de domingo a sábado en chino (NO en el orden específico de la configuración regional). Y no pude proporcionar un valor 'verdadero' a la función en este caso (Causando ERROR).

Incluya los valores de todas las variables utilizadas.

Ambiente:

Ejemplos: Chrome 49 en OSX, Internet Explorer 10 en Windows 7, Node.JS 4.4.4 en Ubuntu 16.0.4

Tanto el navegador como el sistema operativo son importantes para nosotros, especialmente si tiene un entorno inusual como una aplicación IOT.

Otra información que puede ser útil:

  • La configuración de la zona horaria de la máquina en la que se está ejecutando el código
  • La hora y la fecha en que se ejecutó el código.
  • Otras bibliotecas en uso (TypeScript, Immutable.js, etc.)

Si informa un problema, ejecute el siguiente código en el entorno que está utilizando e incluya el resultado:

console.log( (new Date()).toString())
console.log((new Date()).toLocaleString())
console.log( (new Date()).getTimezoneOffset())
console.log( navigator.userAgent)
console.log(moment.version)

Asegúrese de que su problema esté aislado al momento.

Bug Language

Comentario más útil

Una información interesante es que la función weekday es consciente de la configuración regional, por lo que

const weekdays = [0, 1, 2, 3, 4, 5, 6].map(dow => moment().locale('en-gb').weekday(dow).format('dddd'))

devuelve ['Sunday', 'Monday', ...] por en-us .
pero ['Monday', 'Tuesday', ...] por en-gb .

Todos 7 comentarios

Hmm, no puedo reproducir esto. Creo que estás diciendo esto:

moment.locale('en') //=> "en" (I don't have the locale set to zh)

// you're saying this is NOT in the right order
moment.localeData('zh_CN').weekdays(); //=> ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"]

//but if you change the global locale, then it is
moment.locale('zh_CN'); //=> "zh-cn"
moment.weekdays() //=> ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"]

No me sorprendería que funcionara como dijiste (el localeData está obteniendo directamente los datos, por lo que no sería sorprendente si no hiciera el reordenamiento, y posiblemente simplemente no tenemos una API para obtener los días de la semana ordenados para una configuración regional no establecida globalmente). Pero ... ¿esas matrices de arriba no son iguales? No leo ni hablo chino, así que no sé si están en el orden localmente correcto, pero a menos que me falte algo (siempre es posible cuando veo caracteres desconocidos), ambos lo son o ambos no, ¿verdad? ?

Lo mismo ocurre con "en-gb" y "en-us".

Si mi configuración regional es 'en-us' y quiero obtener los días de la semana 'en-gb', incluida la clasificación, me veré obligado a cambiar la configuración regional globalmente o hacer un trabajo de matriz para obtener los días de la semana ordenados.

moment.locale('en-us')
moment.weekdays(true) // ["Sunday", "Monday", ...

moment.locale('en-gb')
moment.weekdays(true) // ["Monday", "Tuesday", ...

Pero

moment.localeData('en-us').weekdays() // ["Sunday", "Monday", ...

moment.localeData('en-gb').weekdays() // ["Sunday", "Monday", ...

Y no hay

moment.localeData('en-gb').weekdays(true)

Hmm, sí, estoy llamando a esto un error.

Una información interesante es que la función weekday es consciente de la configuración regional, por lo que

const weekdays = [0, 1, 2, 3, 4, 5, 6].map(dow => moment().locale('en-gb').weekday(dow).format('dddd'))

devuelve ['Sunday', 'Monday', ...] por en-us .
pero ['Monday', 'Tuesday', ...] por en-gb .

Hice algunas excavaciones.

Hay una función diferente que implementa <Moment>.weekdays vs <Locale>.weekdays (y de manera similar weekdaysMin, weekdaysShort, months, monthsShort)

Como se menciona en los documentos, el primero está diseñado para enumerar los meses o días de la semana de la configuración regional actual.
https://momentjs.com/docs/#/i18n/listing -months-weekdays /

El segundo está diseñado para obtener información de la propia configuración regional.
https://momentjs.com/docs/#/i18n/locale -data /

Podríamos ordenar por ubicación los días de la semana con el mismo parámetro.

  • Entonces, moment.localeData('en-gb').weekdays(true) devolvería ['Monday', 'Tuesday', ...] ).
  • Creo que esto es razonable porque esta llamada arroja un error en las versiones actuales de Moment.

Puse un PR, háganme saber lo que piensan.

¿Hay algún plan para arreglar moment().locale('en-us').weekday(0) para que regrese el lunes y no el domingo?

@inbalg No, eso es correcto

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