2016-06-16 14 views
0

現在の時刻を取得するためにZonedDateTime.now(ZoneOffset.UTC).toString()を使用しようとしています。それはうまく動作しますが、ロールオーバー(00.000Z)のときに秒/ミリ秒単位で切断されているように見えます。通常は問題ではありませんが、ElasticSearchにデータを書き込んでいます。ElasticSearchには、渡した日付(取得時刻)の厳密なマッピングがあります。Java 8 ZonedDateTime

私は何が起こっているのかと思っているかもしれませんが、いつも秒とミリ秒で日付/時刻を提供できるようにしたいと考えています。

Basicのコードスニペット(最初のパスは、ミリ秒を追加することでしたが、秒もおそらく取り残される可能性が表示されます):

def utcDate = ZonedDateTime.now(ZoneOffset.UTC) 
def utcDateStr = utcDate.toString() 
utcDateStr = utcDateStr.contains(".") ? utcDateStr 
     : utcDateStr.replace("Z","").concat(".000Z") 

それはほとんど常にある、それは以下の形式になりたいです

2016-06-16T05:43:07.624Z 
+0

'toString()を呼び出すと秒/ミリ秒を切り捨てると言うなら、もっと明確になります。そうでなければ' now() 'のように聞こえます。 –

+0

ああ、良い点@JonSkeet。あなたは正しいです、私は質問を編集/修正します – scarpacci

答えて

4

まず、Instantではなく、画像のタイムゾーン部分を完全に取り除くZonedDateTimeがほしいと思うようです。しかしどちらの方法でも、値をフォーマットするには、DateTimeFormatterを使用してください。

それはあなたのような何かをしたいように聞こえる(Javaで、適切なGroovyに調整):

DateTimeFormatter formatter = DateTimeFormatter 
    .ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US) 
    .withZone(ZoneOffset.UTC); 
Instant now = Instant.now(); 
String text = formatter.format(now); 
System.out.println(text); 

ことでしょう、それはあなたが本当にしたい場合は(0

だ場合でも、まだ出力ミリ秒の値しかし、同じフォーマッタを使っても構いませんが、概念的には、表現しようとしているのはただちに瞬間になります。

+0

もっと一般的な 'yyyy'より' uuuu'を選択した特別な理由はありますか? – shmosel

+0

@shmosel:当初は、 'yyyy'が動作しなかったためです。時間帯を設定していない私のせいで、「uuuu」もなかった...とにかく、「yyyy」は1905年と1905年の間に "1905"が実際にあいまいであることを意味する時代です。問題になる可能性は低いですが、ちょうど「年」はIMOのほうが少しきれいです。 –

0

あなたが行きたい場合は、ZonedDateTimeを使用してください。フォーマッタのルート、あなたそうようなものを構築することができ:

DateTimeFormatter ES_ISO8601_FORMATTER = new DateTimeFormatterBuilder() 
      .parseCaseInsensitive() 
      .append(
        new DateTimeFormatterBuilder() 
          .parseCaseInsensitive() 
          .append(ISO_LOCAL_DATE) 
          .appendLiteral('T') 
          .append(
            new DateTimeFormatterBuilder() 
              .appendValue(HOUR_OF_DAY, 2) 
              .appendLiteral(':') 
              .appendValue(MINUTE_OF_HOUR, 2) 
              .appendLiteral(':') 
              .appendValue(SECOND_OF_MINUTE, 2) 
              .appendFraction(NANO_OF_SECOND, 3, 9, true) 
              .toFormatter() 
          ) 
          .toFormatter() 
      ) 
      .appendOffsetId() 
      .toFormatter(); 

を、変化は基本的に

3の最小幅

         .appendFraction(NANO_OF_SECOND, 3, 9, true) 
を与えている

(つまりは、Java 8てDateTimeFormatterクラスのコードから一緒に石畳です)元のISOフォーマッタで0の代わりに

関連する問題