西暦とそれに対応する和暦、また何年前なのかのリストを生成するJavaScriptの実装
仕事で必要だったので書きました。またどこかで使うかも知れないのでメモです。
実装
const FINAL_YEAR = 1800
const createOneYear = (thisYear) => {
return (index) => {
const date = new Date(thisYear - index, 11, 31)
const japaneseYear = (new Intl
.DateTimeFormat('ja-JP-u-ca-japanese', { era: 'long', year:'numeric' })
.format(date))
const yearsAgo = index === 0 ? '今年' : `${index}年前`
return { ad: `西暦${date.getFullYear()}年`,
japaneseYear: `${japaneseYear}年`,
yearsAgo: `${yearsAgo}` }
}
}
const createYears = () => {
const thisYear = (new Date()).getFullYear()
const years = [...Array(thisYear - FINAL_YEAR).keys()].map(createOneYear(thisYear))
return years
}
console.log(createYears())
コンソールには、
[
{
"ad": "西暦2021年",
"japaneseYear": "令和3年年",
"yearsAgo": "今年"
},
{
"ad": "西暦2020年",
"japaneseYear": "令和2年年",
"yearsAgo": "1年前"
},
{
"ad": "西暦2019年",
"japaneseYear": "令和元年年",
"yearsAgo": "2年前"
},
{
"ad": "西暦2018年",
"japaneseYear": "平成30年年",
"yearsAgo": "3年前"
},
{
"ad": "西暦2017年",
"japaneseYear": "平成29年年",
"yearsAgo": "4年前"
},
...
と表示されているはず。
意外とミソでハマりどころなのが以下の箇所で、11, 31
と12月31日を指定しています。(JavaScriptのDate型なので、0が1月、11が12月という仕様です。)
const date = new Date(thisYear - index, 11, 31)
ここの指定を1月1日としてしまうと、それぞれの年号の元年が表示されず、例えば、令和元年→平成31年と表示されてしまいます。なぜなら、2019年1月1日は、まだ令和に入っていないからですね。逆に、元年の表示をさせたくない場合は、(平成31年の表記にしたい場合は)1月1日を指定すれば良いことになります。
和暦、まだまだ、いろんなところで使われていますね。。。