Date#toLocaleDateString
を使うと日付のローカライズができる
ほとんどのロケールでは問題ないが、一部のロケールで気になることがある
例えば、タイ語の場合
何も考えず使用すると以下のような結果になる
console.log(new Date().toLocaleDateString('th-TH', {year: 'numeric', month: 'long'})); > "มกราคม 2563"
月の方は問題なさそうだが、年の方が2020年
を指定したはずが2563
という数字になっている
これは仏暦
というタイの公用暦らしく、西暦+543年で表現される
日本の和暦のような公用歴なら問題ないんじゃ?と思ったが、
多言語化対応しているサービス、例えば Airbnb などをみると西暦を使用しているので西暦にする方法を調べてみる
またまた@kawasimaさんより情報をいただいて、
localeにオプションを追記できることがわかった
(Intl.DateTimeFormat - JavaScript | MDNより抜粋)
locales
BCP47 言語タグの文字列、または、そのような文字列の配列です。ブラウザーの既定のロケールを使用するには、この引数を省略するか、undefined
を渡すかしてください。 Unicode 拡張に対応しています (例えば "en-US-u-ca-buddhist
" など)。 locales 引数の一般的な形式と解釈は、 Intl のページをご覧ください。次の Unicode 拡張キーが利用できます。
nu
番号方式。使用できる値は次のとおりです。"arab", "arabext", "bali", "beng", "deva", "fullwide", "gujr", "guru", "hanidec", "khmr", "knda", "laoo", "latn", "limb", "mlym", "mong", "mymr", "orya", "tamldec", "telu", "thai", "tibt"
ca
カレンダー。使用できる値は次のとおりです。"buddhist", "chinese", "coptic", "ethiopia", "ethiopic", "gregory", "hebrew", "indian", "islamic", "iso8601", "japanese", "persian", "roc"
nu
は数字のローカライズを指定できて、例えばfullwide
だと全角数字になる
※他にとりうる値とそれぞれの意味は下にあった
https://github.com/unicode-org/cldr/blob/master/common/bcp47/number.xml
ca
は日時のフォーマットを指定できて、今回やりたい「年」をグレゴリオ暦にする場合はiso8601
かgregory
にするとよさそう
ということで、次のようにすることで無事西暦にすることができた
console.log(new Date().toLocaleDateString('th-TH-u-ca-iso8601', {year: 'numeric', month: 'long'})); > "มกราคม 2020"
javascriptで日付に関する独自実装は不要で、ローカライズだけならmoment.jsのようなライブラリも不要ということがわかった