- PR -

日付のチェックについて

投稿者投稿内容
みーちく
大ベテラン
会議室デビュー日: 2002/08/29
投稿数: 131
投稿日時: 2002-11-11 18:56
H2さん。

詳しい説明本当にありがとうございます。
すっごく助かります。
早速やってみたいと思います。

ありがとうございました。m(__)m
みーちく
大ベテラン
会議室デビュー日: 2002/08/29
投稿数: 131
投稿日時: 2002-11-12 10:20
みーちくです。

H2さんのソースを参考に作成してみたのですが、ありえない日付を入力してもエラーにはなりませんでした。
また、勘違いをしているのでしょうか。

コード:
import java.util.*;
import java.io.*;
import java.text.*;

class test8 {
 public static void main(String[] args) throws Exception{
  String str = "";
  System.out.println("日付を「/」区切りで入力して下さい");
  BufferedReader br  = new BufferedReader(new InputStreamReader(System.in));
  str = br.readLine();

  SimpleDateFormat df = (SimpleDateFormat)DateFormat.getDateInstance();
  df.applyPattern("yyyy/mm/dd");

  Date date = null;
  try{
   date = df.parse(str);
  } catch(ParseException ex) {
   System.out.println(str + " cannot be parsed.");
  }
  System.out.println(date);
 }
}




[出力結果]
日付を「/」区切りで入力して下さい
2002/30/10
Thu Jan 10 00:30:00 JST 2002

日付を「/」区切りで入力して下さい
2002/11/12
Sat Jan 12 00:11:00 JST 2002
kus
会議室デビュー日: 2002/11/12
投稿数: 2
お住まい・勤務地: 北海道
投稿日時: 2002-11-12 11:11
よこやり状態ですが。…。

H2さんは、
df.applyPattern("yyyy/MM/dd"); //<- 日付のフォーマットを設定

みーちくさんは、
df.applyPattern("yyyy/mm/dd");

大文字、小文字の違いで、「月」になるか「分」になるかの違いでしたね。
みーちく
大ベテラン
会議室デビュー日: 2002/08/29
投稿数: 131
投稿日時: 2002-11-12 11:40
kusさん

ありがとうございます。
きゃーはずかしいです。
ちゃんと確認すればよかったです。

ご指摘の通り、df.applyPattern("yyyy/MM/dd"); と修正したところ、「月」になりました。が、やはり、エラーとはなりませんでした。

【出力結果】
日付を「/」区切りで入力して下さい
2002/30/10
Thu Jun 10 00:00:00 JST 2004

日付を「/」区切りで入力して下さい
2002/11/12
Tue Nov 12 00:00:00 JST 2002


Dandan
常連さん
会議室デビュー日: 2002/01/17
投稿数: 25
投稿日時: 2002-11-12 11:52
こんにちわ、

私もJDK1.3なんでそういうメソッドを作成したりします。
H2さんのコードの場合、

コード:
String str = "2002/1/41";



も例外が起きずParseされてしまいます。(例は2002年2月10日に)
厳密に日付文字列の入力チェックを行なうときは、私は次のメソッドを使っています。
まぁ、好きなものを使ってもらうのがよいかなーと。

コード:
import java.util.Date;
import java.text.*;

/**
 * 日付のフォーマットチェック
 * 日付がyyyy/MM/ddの形式を取っているかをチェックする
 *
 * @param   strDate 日付のString表現
 * @throws  ParseException 日付のフォーマットに不正がある場合
 * @return  入力された日付のDate表現
 */
private Date parseFormatedDate(String strDate) throws ParseException {
   // yyyy/MM/dd フォーマットの日付の作成
   SimpleDateFormat sdf = new SimpleDateFormat(
                                   "yyyy/MM/dd",
                                    new DateFormatSymbols());

   // 文字列を日付変換
   Date d = sdf.parse(strDate);

   // もし、入力値と出力値が異なる場合は例外を発生する。
   if (!strDate.equals(sdf.format(d))) {
      throw new ParseException(
         "日付の変換エラー、厳密なyyyy/MM/dd形式ではありません",
         strDate.length());
   }
   return d;
}


まぁ、上記の場合ゼロサプレスでも例外が発生するので、
"yyyy/M/d"あたりが良いかもしれませんが。
ふくみみ
会議室デビュー日: 2002/11/12
投稿数: 1
投稿日時: 2002-11-12 13:02
はじめて、書きこみます、ふくみみと申します。

話題になっている不正な日付だけど、エラーにならない件ですが、
以下のメソッドを使用すれば、例外を発生するようになります。(13月や32日を許さない)
sdf.setLenient(false);

では では〜。
Dandan
常連さん
会議室デビュー日: 2002/01/17
投稿数: 25
投稿日時: 2002-11-12 13:24
ふくみみさん、

どもです。
親クラス(DateFormat)のメソッド、見てませんでした
ありがとうございます。
#恥を承知で書いてよかった…
みーちく
大ベテラン
会議室デビュー日: 2002/08/29
投稿数: 131
投稿日時: 2002-11-12 18:15
みーちくです。

ふくみみさん。Dandanさん。
いろいろありがとうございました。

実際はsetLenientを使用してチェックをしております。
ですが、このスレッドにも書いてありますが、ソースが長くなってしまいました。
java.text.SimpleDateFormatの使用方法がよくわからなかったので、いろいろ質問をしておりました。

皆様。ご意見ありがとうございました。
本当に勉強になりました。

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