日時管理に関するさまざまなコードの組み合わせをJava 8 java.time
名前空間にクリーンアップしようとしています。今私はInstant
のデフォルトDateTimeFormatter
の小さな問題があります。 DateTimeFormatter.ISO_INSTANT
フォーマッタは、ゼロに等しくない場合にのみミリ秒を表示します。java.time.DateTimeFormatter:常にミリ秒をレンダリングするISO_INSTANTが必要です
エポックは、1970-01-01T00:00:00.000Z
の代わりに1970-01-01T00:00:00Z
と表示されます。
私は問題を説明するためにユニットテストを行い、最終的な日付をどのようにして相互に比較する必要があるのですか。
@Test
public void java8Date() {
DateTimeFormatter formatter = DateTimeFormatter.ISO_INSTANT;
String epoch, almostEpoch, afterEpoch;
{ // before epoch
java.time.Instant instant = java.time.Instant.ofEpochMilli(-1);
almostEpoch = formatter.format(instant);
assertEquals("1969-12-31T23:59:59.999Z", almostEpoch);
}
{ // epoch
java.time.Instant instant = java.time.Instant.ofEpochMilli(0);
epoch = formatter.format(instant);
// This fails, I get 1970-01-01T00:00:00Z instead
assertEquals("1970-01-01T00:00:00.000Z", epoch);
}
{ // after epoch
java.time.Instant instant = java.time.Instant.ofEpochMilli(1);
afterEpoch = formatter.format(instant);
assertEquals("1970-01-01T00:00:00.001Z", afterEpoch);
}
// The end game is to make sure this rule is respected (this is how we order things in dynamo):
assertTrue(epoch.compareTo(almostEpoch) > 0);
assertTrue(afterEpoch.compareTo(epoch) > 0); // <-- This assert would also fail if the second assert fails
{ // to confirm we're not showing nanos
assertEquals("1970-01-01T00:00:00.000Z", formatter.format(Instant.EPOCH.plusNanos(1)));
assertEquals("1970-01-01T00:00:00.001Z", formatter.format(Instant.EPOCH.plusNanos(1000000)));
}
}
デフォルトの書式は、ゼロと異なる場合にのみナノ秒をレンダリングします。なぜなら、常にミリ秒(ナノセコンドではない)を使いたいのであれば、 'DateTimeFormatter formatter = DateTimeFormatter.ofPattern(" yyyy-MM-dd'T'HH:mm:ss.SSSX ")のようなカスタムフォーマッタを使わないだけです.Zone(ZoneId ( "UTC"));? – mihi
私は 'Instant :: toString()'で使われたフォーマッタに可能な限り近づきたいと思っていました。たぶん、文字列パターンを使っているはずです。 – Florent