FILETIMEを使って日付を比較する

[戻る]
びんたろー [E-Mail] 2003/02/05(水) 16:35:40
こんにちは。
初めて投稿させていただきます。
びんたろーです。

現在、VC++5.0での開発をしているのですが、
どうしても判らないところが有ったので、質問させて下さい。

「入力された日付がシステム日付と比較して
5日以内であるかどうかを調べたい」
ということが出来なくて困っています。

これまでに試したのは、
1)ローカル時間を二つ取得して、FILETIMEに変換する
2)片方の年月日を入力した年月日に置き換える
3)FILETIME同士を引き算して、5日分の時間より大きいかどうかを比べる
というのをやろうとして、FILETIME同士の引き算が出来ない、
というところで躓いてしまいました。

もし、もっとよいやり方が有れば是非教えて頂きたく思います。
よろしくお願いします。

↓以下がそのコードです。
{
    SYSTEMTIME st1,st2;
    FILETIME ft1,ft2;
    CString strWorkDate;
    CString Year;
    CString Mon;
    CString Day;
    long    lDayComp;

    // システム日付を取得する
    GetLocalTime(&st1);
    GetLocalTime(&st2);
    // 入力された日付をカレンダー時間に変換する
    // 入力された日付:Date[10]→YYYY/MM/DD
    memset( Year, 0, sizeof( Year ) );
    memset( Mon, 0, sizeof( Mon ) );
    memset( Day, 0, sizeof( Day ) );
    memcpy( Year, &OutDate[0], 4 );
    memcpy( Mon, &OutDate[4], 2 );
    memcpy( Day, &OutDate[6], 2 );
    st2.wYear = Year;
    st2.wMonth = Mon;
    st2.wDay = Day;
    SystemTimeToFileTime(&st2,&ft2);
    // システム日付をカレンダー時間に変換する
    SystemTimeToFileTime(&st1,&ft1);

    // 加算日を100ナノ秒単位に変換する(1秒=1000000000ナノ秒)
    lDayComp = AddDay * 24 * 60 * 60 * 10000000;


}

n [E-Mail] 2003/02/05(水) 16:51:39
 memset( CString型の変数, 0, sizeof( CString型の変数 ) );

はマズイのでは?

びんたろー [E-Mail] 2003/02/05(水) 16:59:32
あ、その通りです。
すいません。

char Year[4];
char Mon[2];
char Day[2];

で宣言してもだめですかね?
なんか、いかにもCっぽいですが。。。

C++があまり詳しくないもので。。。

NEG(ねぐ) [E-Mail] [HomePage] 2003/02/05(水) 17:05:28
 FILETIME 構造体は以下のようになっているので、メンバごとに比較ができると思う。

typedef struct _FILETIME {
    DWORD dwLowDateTime;   /* 下位 32 ビット */
    DWORD dwHighDateTime;  /* 上位 32 ビット */
} FILETIME, *PFILETIME, *LPFILETIME;

 たとえば、5日後、5日前のFILETIMEを用意して、その範囲に入ってるか比較すればいいの
では?
(時間に注意)

暇人貴子 2003/02/05(水) 17:10:03
CStringってMFCのCStringですか?
MFCだったらCTimeとCTimeSpan使えば
できそうですけど?

tib 2003/02/05(水) 17:14:40
私ならこんな感じ。

int yy, mm, dd; ←それぞれ年月日が入っているものとする。
CTime t1 = CTime::GetCurrentTime();
CTime t2( yy, mm, dd, t1.GetHour(), t1.GetMinute(), t1.GetSecond() );
CTimeSpan ts = t2 - t1;
int spanDays = ts.GetDays();
if( spanDays<=-5 ) { (入力された日付から5日以上経ってる) }
if( spanDays>= 5 ) { (入力された日付まで5日以上残ってる) }

びんたろー [E-Mail] 2003/02/05(水) 17:47:43
tibさんのコードを利用したら出来ました。
ありがとうございました。

でも、一つだけ、疑問が、、、
CTime t2( yy, mm, dd, t1.GetHour(), t1.GetMinute(), t1.GetSecond() );
の部分で、

CTime t2;
t2( yy, mm, dd, t1.GetHour(), t1.GetMinute(), t1.GetSecond() );

としたら、
C2064
「関数ポインタとして評価されない式を使って、関数を呼び出そうとしました。」

というエラーが出てしまいました。

これまで、変数の宣言は関数の冒頭でしていたので、
それに倣った、だけだったのですが、何が問題だったのでしょうか?

ただ、
CTime t2( yy, mm, dd, t1.GetHour(), t1.GetMinute(), t1.GetSecond() );
としたら上手く行きました。

本当にありがとうございます!

tib 2003/02/05(水) 17:58:33
MSDNなどを検索すると解ると思いますが、
t2( yy, ... );
というのは変数を宣言と同時に初期化する際の書き方です。

変数の宣言と初期化を分けたいのであれば、time_tなどで代入したい値を作っておいてく
ださい。
CTime t2;
time_t tm;
time( &tm );
t2 = tm;

tib 2003/02/05(水) 17:59:25
で、これで解決ならチェックいれといてください。

暇人貴子 2003/02/05(水) 18:02:08
>t2( yy, mm, dd, t1.GetHour(), t1.GetMinute(), t1.GetSecond() );
と書くとコンパイラはt2が関数と解釈してしまいます。
MFCを使う前にC++の文法を勉強なさった方がよろしいかと・・・

びんたろー [E-Mail] 2003/02/05(水) 18:10:23
[[解決]]
UNIX C しか使ったこと無かったのですが、
どうしてもVC++での開発に迫られていたもので。

どうもありがとうございました。

古いスレッドには追加発言できません。