2015-10-08 2 views
8

デフォルトでは、メソッドのInstantDateTimeFormatter.ISO_INSTANTフォーマッタを使用します。固定のミリ秒桁のjava.time ISOの日付書式(Java 8以降)

2015-10-08T17:13:07.589Z 
    2015-10-08T17:13:07Z 

Joda-Time例(と私がjava.timeから期待):彼らは0

java-time例に起こる場合にフォーマッタは、分数の秒の桁が印刷されません。

2015-10-08T17:13:07.589Z 
    2015-10-08T17:13:07.000Z 

これは、一部のシステムで解析するのが本当に不愉快です。 Elasticsearchが私が遭遇した最初の問題でした。オプションのミリ秒をサポートする事前定義されたフォーマットはありませんが、おそらくカスタムフォーマットで回避することができます。デフォルトは間違っているようです。

とにかくインスタンス用の独自の書式文字列を実際に作成することはできないようです。私の独自のjava.time.format.DateTimeFormatterBuilder.InstantPrinterParserを実装する唯一のオプションはありますか?

+0

あなたの目標は、日付の精度がミリ秒かどうかを調べることです。 –

+0

目標は、ミリ秒が0に等しい場合でも、分数秒の部分で日付を書式設定することです。つまり、Jodaの動作を模倣します。 –

+1

クイックリマインダー:java.timeは、Joda-Timeおよびjava.util.Dateのミリ秒の解像度とは対照的に、[ナノ秒](https://en.wikipedia.org/wiki/Nanosecond)の解像度を提供します。これは、最大9桁の小数点以下2桁の意味です。したがって、3に制限すると、データが隠れている/失われている可能性があります。 [私のこの図](http://i.stack.imgur.com/OW0RW.png)を参照してください。 –

答えて

7

DateTimeFormatterを作成して小数点3桁をそのまま入力します。

DateTimeFormatter formatter = new DateTimeFormatterBuilder().appendInstant(3).toFormatter(); 

次に使用してください。たとえば、次のように

System.out.println(formatter.format(Instant.now())); 
System.out.println(formatter.format(Instant.now().truncatedTo(ChronoUnit.SECONDS))); 

...プリント(私はそれを実行時):class doc

2015-10-08T21:26:16.571Z 
2015-10-08T21:26:16.000Z 

抜粋:

... fractionalDigitsパラメータは、小数第二の出力を可能に制御されるべきである。ゼロを指定すると、小数点の桁は出力されません。 1から9までは、必要に応じてゼロの右パディングを使用して、桁数を増やして出力します。特別な値-1は、末尾のゼロを避けるために必要なだけ多くの数字を出力するために使用されます。 ...

関連する問題