UGA Boxxx

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

moment.jsで「年月」のローカライズ

普段システム開発をしているせいか、toC向けのWebサービスの年月の表現にYYYY-MMとかYYYY/MMというフォーマットを使ってしまっていたが、その表現はエンドユーザによっては違和感があるということを指摘された

日本人ならまだ2020/01という表現に馴染みがあるかもしれないが、確かに2020年 1月という表現の方がよりよい気がするし、英語圏ではJanuary 2020 の方がよさそう

要件としてはいらないので、下のように年月の表現だけローカライズさせる方法を調べた
2020年 1月 January 2020

いま moment.jsを使っているのでその中から探してみた

momentjs.com

近しい表現 moment().format('LL')はあったのだが、以下のように年月のみ指定された場合は必ず1日で初期が行われてしまい、年月だけでなく日が入ってしまう

2020年1月1日 January 1, 2020

仕方ないので自作する方向で考える

似たようなことをやりたい人がいた
このひとは月日だけにしたいみたい

stackoverflow.com

下のようにmomet.jsのLong Date Formats のカスタマイズを使うとカスタマイズできるみたいだけど

moment.updateLocale('en', {
    longDateFormat : {
        LT: "h:mm A",
        LTS: "h:mm:ss A",
        L: "MM/DD/YYYY",
        l: "M/D/YYYY",
        LL: "MMMM Do YYYY",
        ll: "MMM D YYYY",
        LLL: "MMMM Do YYYY LT",
        lll: "MMM D YYYY LT",
        LLLL: "dddd, MMMM Do YYYY LT",
        llll: "ddd, MMM D YYYY LT"
    }
});

残念ながら事前にロケール毎に使うフォーマットを定義しておけるわけではなく、使うときにカスタマイズして使うみたいなので、ちょっとやりたいことと違う

なので、単純に下のようなlocalizedFormat()関数を定義して使うことにする

moment().format(localizedFormat(locale));

localizedFormat()関数でやりたいこと

function localizedFormat(locale) {
  if (英語圏のようなフォーマットにしたい言語) {
    return "MMMM YYYY";
  }
  // それ以外は日本語のようにフォーマット
  return "YYYY MMMM";
}

これでOKかと思ったら

YYYYでフォーマットした場合、2020年がつかず2020で表現されてしまう

韓国語の場合はを付けたいので一律ではだめで、これはどうすればよいのか

いい解決方法が思い付かず、しかたないのでサービスで使う分だけif文書いて対応する

いい方法は引き続き調査する