アプリ版:「スタンプのみでお礼する」機能のリリースについて

文字列の日付妥当性チェックについて、SimpleDateFormat#parseをいままで使っていました。

先日、末尾が英字でも例外が発生しないことに気づきました。
途中に存在するともちろん例外が発生します。

例)
public static void main(String[] args) {
Date date = null;
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
sdf.setLenient(false);

try {
date = sdf.parse("2000011a"); // ←例外がスローされない。
// date = sdf.parse("200001a1"); ←例外がスローされる。
} catch (Exception e) {
System.out.println("exception");
return;
}
System.out.println(date);
}

末尾に英字があってもOKなのは仕様なのでしょうか?
このことがわかった後はparseの前にInteger.parseInt(date)を呼び出して、数字であることをチェックしてから日付妥当性を確認しています。

文字列を分割してCalenderクラスのgetTime()などで妥当性チェックを行うことも可能とは思いますが、どうにも納得できな挙動だったので質問させて頂きました。

グーグル先生に教えてもらおうとしたのですが、このことに触れられているサイトが見当たらず・・・ご存知の方がいらっしゃいましたら教えて頂けないでしょうか。

※JDKのバージョンは1.4と1.5で確認いたしました。

A 回答 (2件)

なんで「グーグル先生」なんだろう. ちゃんとしたところで調べればいいのに.



参考URL:http://java.sun.com/javase/ja/6/docs/ja/api/java …
    • good
    • 0
この回答へのお礼

お返事有難うございます。
教えて頂いたURLですが、なぜかエラーになってしまいました。
URLを見た感じだと1.6のjavadocのようですが、申し訳ありません。グーグル先生の前にjavadocも確認してはいるのですが、それらしい記述を見つけることができませんでした。

アドバイス頂いたようにもう一度javadocを見てみたのですが、やはりわかりませんでした。もう少し教えて頂けないでしょうか。

お礼日時:2011/06/11 01:24

あ, すみません, 勢い余って最後の l まで消しちゃいました.



んで勢いついでに調べてみたんですが
仕様
だと思われます. より正確にいうと, yyyyMMdd では数字を期待するので
文字列の先頭から調べていって「数字のみの部分」が OK っぽければ OK
という豪快な仕様でしょう. ちなみにこの場合, yyyy と MM はそれぞれ 4文字及び 2文字必要ですが最後の d は 1文字で十分だったりします.

ということで, "2000011a" を与えると
2000011
の部分を調べて 2000 01 1 と解析します. 一方 "200001a1" では
200001
の部分を調べたときに桁数が足りない (7桁必要なところ 6桁しかない) ので例外が飛ぶ, と. もちろん "2000011a+b=あれ?" とかでも OK です.

# 結局 Google に頼る (苦笑)

参考URL:http://d.hatena.ne.jp/masanobuimai/20070206
    • good
    • 0
この回答へのお礼

お返事有難うございます。
詳しく説明して頂いて有難うございました。とてもわかりやすかったです。
確かに豪快な仕様ですね(笑)。

参考URLもとても参考になりました。

これからは数値チェック等あわせて実装したいと思います。それなりにjavaを使っていたのですが、今まで気づかなかったのでとても勉強になりました。

お礼日時:2011/06/11 13:43

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!