【VC++】西暦文字列の書式を設定して和暦に変換する
<機能>
いろいろなやり方があると思いますので1例としてご覧ください
(1)データベースなどから読み込んだ西暦文字列(YYYY/MM/DD)に書式を設定する
(2)西暦文字列(YYYYMMDD)を和暦に変換する
<使い方>
1.MFCアプリケーションのコンソールベースでプロジェクトを作成
2.構成プロパティ > 全般 > 文字セット で「マルチバイト文字セットを使用する」を選択する場合は下記を修正
・文字リテラルについているLをすべて削除
・wchar_t型をchar型に変更
・wcscmp関数をstrcmp関数に変更
UnicodeではなくShiftJISを使用する場合の変更点は以上です
3.西暦和暦変換関数(ChgYYYYtoGYY)のプロトタイプ宣言をする(1~3行目)
4.西暦和暦変換関数(ChgYYYYtoGYY)を張り付ける(63~104行目)
5.Main関数からの呼び出し部とテストデータを張り付ける(5~61行目)
<イメージ>
実行結果イメージ
//プロトタイプ宣言
CString ChgYYYYtoGYY(CString csYYYY);
CString ChgYYYYtoGYY(CString csYYYY);
//Main関数から西暦和暦変換関数(ChgYYYYtoGYY)を呼び出し
int Main()
{
//~~省略~~
int Main()
{
//~~省略~~
//テストデータ
const struct {
wchar_t csTest[16];
}myDay[] = {
{ L"1887/1A/10" },
{ L"1868/09/08" },
{ L"1912/07/29" },
{ L"1912/07/30" },
{ L"1926/12/24" },
{ L"1926/12/25" },
{ L"1989/01/07" },
{ L"1989/01/08" },
{ L"2016/01/05" },
{ L"END" }
};
const struct {
wchar_t csTest[16];
}myDay[] = {
{ L"1887/1A/10" },
{ L"1868/09/08" },
{ L"1912/07/29" },
{ L"1912/07/30" },
{ L"1926/12/24" },
{ L"1926/12/25" },
{ L"1989/01/07" },
{ L"1989/01/08" },
{ L"2016/01/05" },
{ L"END" }
};
COleDateTime codt;
int idx = 0;
CString cwk, csGyy("");
int idx = 0;
CString cwk, csGyy("");
//テストデータの和暦を取得
while (1) {
//"END"が出現したらループ終了
if (wcscmp(myDay[idx].csTest, L"END") == 0) break;
while (1) {
//"END"が出現したらループ終了
if (wcscmp(myDay[idx].csTest, L"END") == 0) break;
//テストデータをCString変数にセット
cwk.Format(L"%s", myDay[idx].csTest);
//CString→COleDateTime型への変換はParseDateTimeを用いる
codt.ParseDateTime(cwk);
cwk.Format(L"%s", myDay[idx].csTest);
//CString→COleDateTime型への変換はParseDateTimeを用いる
codt.ParseDateTime(cwk);
//COleDateTime型にすることによりFormatで書式を設定できる
//%Y (世紀の)年
//%m 月(01-12)
//%B 月(英語) ※小文字「%b」だと英語略称
//%d 日(01-31)
//%A 曜日(英語) ※小文字「%a」だと英語略称
//%w 曜日番号(日曜日が0)
//他にも%U(日曜日の数)、%W(月曜日の数)等あり
//日付変換エラーの時は"Invalid DateTime"がセットされる
//https://msdn.microsoft.com/ja-jp/library/fe06s4ak.aspx
csGyy += codt.Format(L"%Y年%m月%d日 %B %d,%Y(%A[%w])") + L"¥r¥n";
//西暦を和暦に変換
csGyy += L" 和暦変換→" + ChgYYYYtoGYY(codt.Format(L"%Y%m%d")) + L"¥r¥n";
//%Y (世紀の)年
//%m 月(01-12)
//%B 月(英語) ※小文字「%b」だと英語略称
//%d 日(01-31)
//%A 曜日(英語) ※小文字「%a」だと英語略称
//%w 曜日番号(日曜日が0)
//他にも%U(日曜日の数)、%W(月曜日の数)等あり
//日付変換エラーの時は"Invalid DateTime"がセットされる
//https://msdn.microsoft.com/ja-jp/library/fe06s4ak.aspx
csGyy += codt.Format(L"%Y年%m月%d日 %B %d,%Y(%A[%w])") + L"¥r¥n";
//西暦を和暦に変換
csGyy += L" 和暦変換→" + ChgYYYYtoGYY(codt.Format(L"%Y%m%d")) + L"¥r¥n";
idx++;
}
}
AfxMessageBox(csGyy, MB_ICONINFORMATION);
//~~省略~~
}
}
/******************************************************
西暦(YYYYmmdd形式)を和暦に変換する
引 数:csYYYY(西暦日付8桁)※スラッシュ「/」なしで数値8桁
※日付変換エラーの時は"Invalid DateTime"が設定される
戻り値:和暦日付
******************************************************/
CString ChgYYYYtoGYY(CString csYYYY)
{
CString csRtn = L"**変換エラー**";
int iwk;
西暦(YYYYmmdd形式)を和暦に変換する
引 数:csYYYY(西暦日付8桁)※スラッシュ「/」なしで数値8桁
※日付変換エラーの時は"Invalid DateTime"が設定される
戻り値:和暦日付
******************************************************/
CString ChgYYYYtoGYY(CString csYYYY)
{
CString csRtn = L"**変換エラー**";
int iwk;
//引数が8桁でなければエラー
if (csYYYY.GetLength() != 8) return csRtn;
//引数が数値でなければエラー
CString cwk = csYYYY.SpanIncluding(L"0123456789");
if (cwk != csYYYY) return csRtn;
if (csYYYY.GetLength() != 8) return csRtn;
//引数が数値でなければエラー
CString cwk = csYYYY.SpanIncluding(L"0123456789");
if (cwk != csYYYY) return csRtn;
//引数(csYYYY)は8桁の数値であるため数値に変換して比較
iwk = _ttoi(csYYYY);
if (iwk < 18680908) {
//江戸時代以前
return csRtn;
}
else if (iwk < 19120730) {
//明治
csRtn.Format(L"明治%02d",(int)(iwk/10000)-(1868-1));
}
else if (iwk < 19261225) {
//大正
csRtn.Format(L"大正%02d", (int)(iwk / 10000) - (1912 - 1));
}
else if (iwk < 19890108) {
//昭和
csRtn.Format(L"昭和%02d", (int)(iwk / 10000) - (1926 - 1));
}
else {
//平成
csRtn.Format(L"平成%02d", (int)(iwk / 10000) - (1989 - 1));
}
return csRtn += (L"/" + csYYYY.Mid(4, 2) + L"/" + csYYYY.Mid(6, 2));
}
iwk = _ttoi(csYYYY);
if (iwk < 18680908) {
//江戸時代以前
return csRtn;
}
else if (iwk < 19120730) {
//明治
csRtn.Format(L"明治%02d",(int)(iwk/10000)-(1868-1));
}
else if (iwk < 19261225) {
//大正
csRtn.Format(L"大正%02d", (int)(iwk / 10000) - (1912 - 1));
}
else if (iwk < 19890108) {
//昭和
csRtn.Format(L"昭和%02d", (int)(iwk / 10000) - (1926 - 1));
}
else {
//平成
csRtn.Format(L"平成%02d", (int)(iwk / 10000) - (1989 - 1));
}
return csRtn += (L"/" + csYYYY.Mid(4, 2) + L"/" + csYYYY.Mid(6, 2));
}
よろしければポチッと押してください