このサイトでは、分析、カスタマイズされたコンテンツ、および広告に Cookie を使用します。このサイトを引き続き閲覧すると、Cookie の使用に同意するものと見なされます。
Hi, Developers,
straightapps.com ロゴ
作成 April 1, 2019、更新 November 4, 2020(微調整)
トップページ > Windows トップ > SHRyear
line
Windows 開発
line

昭和・平成・令和・西暦年を相互変換する Windows デスクトップ・プログラム SHRyear を紹介しています。

新元号が発表され、元号表記が複雑になってきました。

変換するには Windows デスクトップアプリは大げさで面倒ですが、簡単に作成できるので、とりあえず作成しました。 昭和・平成・令和の元年と西暦年が正しく記録されれば、変換は簡単です。

Win7 + Visual C++ 2013/MFC で、ダイアログアプリとして作成していますが、計算部分についてはOS等には依存しません。 使用している Windows API は、同等の関数に置き換えれば、計算部分はそのまま他のOSや言語でも利用可能と思いますので、 関数などを含めて、ここで紹介しています。

このページにトピック一覧がありますので、あわせてご参照ください。
ご利用に際しては、必ずプライバシーポリシー(免責事項等)をご参照ください。

▼ セクション一覧

どんな動作をするのか
年の取得
その他のコード
リンク先を開く(おまけメモ)

どんな動作をするのか

投稿 April 1, 2019

起動すると、次のような画面が表示されます。

起動時には、今年が表示されており、西暦が選択されています。

西暦・令和・平成・昭和のいずれかの年を入力すると、「更新」ボタンが利用可能になります。
※ 「更新」ボタンが利用可能なとき、画面上の年は正しく一致していない可能性があります。

更新」ボタンを押す(またはエンターキーを押す)と、「<< 入力」の表示がある年を基準に更新されます。

私なら、完全に信用できるサイト以外からのダウンロードはしませんが、 興味がある方のために、実行ファイルを圧縮したものを置いておきます。 安全に努めているマシンで用意したファイルですが、お試しいただく場合は、 出力される結果(内容)を含め、完全に自己責任でお願いします。

OSは Windows 7 以降、ランタイムなど環境の用意は 特に必要ない ( MFC ライブラリはスタティックリンクしています。 ) と思います。

実行ファイルを含む 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

年を入力する欄 ( エディット コントロールです。 ) は、4桁までの数字しか入れられなくしてあります。

数字しか入れられなくするには、コントロールのプロパティで、"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を使っています。

▲ページ先頭へ
line
関連トピックス
line

DaysUntil 指定の日まであと何日?

本日から指定の日付までの日数を計算する Windows デスクトップ・プログラム DaysUntil を紹介しています。


その他のおすすめ

Windows 開発に関するトピックは、「Windows 開発トップ」にまとめられています。



© 2017-2021 StraightApps.com 無断転載を禁じます。No reproduction without permission.