Moment: 平日ロケールの問題

作成日 2017年07月15日  ·  7コメント  ·  ソース: moment/moment

問題の説明と再現手順:
公式文書のように、
moment.locale('zh_CN');
moment.weekdays(true); // lists weekdays Monday-Sunday in Chinese
trueの場合、平日はロケール固有の順序で返されます。 ただし、この場合、瞬間ロケールはグローバルに変更されます。

したがって、ロケールをローカルで変更したいだけの場合は、
moment.localeData('zh_CN').weekdaysShort()
日曜日から土曜日までの平日を中国語で常にリストします(ロケール固有の順序ではありません)。 そして、この場合、関数に「true」値を提供できませんでした(エラーの原因)。

使用するすべての変数の値を含めてください。

環境:

例:OSX上のChrome 49、Windows7上のInternetExplorer 10、Ubuntu16.0.4上のNode.JS4.4.4

特にIOTアプリケーションのような異常な環境がある場合は、ブラウザとOSの両方が私たちにとって重要です。

役立つ可能性のあるその他の情報:

  • コードが実行されているマシンのタイムゾーン設定
  • コードが実行された日時
  • 使用中の他のライブラリ(TypeScript、Immutable.jsなど)

問題を報告している場合は、使用している環境で次のコードを実行し、出力を含めてください。

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

問題が瞬間的に分離されていることを確認してください。

Bug Language

最も参考になるコメント

興味深い情報は、 weekday関数がロケールを認識していることです。

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

リターン['Sunday', 'Monday', ...]についてen-us
ただし、 ['Monday', 'Tuesday', ...]場合はen-gbです。

全てのコメント7件

うーん、これは再現できません。 私はあなたがこれを言っていると思います:

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

あなたが言ったように機能したとしても驚かないでしょう(localeDataはデータを直接取得しているので、並べ替えを行わなくても驚くことではありません。おそらく、APIがないだけです。グローバルに設定されていないロケールの順序付けられた平日を取得します)。 しかし...それらの配列は同じではありませんか? 私は中国語を読んだり話したりしないので、それらがローカルで正しい順序であるかどうかはわかりませんが、何かが足りない場合を除いて(見慣れない文字を見ると常に可能です)、両方ともそうであるか、そうではありません。 ?

「en-gb」や「en-us」も同じです。

ロケールが「en-us」で、並べ替えを含めて「en-gb」の平日を取得したい場合は、ロケールをグローバルに変更するか、配列作業を行って並べ替えられた平日を取得する必要があります。

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

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

だが

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

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

そして、ありません

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

うーん、ええ、私はこれをバグと呼んでいます。

興味深い情報は、 weekday関数がロケールを認識していることです。

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

リターン['Sunday', 'Monday', ...]についてen-us
ただし、 ['Monday', 'Tuesday', ...]場合はen-gbです。

掘りました。

<Moment>.weekdays<Locale>.weekdaysを実装する別の関数があります(同様にweekdaysMin、weekdaysShort、months、monthsShort)

ドキュメントに記載されているように、最初のものは現在のロケールの月または平日をリストするように設計されています。
https://momentjs.com/docs/#/i18n/listing -months-weekdays /

2つ目は、ロケール自体から情報を取得するように設計されています。
https://momentjs.com/docs/#/i18n/locale -data /

同じパラメータで平日をロケールソートできます。

  • したがって、 moment.localeData('en-gb').weekdays(true)['Monday', 'Tuesday', ...]を返します)。
  • この呼び出しは現在のバージョンのMomentでエラーをスローするため、これは合理的だと思います。

私はPRを出しました-皆さんの考えを教えてください。

moment().locale('en-us').weekday(0)を修正して、日曜日ではなく月曜日に戻る予定はありますか?

@inbalgいいえ、その通りです

このページは役に立ちましたか?
0 / 5 - 0 評価