新元号が発表され、元号表記が複雑になってきました。
変換するには Windows デスクトップアプリは大げさで面倒ですが、簡単に作成できるので、とりあえず作成しました。 昭和・平成・令和の元年と西暦年が正しく記録されれば、変換は簡単です。
Win7 + Visual C++ 2013/MFC で、ダイアログアプリとして作成していますが、計算部分についてはOS等には依存しません。 使用している Windows API は、同等の関数に置き換えれば、計算部分はそのまま他のOSや言語でも利用可能と思いますので、 関数などを含めて、ここで紹介しています。
このページにトピック一覧がありますので、あわせてご参照ください。
ご利用に際しては、必ずプライバシーポリシー(免責事項等)をご参照ください。
投稿 April 1, 2019
起動すると、次のような画面が表示されます。
起動時には、今年が表示されており、西暦が選択されています。
西暦・令和・平成・昭和のいずれかの年を入力すると、「更新」ボタンが利用可能になります。
※ 「更新」ボタンが利用可能なとき、画面上の年は正しく一致していない可能性があります。
「更新」ボタンを押す(またはエンターキーを押す)と、「<< 入力」の表示がある年を基準に更新されます。
私なら、完全に信用できるサイト以外からのダウンロードはしませんが、 興味がある方のために、実行ファイルを圧縮したものを置いておきます。 安全に努めているマシンで用意したファイルですが、お試しいただく場合は、 出力される結果(内容)を含め、完全に自己責任でお願いします。
OSは Windows 7 以降、ランタイムなど環境の用意は
実行ファイルを含む zip ファイルのダウンロードは、
https://www.straightapps.com/download/shryear.zip
正しい zip ファイルのタイムスタンプは 2019/4/1 15:23:07、
正しい実行ファイルのタイムスタンプ(更新日時)は 2019/4/1 15:18:58 で、
zip 内は実行ファイル1つだけです。
zip ファイルサイズは 1,778,357 バイト、
実行ファイルのサイズは 3,245,568 バイトです。
パスワードは設定していません。
投稿 April 1, 2019
Windows API では、本日の日付(年)の取得は簡単です。
画面表示のために、ダイアログの初期化 OnInitDialog 関数で取得しています。
// 今日の年を取得して、画面に表示します。 SYSTEMTIME st; GetLocalTime(&st); SetDlgItemInt(IDC_YEAR, st.wYear); // 西暦 SetDlgItemInt(IDC_REIWA, st.wYear - 2019 + 1); // 令和(2019年が元年) SetDlgItemInt(IDC_HEISEI, st.wYear - 1989 + 1); // 平成(1989年が元年) SetDlgItemInt(IDC_SHOUWA, st.wYear - 1926 + 1); // 昭和(1926年が元年)
上記コードのコメントにも入れてありますが、取得できる st.wYear は西暦年ですので、各元号に変換しています。
令和は、2019 年が元年になりますので、西暦年 - 2019 + 1 年です。 わざわざ 2019 を引いて 1 を足しているのは、間違いをなくす努力です。
平成は 1989 年が、昭和は 1926 年が元年のため、同様の計算で変換しています。
Android ネイティブアプリで日付を取得する方法は、 こちらに書いています。ご参考まで。
投稿 April 1, 2019
数字しか入れられなくするには、コントロールのプロパティで、"Number" を True に設定するだけです。 文字数の制限はプロパティではできませんので、以下のように設定しています。
((CEdit*)GetDlgItem(IDC_YEAR))->SetLimitText(4); ((CEdit*)GetDlgItem(IDC_REIWA))->SetLimitText(4); ((CEdit*)GetDlgItem(IDC_HEISEI))->SetLimitText(4); ((CEdit*)GetDlgItem(IDC_SHOUWA))->SetLimitText(4);
各欄の右側に表示される「<< 入力」の文字は、コントロール名を付与したスタティック コントロールです。 ダイアログの初期化 OnInitDialog 関数で、 下記のコードを持つ hideArrows 関数を呼び出して、すべて非表示にしています。
GetDlgItem(IDC_INPUT_YEAR)->ShowWindow(SW_HIDE); GetDlgItem(IDC_INPUT_R)->ShowWindow(SW_HIDE); GetDlgItem(IDC_INPUT_H)->ShowWindow(SW_HIDE); GetDlgItem(IDC_INPUT_S)->ShowWindow(SW_HIDE);
入力された年がどれかを判断するため、 最後に入力された欄の右に「<< 入力」と表示しますので、 エディット コントロールの EN_SETFOCUS メッセージを処理しています。 hideArrows 関数を呼び出したあと、対応するものだけを表示にしています。
GetDlgItem(IDC_INPUT_YEAR)->ShowWindow(SW_SHOW);
最後に、「更新」ボタンが押されたとき、 どれが入力された数字かを判定する方法を書いておきます。
4つ用意された「&lu;< 入力」の、どれが表示されているかを見ています。
// 西暦にあわせる場合 if (GetDlgItem(IDC_INPUT_YEAR)->IsWindowVisible()){ nYear = GetDlgItemInt(IDC_YEAR); SetDlgItemInt(IDC_REIWA, nYear - 2019 + 1); // 令和(2019年が元年) SetDlgItemInt(IDC_HEISEI, nYear - 1989 + 1); // 平成(1989年が元年) SetDlgItemInt(IDC_SHOUWA, nYear - 1926 + 1); // 昭和(1926年が元年) }
どの元号の場合でも、いったん西暦年に変換してから、計算・表示しています。
投稿 April 1, 2019、リンク更新 November 4, 2020
プログラムから既定のブラウザでウェブページを開くコードを書いておきます。
このユーティリティでは、画面右下のサイト名の部分をクリックすると、このサイトが開くようになっています。
スタティック・コントロールにIDを付けて、 Notify プロパティを True に変更、 Click のハンドラから、ShellExecute 関数を呼び出します。 Microsoft の説明は、 「ShellExecuteA function (shellapi.h)」 にあります。
マウスポインタの形状は矢印のままなので、隠し機能みたいになっています。 本当は、わかりやすくすべきです。
ShellExecute(GetSafeHwnd(), _T("open"), _T("https://www.straightapps.com/win/"), NULL, NULL, SW_SHOWNORMAL);
呼び出し元がダイアログのクリック処理のため、 CWnd のウィンドウハンドル HWND を得る、 GetSafeHwnd 関数を使っています。 また、文字の形式を自動で統一するため、_Tを使っています。
Windows 開発に関するトピックは、「Windows 開発トップ」にまとめられています。