回答編集履歴

1

ParsePosition使用

2016/12/12 17:26

投稿

swordone
swordone

スコア20651

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