2017-02-02 9 views
0

ている私は、ファイルシステムから日付を解析し、この形式でそれらを取得したい:のSimpleDateFormat解析結果が奇数

2013-07-29 14:49:53.813588954 +0200 

は、したがって、私のパターンは、この

yyyy-MM-dd HH:mm:ss.SSSSSSSSS Z 

そして最後に私のコードのようになります。

String rawDate = "2013-07-29 14:49:53.813588954 +0200"; 

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSSSSS Z"); 
Date date = sdf.parse(rawDate); 

SimpleDateFormat out = new SimpleDateFormat("yyyy-MM-dd HH:mm"); 
String parsedDate = out.format(date); 

System.out.println(rawDate + " -> " + parsedDate); 

出力は次のようになります。

2013-07-29 14:49:53.813588954 +0200 -> 2013-08-08 00:49:41.000000954 +0200 

私はsetLenient(false)で試したこともありますが、ParseExceptionが発生しました。

+0

コードを実行しました。私は出力を得ています:2013-07-29 14:49:53.813588954 +0200 - > 2013-08-08 04:19(私はこれが期待されていると思います) –

+0

出力については確かですか?理想のあなたのコード:https://ideone.com/uOehey –

答えて

4

813588954をミリ秒数として解析しました。これは9日以上経過しており、2013-07-29 14:49:53に追加されています。

基本的に、SimpleDateFormatはナノ秒の解析を処理せず、java.util.Dateはミリ秒の精度しかサポートしません。

(おそらく)Java 8を使用する場合は、java.timeをすべて使用することをおすすめします。java.util.Dateはまったく使用しないでください。構文解析にjava.timeを使用できますが、それ以外の場合はjava.util.Dateを使用する必要がある場合は、少なくとも役立ちます。

Java 8をまったく使用できない場合は、文字列を手動で変更してナノ秒をミリ秒に切り捨て、SimpleDateFormatのパターンを使用して.SSSを解析することをお勧めします。

0

53.813588954は、53秒と813588954ミリ秒と813588954ミリ秒が約9日間であることを意味するためです。 2番目の出力(つまりparsedDate)で書式設定を行うと、Javaは自動的に秒 - >分 - >時 - >日 - >月 - >年の順番で切り上げられます。

1

ナノ秒の解析は、Java 8のDateTimeFormatterでサポートされています。このためにパターンを更新する必要があります。

String rawDate = "2013-07-29 14:49:53.813588954 +0200"; 
DateTimeFormatter rawDateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.nnnnnnnnn Z"); 
ZonedDateTime zonedDateTime = ZonedDateTime.parse(rawDate, rawDateFormatter); 
System.out.println(zonedDateTime); // prints 2013-07-29T14:49:53.813588954+02:00 

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); 
System.out.println(zonedDateTime.format(formatter)); // prints 2013-07-29 14:49 
関連する問題