こんにちは。
初めて投稿させていただきます。
びんたろーです。
現在、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;
}
memset( CString型の変数, 0, sizeof( CString型の変数 ) );
はマズイのでは?
あ、その通りです。
すいません。
char Year[4];
char Mon[2];
char Day[2];
で宣言してもだめですかね?
なんか、いかにもCっぽいですが。。。
C++があまり詳しくないもので。。。
FILETIME 構造体は以下のようになっているので、メンバごとに比較ができると思う。
typedef struct _FILETIME {
DWORD dwLowDateTime; /* 下位 32 ビット */
DWORD dwHighDateTime; /* 上位 32 ビット */
} FILETIME, *PFILETIME, *LPFILETIME;
たとえば、5日後、5日前のFILETIMEを用意して、その範囲に入ってるか比較すればいいの
では?
(時間に注意)
CStringってMFCのCStringですか?
MFCだったらCTimeとCTimeSpan使えば
できそうですけど?
私ならこんな感じ。
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日以上残ってる) }
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() );
としたら上手く行きました。
本当にありがとうございます!
MSDNなどを検索すると解ると思いますが、
t2( yy, ... );
というのは変数を宣言と同時に初期化する際の書き方です。
変数の宣言と初期化を分けたいのであれば、time_tなどで代入したい値を作っておいてく
ださい。
CTime t2;
time_t tm;
time( &tm );
t2 = tm;
で、これで解決ならチェックいれといてください。
>t2( yy, mm, dd, t1.GetHour(), t1.GetMinute(), t1.GetSecond() );
と書くとコンパイラはt2が関数と解釈してしまいます。
MFCを使う前にC++の文法を勉強なさった方がよろしいかと・・・
UNIX C しか使ったこと無かったのですが、
どうしてもVC++での開発に迫られていたもので。
どうもありがとうございました。