- PR -

日付のチェックについて

投稿者投稿内容
みーちく
大ベテラン
会議室デビュー日: 2002/08/29
投稿数: 131
投稿日時: 2002-11-08 11:31
こんにちわ。みーちくと申します。

JAVAでの日付のチェックはみなさんはどうしてますか?
私はまだJAVAの初心者なので、半角のみチェックしているのですが、
やはりもう少しチェックしたいと考えております。

なにか良い方法などありましたら、ご教授願います。
宜しくお願い致します。
小僧
ぬし
会議室デビュー日: 2002/08/14
投稿数: 526
投稿日時: 2002-11-08 12:33
もしJava2の1.4とか使っていらっしゃるなら、正規表現なんか使うのはいかがでしょうか。文字列のパターンチェックや、文字列内の特定部分から文字を抽出するなどが楽にできます。詳しくは調べていただくとして、

http://www5.airnet.ne.jp/sakuraba/java/laboratory/JDK1.4/NewIO/RegularExpressions/RegularExpressions.html

で、1.4用の解説がありましたよ。
みーちく
大ベテラン
会議室デビュー日: 2002/08/29
投稿数: 131
投稿日時: 2002-11-08 12:38
小僧さん。
早速の返信ありがとうございました。

実はJavaは1.3なんですぅ。
すみません。はじめに書いておけば良かったですね。
あれからいろいろ調べてはみたんですが、setLenientを使えばよいというページがあったんですが、使い方がわかりません。ご存知ですか?
H2
ぬし
会議室デビュー日: 2001/09/06
投稿数: 586
お住まい・勤務地: 港
投稿日時: 2002-11-08 13:47
正規表現を使わなくても java.text.SimpleDateFormat を使えばチェックできると思います。詳しくはJavaDocを読んでみてください。

> 実はJavaは1.3なんですぅ。
便利なJakartaプロジェクトにて正規表現用パッケージがダウンロードできます。
http://jakarta.apache.org/regexp/index.html

> setLenientを使えばよいというページがあったんですが、使い方がわかりません。ご存知ですか?
こちらをどうぞ。
http://www.gimlay.org/~javafaq/S100.html#S100-03
みーちく
大ベテラン
会議室デビュー日: 2002/08/29
投稿数: 131
投稿日時: 2002-11-08 15:32
H2さん。

回答ありがとうございました。
早速調べて見たいと思います。

出来上がったら、またお知らせします。
しょむ
ぬし
会議室デビュー日: 2001/09/06
投稿数: 430
投稿日時: 2002-11-09 02:39
java.util.DateFormat あたりにかけて Exception を catch するという方法も。
# うそくせー(わ
みーちく
大ベテラン
会議室デビュー日: 2002/08/29
投稿数: 131
投稿日時: 2002-11-11 16:23
みーちくです。
setLenientを使用して、作成してみました。
【ソース】
public static String getDateError(String str, String title) {
String message = "";
String str_date = str;
String str_year = "";
String str_month = "";
String str_day = "";
int int_year = 0;
int int_month = 0;
int int_day = 0;
int int_index1 = 0;
int int_index2 = 0;

int_index1 = str_date.indexOf('/');
if(int_index1 > 0){
int_index2 = str_date.indexOf('/',int_index1 + 1);
}

if((int_index1 > 0) && (int_index2 > 0)){
str_year = str_date.substring(0,int_index1);
str_month = str_date.substring(int_index1 + 1,int_index2);
str_day = str_date.substring(int_index2 + 1);
int_year = Integer.parseInt(str_year);
int_month = Integer.parseInt(str_month);
int_day = Integer.parseInt(str_day);
}
Calendar cal = Calendar.getInstance();
cal.setLenient( false );
cal.set(int_year, int_month -1, int_day);
try {
cal.get(cal.YEAR);
} catch (IllegalArgumentException e) {
message = "<li>[" + title + "] 指定の年月日は存在しません。<br>";
}
return message;
}

なんかすごく長いソースになってしまいました。
H2さんやしょむさんが教えてくれた、java.text.SimpleDateFormatの使い方がやっぱりよくわかりません。
下のようなソースで実行すると、下記のようなエラーとなります。
やっぱり、使い方がまずいのでしょうか。

宜しくお願い致します。

Exception in thread "main" java.lang.IllegalArgumentException: Cannot format given Object as a Date

class Date_test {
 public static void main(String[] args) {
  String str = "20021111";
  DateFormat df = new SimpleDateFormat("yyyy/MM/dd (EE)");
  System.out.println(df.format(str));
 }
}
H2
ぬし
会議室デビュー日: 2001/09/06
投稿数: 586
お住まい・勤務地: 港
投稿日時: 2002-11-11 17:00
多分こういう使い方だと思います。
コード:
public static void main(String[] args) throws Exception {
    String str = "2002/11/11";  //元の文字列

    //システムのデフォルトのDateFormatを獲得
    SimpleDateFormat df = (SimpleDateFormat)DateFormat.getDateInstance();
    df.applyPattern("yyyy/MM/dd"); //<- 日付のフォーマットを設定 

    //strをDateオブジェクトにparseする。strのフォーマットが間違っている場合
    //ParseExceptionが送出される。
    Date date = null;
    try {
        date = df.parse(str);
    } catch(ParseException ex) {
        System.out.println(str + " cannot be parsed.");
    }
    System.out.println(date);
}



手順としては、
1.SimpleDateFormatオブジェクトを作る。
2.applyPattern()で日付のフォーマットを指定する。
3.parse()メソッドで文字列をDate型にパーズする。もし、日付のフォーマットが指定したフォーマットと違うとParseExceptionが出るのでそれをキャッチする。

String str = "2002/11/11"; //元の文字列
を"2002-11-11"や"11/11/2002"に変えたりするとParseExceptionが出ます。

df.applyPattern("yyyy/MM/dd");
の中の文字列を変えるとフォーマットを変えられます。
例)df.applyPattern("yyyy年MM月dd日");
にすると、"2002年11月11日"などにも対応できます。

フォーマットに関してはJavadocを見てください。

スキルアップ/キャリアアップ(JOB@IT)