UGA Boxxx

つぶやきの延長のつもりで、知ったこと思ったこと書いてます

【I18N】タイ語の年表記を仏暦から西暦にする

Date#toLocaleDateStringを使うと日付のローカライズができる

developer.mozilla.org

ほとんどのロケールでは問題ないが、一部のロケールで気になることがある

例えば、タイ語の場合

何も考えず使用すると以下のような結果になる

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は日時のフォーマットを指定できて、今回やりたい「年」をグレゴリオ暦にする場合はiso8601gregoryにするとよさそう

ということで、次のようにすることで無事西暦にすることができた

console.log(new Date().toLocaleDateString('th-TH-u-ca-iso8601', {year: 'numeric', month: 'long'}));
> "มกราคม 2020"

javascriptで日付に関する独自実装は不要で、ローカライズだけならmoment.jsのようなライブラリも不要ということがわかった