Moment: Problemas locais nos dias da semana

Criado em 15 jul. 2017  ·  7Comentários  ·  Fonte: moment/moment

Descrição do problema e etapas para reproduzir:
Como no documento oficial,
moment.locale('zh_CN');
moment.weekdays(true); // lists weekdays Monday-Sunday in Chinese
Se verdadeiro, os dias da semana serão retornados na ordem específica do local. Mas, neste caso, o local do momento é alterado globalmente.

Então, se eu só quiser mudar a localidade localmente, eu uso
moment.localeData('zh_CN').weekdaysShort()
Ele sempre lista os dias da semana de domingo a sábado em chinês (NÃO na ordem específica do local). E eu não poderia fornecer o valor 'verdadeiro' para a função neste caso (causando ERROR).

Por favor, inclua os valores de todas as variáveis ​​usadas.

Meio Ambiente:

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

Tanto o navegador quanto o sistema operacional são importantes para nós, principalmente se você tiver um ambiente incomum, como um aplicativo IOT.

Outras informações que podem ser úteis:

  • A configuração de fuso horário da máquina em que o código está sendo executado
  • A hora e data em que o código foi executado
  • Outras bibliotecas em uso (TypeScript, Immutable.js, etc)

Se você estiver relatando um problema, execute o seguinte código no ambiente que está usando e inclua a saída:

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

Certifique-se de que seu problema seja isolado no momento.

Bug Language

Comentários muito úteis

Uma informação interessante é que a função weekday reconhece a localidade, então

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

retorna ['Sunday', 'Monday', ...] para en-us .
mas ['Monday', 'Tuesday', ...] para en-gb .

Todos 7 comentários

Hmm, não consigo reproduzir isso. Acho que você está dizendo isso:

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() //=> ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"]

Eu não ficaria surpreso se funcionasse como você disse (o localeData está obtendo diretamente os dados, então não seria surpreendente se não fizesse a reordenação, e possivelmente não temos uma API para obter os dias da semana ordenados para um local não definido globalmente). Mas ... essas matrizes não são acima da mesma? Eu não leio nem falo chinês, então não sei se eles estão na ordem localmente correta, mas a menos que eu esteja faltando alguma coisa (sempre possível ao olhar para caracteres desconhecidos), eles estão ou não, certo ?

É o mesmo com "en-gb" e "en-us".

Se minha localidade for 'en-us' e eu quiser obter os dias da semana 'en-gb', incluindo classificação, serei forçado a alterar a localidade globalmente ou fazer algum trabalho de matriz para obter os dias da semana classificados.

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

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

Mas

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

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

E não há

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

Hmm, sim, estou chamando isso de bug.

Uma informação interessante é que a função weekday reconhece a localidade, então

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

retorna ['Sunday', 'Monday', ...] para en-us .
mas ['Monday', 'Tuesday', ...] para en-gb .

Eu fiz algumas pesquisas.

Há uma função diferente que implementa <Moment>.weekdays vs <Locale>.weekdays (e da mesma forma weekdaysMin, weekdaysShort, months, monthsShort)

Conforme mencionado nos documentos, o primeiro foi desenvolvido para listar os meses ou dias da semana da localidade atual.
https://momentjs.com/docs/#/i18n/listing -months-weekdays /

O segundo é projetado para obter informações do próprio local.
https://momentjs.com/docs/#/i18n/locale -data /

Poderíamos classificar os dias da semana por localidade com o mesmo parâmetro.

  • Portanto, moment.localeData('en-gb').weekdays(true) retornaria ['Monday', 'Tuesday', ...] ).
  • Acho que isso é razoável porque esta chamada lança um erro nas versões atuais do Moment.

Eu coloquei um PR - deixe-me saber o que todos vocês acham.

Existe um plano para corrigir moment().locale('en-us').weekday(0) para voltar na segunda-feira e não no domingo?

@inbalg Não, está correto

Esta página foi útil?
0 / 5 - 0 avaliações