【VC++】西暦文字列の書式を設定して和暦に変換する

0

    <機能>
    いろいろなやり方があると思いますので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行目)

    <イメージ>
    実行結果イメージ
    西暦和暦変換実行結果、VC、ParseDateTime
     

    //プロトタイプ宣言
    CString ChgYYYYtoGYY(CString csYYYY);

    //Main関数から西暦和暦変換関数(ChgYYYYtoGYY)を呼び出し
    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" }
        };
        COleDateTime codt;
        int idx = 0;
        CString cwk, csGyy("");

        //テストデータの和暦を取得
        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);

            //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";
            idx++;
        }
        AfxMessageBox(csGyy, MB_ICONINFORMATION);

        //~~省略~~
    }

    /******************************************************
    西暦(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;

        //引数(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));
    }

     

    よろしければポチッと押してください

    プログラマー ブログランキングへ



    calendar

    S M T W T F S
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    30      
    << September 2018 >>

    profile

    others

    mobile

    qrcode         スマホ表示に戻す