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


aroma  2006-05-24 02:27:17  No: 61920

.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-24 02:41:18  No: 61921

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


aroma  2006-05-24 03:05:43  No: 61922

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

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

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

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


Blue  2006-05-24 10:56:04  No: 61923

大まかな流れ。

◎日付文字列のフォーマットのチェック
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 15:32:42  No: 61924

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


subaru  2006-05-24 19:35:14  No: 61925

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加