2017-02-23 17 views
-2
public static void main(String[] args) { 
     Date now = new Date(); 

     String dateString = now.toString(); 
     System.out.println(" 1. " + dateString); 

     SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy"); 

     try { 
      Date parsed = format.parse(dateString); 
      System.out.println(" 2. " + parsed.toString()); 
     } catch (ParseException pe) { 
      System.out.println("ERROR: Cannot parse \"" + dateString + "\""); 
     } 

     System.out.println(" 3. " + format.format(now)); 
    } 

コンソールでの印刷:java SimpleDateFormat?

1. Thu Feb 23 17:14:51 CET 2017 
ERROR: Cannot parse "Thu Feb 23 17:14:51 CET 2017" 
3. jeu. févr. 23 05:14:51 CET 2017 

の代わりには:

1. Thu Feb 23 17:14:51 CET 2017 
2. Thu Feb 23 17:14:51 CET 2017 
3. jeu. févr. 23 05:14:51 CET 2017 
+2

3はシステムロケールがフランス語であることを示します。したがって、 "Thu Feb"はフランス語名のみを想定しているため、フォーマッタは認識しません。 – Thomas

+2

Bonjour、古いスタイルのクラス「Date」と「SimpleDateFormat」をまだ使用している理由はありますか? 'java.time'の新しいクラス(Java 8以降)は、デフォルトのフォーマットとロケールについて同意する' toString'メソッドと 'parse'メソッドを持っていますので、このような問題を解決します。 –

答えて

3

それはあなたのデフォルトLocaleFRENCHあるように見える、とあなたは別のものを指定しない場合SimpleDateFormatいるので、あなたがそれを使用していますThuまたはFebのような英語のabreviationsを正常に解析できません。

SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ENGLISH); 
0

あなたはJavaで今時代遅れDateクラスの多くの病気の一つに実行した:

ただし、このようなENGLISHLocaleの使用を指定することができます。

音と簡単な修正は、Java 8の日付と時刻のクラスに切り替えることです。 Dateに最もよく対応する新しいクラスはInstantです。このクラスでは、あなたのコードは次のようになります。私はあなたの例から3.を残している

Instant now = Instant.now(); 

    String dateString = now.toString(); 
    System.out.println(" 1. " + dateString); 

    try { 
     Instant parsed = Instant.parse(dateString); 
     System.out.println(" 2. " + parsed.toString()); 
    } catch (DateTimeParseException e) { 
     System.out.println("ERROR: Cannot parse \"" + dateString + "\""); 
    } 

。もちろん、Instantをあなたが夢見ることのできる方法でフォーマットすることは可能ですが、私たちがtoStringの方法と同じ出力をしたいのであれば、今のところ価値がありません。むしろ、私は、この場合はフォーマットを一切必要としないことを示したいと思います。コードが印刷されます:

1. 2017-02-23T17:07:19.775Z 
2. 2017-02-23T17:07:19.775Z 

時刻がUTCで表示されます。代わりにローカルタイムゾーンを使用する場合は、Instantの代わりにZonedDateTimeを使用してください。コードの残りの部分はまったく同じですが、今私のコンピュータ上の出力は次のとおりです。もちろん

1. 2017-02-23T18:07:19.852+01:00[Europe/Berlin] 
2. 2017-02-23T18:07:19.852+01:00[Europe/Berlin] 

あなたが新しいクラスでもロケールを不同意から得るもののようにエラーを発生させることが可能です。私が見る限り、あなたは明示的に不同意なロケールを指定する必要があります。だからあなたはそれを簡単にやっていない。