teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

ParsePosition使用

2016/12/12 17:26

投稿

swordone
swordone

スコア20675

answer CHANGED
@@ -1,1 +1,26 @@
1
- ②だけで駄目な理由は何でしょう?
1
+ ②だけで駄目な理由は何でしょう?
2
+
3
+ ---
4
+
5
+ [ParsePosition](https://docs.oracle.com/javase/jp/8/docs/api/java/text/ParsePosition.html)オブジェクトを作っておくのがいいでしょう。parseメソッドはこのParsePositionオブジェクトを内部で作成しており、解析後このオブジェクトがもつ解析位置が0(つまり解析エラーが発生した)の時、ParseExceptionが発生する仕組みになっています。
6
+ ParsePositionは解析位置のほか、エラー発生位置も保持します。この数値から、何が原因でエラーになったかある程度分類することができます。
7
+ ```java
8
+ public static void main(String[] args) {
9
+ DateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss z");
10
+ sdf.setLenient(false);
11
+ String target = "2016/12/12 12:12:12 UTC*9:00";
12
+ ParsePosition pos = new ParsePosition(0);
13
+ Date date = sdf.parse(target, pos);
14
+ //インデックスが文字列長と一致しなければ、何らかの不具合
15
+ if (pos.getIndex() != target.length()) {
16
+ //エラーインデックスが文字列長と同じなら、最後まで解析できたものの厳密に解釈してありえない日時だった
17
+ if (pos.getErrorIndex() == target.length()) {
18
+ System.out.println("日時エラーです。");
19
+ //それ以外は、途中で解析不能な文字が紛れた、あるいは途中で解析が終了して文末を解析しなかった
20
+ } else {
21
+ System.out.println("フォーマットエラーです。");
22
+ }
23
+ }
24
+ }
25
+ ```
26
+ ちなみに、DateFormat系ではUTC+9:00のようなタイムゾーン指定はできません。GMT+9:00のように、GMTでないといけません。UTC+9:00と書いても、UTCまでで解析が終了し、UTCタイムゾーンと解釈されます。