.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です。
取得した日付を_mktime64で正規化した結果と比較してみるとか
通りすがりさん。ありがとうございます。
正規化した結果と言うの
はChk_date(CString型)を日付に直すと言うことなのでしょうか?
もし、そうならばどのように変換すれば良いのでしょうか?
初心者な質問で申し訳ありませんが
教えてください。
大まかな流れ。
◎日付文字列のフォーマットのチェック
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
以上、間違いがあれば指摘お願いします。
で、一度これでコードを書いてみてください。
それで、どこが具体的にわからないかを質問してください。
別解
要件が許せば、単なるEditからCalendar/DateTimePickerに変更してしまう。
もしも目的が日時入力だけならこれがスマートな気もします。
MFCだからCOleDateTimeを使って
SetDate→GetStatusでもOKかな。
形式にこだわらなければCOleDateTime::ParseDateTimeだけでいいかもしれない。
ツイート | ![]() |