日付文字列から曜日を求める

YYYYMMDD形式の日付文字列はよく使われます。(世間一般ではわからんですが、少なくとも私はよく使います。)
曜日を求めたいケースもちょくちょくあるのですが、その都度下記のようにして求めていました。

TDateTime dtTMP;
strYYMMDD.Insert("/", 5);
strYYMMDD.Insert("/", 8);
dtTMP = StrToDate(strYYMMDD);
iWW = dtTMP.DayOfWeek();

その都度「/」を挿入してTDateTime?型に変換して求めるのですが、後々の処理ではYYYYMMDD形式が必要だったりして、別の変数にコピーしてから「/」を挿入したり結構手間がかかります。
ならサブルーチン化するか、と思ったのですが、毎回文字列を変形させてTDateTime?型に変換するのもなんとなく効率が悪いような気がしたので、ツェラーの公式を使ってダイレクトに曜日を算出するようにしてみました。
どっちが効率がいいのかさっぱりわからんですがね。(^^;
まぁ、ツェラーの公式を試してみたかった、ということで。

//---------------------------------------------------------------------------
//            YYYYMMDD形式文字列から曜日を求めるサブルーチン
//                                                            2007.12.27
//                                                             by Shue
//---------------------------------------------------------------------------
//    Usage :
//        subDayOfWeek(AnsiString strYYMMDD, int iTYPE)
//            引数 : strYYMMDD --- 日付文字列をYYYYMMDD形式で渡す
//                    iTYPE ------- 0:結果を数値で返す  0-日 1-月 … 6-土
//                                  1:結果を英字で返す  0-Sun. 1-Mon. … 6-Sat.
//                                  2:結果を漢字で返す  0-日 1-月 … 6-土
//            戻値 : iTYPEに従った形式で曜日を戻す
//                    strYYMMDDが日付文字列ではなかった場合は、空文字列を返す
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "subDayOfWeek.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
//---------------------------------------------------------------------------
AnsiString __fastcall subDayOfWeek(AnsiString strYYMMDD, int iTYPE)
{
    //    ツェラーの公式によって曜日を求める
    AnsiString strRET1[8] = {"", "Sun.", "Mon.", "Tue.", "Wed.", "Thu.", "Fri.", "Sat."};
    AnsiString strRET2[8] = {"", "日", "月", "火", "水", "木", "金", "土"};
    int iMDD[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    int iYY, iMM, iDD, iWW;
    AnsiString strRET = "";

    //    日付文字列を分解
    iYY = strYYMMDD.SubString(1, 4).ToIntDef(0);
    iMM = strYYMMDD.SubString(5, 2).ToIntDef(0);
    iDD = strYYMMDD.SubString(7, 2).ToIntDef(0);

    //    各数値のチェック
    if ((iYY < 1583) || (iYY > 3999))    {
        iYY = 0;
    }
    if ((iMM < 1) || (iMM > 12))    {
        iMM = 0;
    }
    if (iMM == 2)    {
        if ((iYY % 400) == 0)    {
            iMDD[1] = 29;
        } else if ((iYY % 100) == 0)    {
            iMDD[1] = 28;
        } else if ((iYY % 4) == 0)        {
            iMDD[1] = 29;
        }
    }
    if ((iDD < 0) || (iDD > iMDD[iMM - 1]))    {
        iDD = 0;
    }

    //    有効な数値なら算出
    if ((iYY != 0) && (iMM != 0) && (iDD != 0))    {
        if ((iMM == 1) || (iMM == 2))    {
            iYY--;
            iMM += 12;
        }

        iWW = (iYY + (iYY / 4) - (iYY / 100) + (iYY / 400) + (int)(2.6 * iMM + 1.6) + iDD) % 7;
    } else {
        iWW = -1;
    }

    //    戻す文字列を求める
    switch (iTYPE)    {
        case 1:        strRET = strRET1[iWW + 1];        break;
        case 2:        strRET = strRET2[iWW + 1];        break;
        default:    strRET = AnsiString(iWW);
    }

    return strRET;
}
//---------------------------------------------------------------------------

トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2012-12-09 (日) 22:30:52 (3004d)