LoginSignup
3
0

More than 3 years have passed since last update.

西暦と和暦と何年前なのかのリスト生成するjs

Posted at

西暦とそれに対応する和暦、また何年前なのかのリストを生成する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日を指定すれば良いことになります。

和暦、まだまだ、いろんなところで使われていますね。。。

参考文献

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0