日付・時刻

【JavaScript】 Dateオブジェクトから和暦を取得する

更新日:2023/01/30

JavaScriptで日付を和暦で取得する必要があったので、メモとして残しておきます。

 

toLocaleStringで取得

DateオブジェクトのtoLocaleStringメソッドを使用すると、和暦でフォーマットされた日付を取得できます。

const now = new Data();
now.toLocaleString( "ja-JP-u-ca-japanese" ,{ era : "long" });
now.toLocaleString( "ja-JP-u-ca-japanese" ,{ era : "short" });
now.toLocaleString( "ja-JP-u-ca-japanese" ,{ era : "narrow" });

toLocaleStringについては、別の記事で解説しているのでそちらを見てください。
【JavaScript】 日時と時刻を取得して表示してみる

 

Dateオブジェクトから自分で計算して和暦を求める

toLocaleStringは自由にフォーマットできません。
なので独自にフォーマットしたいときは、自分で計算します。

        // 和暦データ    新しい年号から配列にセット
const WarekiData = [
                {year:2019,month:5,day:1 , yearText: { text :"令和" , stext:"R"}},
                {year:1989,month:1,day:8 , yearText: { text :"平成" , stext:"H"}},
                {year:1926,month:12,day:25 , yearText: { text :"昭和" , stext:"S"}},
                {year:1912,month:7,day:30 , yearText: { text :"大正" , stext:"T"}},
                {year:1868,month:10,day:23 , yearText: { text :"明治" , stext:"M"}},
                {year:1868,month:10,day:23 , yearText: { text :"明治" , stext:"M"}},
];

       // 和暦の切り替え日をミリ秒に変換し、WarekiDataにセット
WarekiData.forEach( e => {
                e.Milliseconds = new Date(e.year , e.month -1 , e.day).getTime();
});

const t =  new Date().getTime(); // 現在の日付からミリ秒を取得

       // WarekiData内で最初の、
       // チェック日のミリ秒 >= WarekiData内ミリ秒を探す
const w =  WarekiData.find( e => t >= e.Milliseconds);

console.log( w.yearText );

配列で和暦のデータを用意しておいて、スクリプト内で和暦の切り替え日の経過ミリ秒を計算してセット。
求めたい日付の経過ミリ秒と、用意した和暦データと比較しています。

上のコードを汎用的にして、日付関連データ一式を取得できるようにしてみます。

汎用和暦変換用オブジェクト

       // 和暦変換用オブジェクト
const wareki = ( warekiData => {

            const WarekiData = [
                {year:2019,month:5,date:1 , yearText: { text :"令和" , stext:"R"}},
                {year:1989,month:1,date:8 , yearText: { text :"平成" , stext:"H"}},
                {year:1926,month:12,date:25 , yearText: { text :"昭和" , stext:"S"}},
                {year:1912,month:7,date:30 , yearText: { text :"大正" , stext:"T"}},
                {year:1868,month:10,date:23 , yearText: { text :"明治" , stext:"M"}},
            ];

            WarekiData.forEach( e => {
                e.Milliseconds = new Date(e.year,e.month,e.date).getTime();
                Object.freeze(e);Object.freeze(e.yearText);
            });
            const LastWarekiData = WarekiData[WarekiData.length-1];
            const MinDate = LastWarekiData.year + "/" 
                    + LastWarekiData.month + "/" + LastWarekiData.date;

            const dayText=[
                {text:"Sunday",stext:"Sun",jtext:"日",jstext:"日曜日"},
                {text:"Monday",stext:"Mon",jtext:"月",jstext:"月曜日"},
                {text:"Tuesday",stext:"Tue",jtext:"火",jstext:"火曜日"},
                {text:"Wednesday",stext:"Wed",jtext:"水",jstext:"水曜日"},
                {text:"Thursday",stext:"Thu",jtext:"木",jstext:"木曜日"},
                {text:"Friday",stext:"Fri",jtext:"金",jstext:"金曜日"},
                {text:"Saturday",stext:"Sat",jtext:"土",jstext:"土曜日"}
            ];
            dayText.forEach( e => Object.freeze(e));

            const f = d => {
                if( ! d instanceof Date ) 
                    throw new Error("Error:Argument is not a Date object" );
                
                const t =  d.getTime();
                const w =  WarekiData.find( e => t >= e.Milliseconds);
                if( w === undefined ) 
                    throw new Error("Error:Minimun Date is " + MinDate );
                
                const y = d.getFullYear() - w.year + 1;
                const day = d.getDay();
                return { year:y , yearText : w.yearText
                    , month : d.getMonth()+1 , date : d.getDate() 
                    , day : day , dayText : dayText[day]};
            };

            return   d  => f(d);

})();

実行例

const d = new Date("//");

const w = wareki( d );

console.log( w );

更新日:2023/01/30

書いた人(管理人):けーちゃん

スポンサーリンク

記事の内容について

null

こんにちはけーちゃんです。
説明するのって難しいですね。

「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。

裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。

掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。

ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php

 

このサイトは、リンクフリーです。大歓迎です。