【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"1867/12/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
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    
    << October 2017 >>

    profile

    others

    mobile

    qrcode