文字列の日付妥当性チェックについて、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で確認いたしました。
No.1
- 回答日時:
お返事有難うございます。
教えて頂いたURLですが、なぜかエラーになってしまいました。
URLを見た感じだと1.6のjavadocのようですが、申し訳ありません。グーグル先生の前にjavadocも確認してはいるのですが、それらしい記述を見つけることができませんでした。
アドバイス頂いたようにもう一度javadocを見てみたのですが、やはりわかりませんでした。もう少し教えて頂けないでしょうか。
No.2ベストアンサー
- 回答日時:
あ, すみません, 勢い余って最後の 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
お返事有難うございます。
詳しく説明して頂いて有難うございました。とてもわかりやすかったです。
確かに豪快な仕様ですね(笑)。
参考URLもとても参考になりました。
これからは数値チェック等あわせて実装したいと思います。それなりにjavaを使っていたのですが、今まで気づかなかったのでとても勉強になりました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 英語 to date 2 2023/05/23 23:22
- Access(アクセス) ExcelのVBAコードについて教えてください。 4 2023/01/20 09:44
- Excel(エクセル) エクセルVBA、ファイル名をセルの値で保存の方法を教えてください。 おそれいります。こちらで数々のエ 6 2023/06/30 22:17
- PHP SQLとPHPの連結方法がわからないのでアドバイスお願い致します 1 2022/07/12 12:16
- その他(プログラミング・Web制作) python 気象データの取得 2 2023/06/20 23:54
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
- Excel(エクセル) Excel2019、2021の日付、曜日の表示について 2 2022/11/29 15:01
- Visual Basic(VBA) 【VBA】先月分の取得ができない理由が分かりません。 2 2022/04/24 11:16
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- Visual Basic(VBA) マクロについて教えてください。 1 2023/06/06 00:57
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「タイプ初期化子が例外をスロ...
-
文字列が数字のみで構成されて...
-
0除算の例外処理ができない!!...
-
getActionCommand() とgetText(...
-
java 文字列の部分一致について
-
Javaの例外 IllegalArgumentExc...
-
基本的にはないと言われました
-
VBA Evaluate関数 型が一致しま...
-
C#の捕捉されない例外処理の対...
-
C# UriFormatExceptionの回避
-
時間の取得
-
連続する「\\」をひとつの「\\...
-
ブックマークレットについて
-
nullで、return出来るのはどん...
-
PHPのpack関数をJavaで実装でき...
-
VBA 400エラー 1004エラー
-
ファイルダイアログを開いた時...
-
【JSPがブラウザで表示されませ...
-
数字か文字列かを判定する関数
-
全角スペースのチェックについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「タイプ初期化子が例外をスロ...
-
【JAVA】与えられた金額を貨幣...
-
連続する「\\」をひとつの「\\...
-
文字列からダブルクオートの削除
-
VB.Net Object型 空かどうか
-
0除算の例外処理ができない!!...
-
VB.NETで16進数が正しいかどう...
-
数字か文字列かを判定する関数
-
例外ってIf文の中に入れますか...
-
C# マルチスレッドにおける例外...
-
スタックオーバーフローとは?
-
String型の日付(2005/11/25)の...
-
Timestamp型への変換について(J...
-
C# UriFormatExceptionの回避
-
VBA Evaluate関数 型が一致しま...
-
ADOによるレコードの追加/更新
-
時間の取得
-
WebClient()以外でネットにアク...
-
C#の捕捉されない例外処理の対...
-
タトゥーや墨を入れる人の共通点
おすすめ情報