8071919: Add java.time.Clock.tickMillis(ZoneId zone) method
Reviewed-by: dfuchs, rriggs, scolebourne
--- a/jdk/src/java.base/share/classes/java/time/Clock.java Tue Nov 17 10:44:22 2015 -0500
+++ b/jdk/src/java.base/share/classes/java/time/Clock.java Tue Nov 17 11:06:46 2015 -0500
@@ -65,7 +65,7 @@
import java.io.ObjectInputStream;
import static java.time.LocalTime.NANOS_PER_MINUTE;
import static java.time.LocalTime.NANOS_PER_SECOND;
-
+import static java.time.LocalTime.NANOS_PER_MILLI;
import java.io.Serializable;
import java.util.Objects;
import java.util.TimeZone;
@@ -182,7 +182,7 @@
}
/**
- * Obtains a clock that returns the current instant using best available
+ * Obtains a clock that returns the current instant using the best available
* system clock.
* <p>
* This clock is based on the best available system clock.
@@ -206,8 +206,32 @@
//-------------------------------------------------------------------------
/**
+ * Obtains a clock that returns the current instant ticking in whole milliseconds
+ * using the best available system clock.
+ * <p>
+ * This clock will always have the nano-of-second field truncated to milliseconds.
+ * This ensures that the visible time ticks in whole milliseconds.
+ * The underlying clock is the best available system clock, equivalent to
+ * using {@link #system(ZoneId)}.
+ * <p>
+ * Implementations may use a caching strategy for performance reasons.
+ * As such, it is possible that the start of the millisecond observed via this
+ * clock will be later than that observed directly via the underlying clock.
+ * <p>
+ * The returned implementation is immutable, thread-safe and {@code Serializable}.
+ * It is equivalent to {@code tick(system(zone), Duration.ofMillis(1))}.
+ *
+ * @param zone the time-zone to use to convert the instant to date-time, not null
+ * @return a clock that ticks in whole milliseconds using the specified zone, not null
+ */
+ public static Clock tickMillis(ZoneId zone) {
+ return new TickClock(system(zone), NANOS_PER_MILLI);
+ }
+
+ //-------------------------------------------------------------------------
+ /**
* Obtains a clock that returns the current instant ticking in whole seconds
- * using best available system clock.
+ * using the best available system clock.
* <p>
* This clock will always have the nano-of-second field set to zero.
* This ensures that the visible time ticks in whole seconds.
@@ -230,7 +254,7 @@
/**
* Obtains a clock that returns the current instant ticking in whole minutes
- * using best available system clock.
+ * using the best available system clock.
* <p>
* This clock will always have the nano-of-second and second-of-minute fields set to zero.
* This ensures that the visible time ticks in whole minutes.
--- a/jdk/src/java.base/share/classes/java/time/LocalTime.java Tue Nov 17 10:44:22 2015 -0500
+++ b/jdk/src/java.base/share/classes/java/time/LocalTime.java Tue Nov 17 11:06:46 2015 -0500
@@ -190,9 +190,13 @@
*/
static final long MICROS_PER_DAY = SECONDS_PER_DAY * 1000_000L;
/**
+ * Nanos per millisecond.
+ */
+ static final long NANOS_PER_MILLI = 1000_000L;
+ /**
* Nanos per second.
*/
- static final long NANOS_PER_SECOND = 1000_000_000L;
+ static final long NANOS_PER_SECOND = 1000_000_000L;
/**
* Nanos per minute.
*/
--- a/jdk/test/java/time/tck/java/time/TCKClock_Tick.java Tue Nov 17 10:44:22 2015 -0500
+++ b/jdk/test/java/time/tck/java/time/TCKClock_Tick.java Tue Nov 17 11:06:46 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -160,6 +160,17 @@
}
//-----------------------------------------------------------------------
+ public void test_tickMillis_ZoneId() throws Exception {
+ Clock test = Clock.tickMillis(PARIS);
+ assertEquals(test.getZone(), PARIS);
+ assertEquals(test.instant().getNano() % 1000_000, 0);
+ }
+
+ @Test(expectedExceptions = NullPointerException.class)
+ public void test_tickMillis_ZoneId_nullZoneId() {
+ Clock.tickMillis(null);
+ }
+ //-----------------------------------------------------------------------
public void test_tickSeconds_ZoneId() throws Exception {
Clock test = Clock.tickSeconds(PARIS);
assertEquals(test.getZone(), PARIS);