取得データを日付としてチェックしたい


aroma  2006-05-23 17:27:17  No: 61920  IP: 192.*.*.*

.NET2003(MFC)でEditControlに入力された、
"2005-04-01"は正常な日付はOK
"2005-99-99"はありえない日付はNG
と言うようなチェックをしたいのですが、

CString Chk_date;
CEdit* myED1 = (CEdit*)GetDlgItem(IDC_EDIT1);
myED1->GetWindowText(Chk_date);

にてChk_dateを取得した後、どう言うチェックの仕方を
したら良いのか分かりません。
何かいい方法、参考等あれば教えてください。

宜しくおねがいします。
環境はwinxpです。

編集 削除
通りすがり  2006-05-23 17:41:18  No: 61921  IP: 192.*.*.*

取得した日付を_mktime64で正規化した結果と比較してみるとか

編集 削除
aroma  2006-05-23 18:05:43  No: 61922  IP: 192.*.*.*

通りすがりさん。ありがとうございます。

正規化した結果と言うの
はChk_date(CString型)を日付に直すと言うことなのでしょうか?

もし、そうならばどのように変換すれば良いのでしょうか?

初心者な質問で申し訳ありませんが
教えてください。

編集 削除
Blue  2006-05-24 01:56:04  No: 61923  IP: 192.*.*.*

大まかな流れ。

◎日付文字列のフォーマットのチェック
1.Chk_dateの文字列を 年 月 日 という文字列に分割
    このときに全体の文字列の長さと区切り文字が"-"をいうことをチェックする。
    (CStringクラスのGetLength,Midを利用)
2.年 月 日 という文字列を数値に変換
    このときに年 月 日 という文字列が数字で構成されていることをチェック(1でやっちゃっても可)
    (ここは好みだが、_tcstol関数が便利かな)

※_stscanfで1,2を一度でチェックできるが、初心者向けではないかも。

◎日付の正当性チェック
3.2で取得した、年月日の数値をもとに正当な日付であるかチェックする。
   ・年(西暦)はグレゴリウス暦施行翌年以降であるか(上限はシラネ)
   ・月は1〜12か
   ・日はきちんとその年、月にあったものであるか
     ☆1、3、5、7,8,10,12月は31日
     ☆4,6,9、11月は30日
     ☆2月は閏年の場合29日、閏年でない場合28日
       閏年
       (1)西暦年が4で割り切れる年。 
       (2)西暦年が4で割り切れる年のうち、100で割り切れる年は閏年としない。 
       (3)西暦年が4で割り切れ、100でも割り切れる年のうち、400で割り切れる年。 
  (ここは単純なif文でもかけます)

※1970年以降であれば、CTimeクラスやmktimeが利用できます。
mktime、_mktime64
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/vclib/html/_crt_mktime.asp

以上、間違いがあれば指摘お願いします。



で、一度これでコードを書いてみてください。
それで、どこが具体的にわからないかを質問してください。

編集 削除
Ban  2006-05-24 06:32:42  No: 61924  IP: 192.*.*.*

別解
要件が許せば、単なるEditからCalendar/DateTimePickerに変更してしまう。
もしも目的が日時入力だけならこれがスマートな気もします。

編集 削除
subaru  2006-05-24 10:35:14  No: 61925  IP: 192.*.*.*

MFCだからCOleDateTimeを使って
SetDate→GetStatusでもOKかな。
形式にこだわらなければCOleDateTime::ParseDateTimeだけでいいかもしれない。

編集 削除