2017-05-18 6 views
2

//そこに私のコードJavaのSimpleDateFormatの解析文字列のエラー

public static void main(String[] args) { 

    String a = "19900416000000"; 
    String b = "19900415000000"; 
    DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss"); 
    df.setLenient(false); 

    try { 
     df.parse(a); 
    } catch (ParseException e) { 
     System.out.println("a parse error"); 
     e.printStackTrace(); 
    } 

    try { 
     df.parse(b); 
    }catch (ParseException e){ 
     System.out.println("b parse error"); 
     e.printStackTrace(); 
    } 

//があると私はエラーを取得するには、だから、この

b parse error 
java.text.ParseException: Unparseable date: "19900415000000" 
    at java.text.DateFormat.parse(DateFormat.java:366) 
    at org.suanhua.elasticsearch.client.ETLTest.main(ETLTest.java:179) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140) 

のように、aとbの間に異なるは何ですか?なぜparse(b)がエラーになるのですか?

//私のインポート

import java.text.DateFormat; 
import java.text.ParseException; 
import java.text.SimpleDateFormat; 

//あなたの問題は、タイムゾーン関連のようですIntelliJの

+1

1990 - yyyy 04 - MM 16 - dd 00 - HH 00 - mm 00 - ss – Bowie

+2

あなたのコードでコンパイルしました。エラーはありません – htpvl

+2

kimdungと同じです。蘭コード。エラーはありません。再現できません。 – Andreas

答えて

4

下jdk8使用があります。

jdk1.8.0_91インストールですべてのタイムゾーンをテストします。あなたのデフォルトのタイムゾーンは、これらのいずれかであるならばそれは時間夏時間たとして1990年4月15日の深夜には、存在しないため、

String a = "19900416000000"; 
String b = "19900415000000"; 
DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss"); 
df.setLenient(false); 

for (String id : TimeZone.getAvailableIDs()) { 
    df.setTimeZone(TimeZone.getTimeZone(id)); 
    try { 
     df.parse(a); 
    } catch (ParseException e) { 
     System.out.println(id + ": " + e); 
    } 
    try { 
     df.parse(b); 
    } catch (ParseException e) { 
     System.out.println(id + ": " + e); 
    } 
} 

出力

Asia/Chongqing: java.text.ParseException: Unparseable date: "19900415000000" 
Asia/Chungking: java.text.ParseException: Unparseable date: "19900415000000" 
Asia/Harbin: java.text.ParseException: Unparseable date: "19900415000000" 
Asia/Shanghai: java.text.ParseException: Unparseable date: "19900415000000" 
PRC: java.text.ParseException: Unparseable date: "19900415000000" 
CTT: java.text.ParseException: Unparseable date: "19900415000000" 

が、それは失敗します開始、すなわち真夜中に時計は午前1時に設定されていたので、真夜中は存在しませんでした。

+1

ブリリアント、中華人民共和国は1986年からDSTを実験したが、1992年以降DSTを放棄した。 PRCでは現在、全国で1つのタイムゾーン(UTC + 8)が使用されています。 https://www.timeanddate.com/time/change/china/beijing?year=1990 – AMB

+0

ありがとうございました!問題は長い間私を悩ませている – Bowie

1

Very well spotted, Andreas

FWIW、ボウイ、新しい日付と時刻のクラスあなたのJDK 8は、文字列を解析し、例

1990-04-16T00:00+09:00[Asia/Chongqing] 
1990-04-15T01:00+09:00[Asia/Chongqing] 

のためにあなたを与えることができますが、2番目の文字列は、それが中に00を言った時間の01を持って気づくでしょう入力文字列。 (:dtfの追加作成編集):私は次のように使用

 DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); 
     System.out.println(LocalDateTime.parse(b, dtf) 
           .atZone(ZoneId.of("Asia/Chongqing"))); 

あなたはちょうどあなたがZoneId.systemDefault()を使用して、コンピュータのデフォルトのタイムゾーンが必要な場合。

いずれにしても、JDK 8を使用しているため、古くなったクラスSimpleDateFormatとフレンドを守っている理由はありますか?新しいクラスは一般的には動作する方がはるかに良いです。

サマータイムの隙間に入る日時をキャッチする必要がある場合は、それを特別に処理する必要があります。たとえば、LocalDateTimeに変換して、解析したものと同じものが得られるかどうかを確認します。

PS私はまだ十分な説明ができません。アンドレアスが言及しているタイムゾーンの1つにCTTがあります。私はこのことを中国の台湾時間という意味で使っていますので、アジア/台北と同じであると思っていました。しかし、後者をコードに入れると、1990-04-15T00:00+08:00[Asia/Taipei]つまり00時間となるので、ここでは深夜0時が存在します。他の5つのタイムゾーンではAndreasが言いますが、私は01時間を取得します。

+0

私はJDK 1.8 APIをチェックアウトします、ありがとう – Bowie