やり方
フォームで元号の年を読む
人が入力するとおりの年を、和暦でも西暦でも受け付け、西暦の年として保存します。
生まれた年を尋ねる入力フォームがあるとします。1985と入力する人もいれば、昭和60年、「Showa 60」、あるいは元号をリストから選んで 60 と入力する人もいます。この手順では、そのどれを受け取っても、西暦の年という一つの数にまとめ、表示し直すための元号の年も添えます。
入力されたものをそのまま受け取る
まず元号の年として読み、読めなければ普通の数として読みます。どの段階も、当てはまらなければnullを返すので、この順番がそのまま処理のすべてです。
import { eraYearOf, formatEraYearJapanese, parseEraYear } from "@johnmorrisdotca/hikidashi/wareki";
import { parseJapaneseNumber } from "@johnmorrisdotca/hikidashi/numerals";
function readYear(typed: string): { western: number; shown: string } | null {
const era = parseEraYear(typed);
if (era !== null) return { western: era.westernYear, shown: formatEraYearJapanese(era) };
const western = parseJapaneseNumber(typed);
if (western === null || western < 1868 || western > 2100) return null;
const asEra = eraYearOf(western);
return { western, shown: asEra === null ? String(western) : formatEraYearJapanese(asEra) };
}
console.log(readYear("昭和60年")); // { western: 1985, shown: "昭和60年" }
console.log(readYear("Showa 60")); // 同じ
console.log(readYear("1985")); // 全角数字からでも同じ
console.log(readYear("昭和65年")); // null:そのような年はなかった{ western: 1985, shown: '昭和60年' }
{ western: 1985, shown: '昭和60年' }
{ western: 1985, shown: '昭和60年' }
null普通の数として読むときの範囲(1868〜2100)は、このフォームの決まりで、パッケージの決まりではありません。Hikidashiはどんな整数でも読み取ります。
元号をリストから選ぶ場合
元号を<select>で、年を入力欄で受け取るときは、JAPANESE_ERASから元号を探してwesternYearForに渡します。その元号に存在しなかった年にはnullが返るので、それを入力欄の横に表示するエラーにします。
import { JAPANESE_ERAS, westernYearFor } from "@johnmorrisdotca/hikidashi/wareki";
const options = JAPANESE_ERAS.map((era) => ({ value: era.romaji, label: `${era.kanji}(${era.romaji})` }));
console.log(options.map((option) => option.label).join("、"));
const picked = JAPANESE_ERAS.find((era) => era.romaji === "Heisei")!;
console.log(westernYearFor(picked, 31), westernYearFor(picked, 32)); // 2019 null明治(Meiji)、大正(Taisho)、昭和(Showa)、平成(Heisei)、令和(Reiwa)
2019 null年ではなく日付の場合
改元のあった年は二つの元号にまたがるので、年だけでは、1989年のある日がどちらの元号かは分かりません。フォームに日付まであるときはeraOnDateを使います。
import { eraOnDate, formatEraYearJapanese } from "@johnmorrisdotca/hikidashi/wareki";
for (const day of ["1989-01-07", "1989-01-08", "2019-04-30", "2019-05-01"]) {
const found = eraOnDate(day);
console.log(day, found === null ? "日付ではない" : formatEraYearJapanese(found, { gannen: true }));
}1989-01-07 昭和64年
1989-01-08 平成元年
2019-04-30 平成31年
2019-05-01 令和元年Dateも渡せます。その場合は、Dateがそれ自身のタイムゾーン(利用者が選んだタイムゾーン)で示す日付として読みます。1868年10月23日より前の日付はnullです。このパッケージの元号は明治から始まります。
表示し直す
元号の年を、日本の書類と同じように最初の年を元年として書き、西暦も添えます。
import { eraYearsOf, formatEraYearJapanese, formatEraYearRomaji } from "@johnmorrisdotca/hikidashi/wareki";
const both = eraYearsOf(2019);
console.log(both.map((one) => `${formatEraYearJapanese(one, { gannen: true })}(${formatEraYearRomaji(one)})`).join(" / "), "= 2019");令和元年(Reiwa 1) / 平成31年(Heisei 31) = 2019関連項目:答えが二つある年についてはeraYearsOf、一つの年が二つの元号にまたがる理由については元号の年の仕組みを見てください。
この日本語は、まだ日本語を母語とする方の確認を受けていません。訂正を歓迎します。