Fix test.xml timestamps to produce ISO8601 irrespective of locale
RELNOTES: None.
PiperOrigin-RevId: 257465060
diff --git a/src/java_tools/junitrunner/java/com/google/testing/junit/runner/model/TestInterval.java b/src/java_tools/junitrunner/java/com/google/testing/junit/runner/model/TestInterval.java
index e2ab8fc..29abdc4 100644
--- a/src/java_tools/junitrunner/java/com/google/testing/junit/runner/model/TestInterval.java
+++ b/src/java_tools/junitrunner/java/com/google/testing/junit/runner/model/TestInterval.java
@@ -15,9 +15,8 @@
package com.google.testing.junit.runner.model;
import com.google.testing.junit.runner.util.TestClock.TestInstant;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.Date;
+import java.time.format.DateTimeFormatter;
+import java.util.Locale;
import java.util.TimeZone;
/**
@@ -26,6 +25,9 @@
* <p>This class is thread-safe and immutable.
*/
public final class TestInterval {
+
+ private static final DateTimeFormatter ISO8601_WITH_MILLIS_FORMATTER =
+ DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSXXX");
private final TestInstant startInstant;
private final TestInstant endInstant;
@@ -55,15 +57,16 @@
public String startInstantToString() {
// Format as ISO8601 string
- return startInstantToString(TimeZone.getDefault());
+ return startInstantToString(TimeZone.getDefault(), Locale.getDefault());
}
- /** Exposed for testing because java Date does not allow setting of timezones. */
+ /** Exposed for testing because java Date does not allow setting of timezones and locale. */
// VisibleForTesting
- String startInstantToString(TimeZone tz) {
- DateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
- format.setTimeZone(tz);
- return format.format(Date.from(startInstant.wallTime()));
+ String startInstantToString(TimeZone tz, Locale locale) {
+ return ISO8601_WITH_MILLIS_FORMATTER
+ .withZone(tz.toZoneId())
+ .withLocale(locale)
+ .format(startInstant.wallTime());
}
/** Returns a TestInterval that contains both TestIntervals passed as parameter. */
diff --git a/src/java_tools/junitrunner/javatests/com/google/testing/junit/runner/model/TestIntervalTest.java b/src/java_tools/junitrunner/javatests/com/google/testing/junit/runner/model/TestIntervalTest.java
index 70b70f0..8afa347 100644
--- a/src/java_tools/junitrunner/javatests/com/google/testing/junit/runner/model/TestIntervalTest.java
+++ b/src/java_tools/junitrunner/javatests/com/google/testing/junit/runner/model/TestIntervalTest.java
@@ -21,6 +21,7 @@
import java.time.Duration;
import java.time.Instant;
import java.util.Date;
+import java.util.Locale;
import java.util.TimeZone;
import org.junit.Rule;
import org.junit.Test;
@@ -86,9 +87,13 @@
TestInterval interval =
new TestInterval(
testInstant(date.toInstant()), testInstant(date.toInstant().plusMillis(100)));
- assertThat(interval.startInstantToString(TimeZone.getTimeZone("America/New_York")))
+ assertThat(interval.startInstantToString(TimeZone.getTimeZone("America/New_York"), Locale.US))
.isEqualTo("2016-08-20T12:15:34.000-04:00");
- assertThat(interval.startInstantToString(TimeZone.getTimeZone("GMT")))
+ assertThat(interval.startInstantToString(TimeZone.getTimeZone("GMT"), Locale.UK))
.isEqualTo("2016-08-20T16:15:34.000Z");
+ assertThat(
+ interval.startInstantToString(
+ TimeZone.getTimeZone("Asia/Bangkok"), new Locale("th", "TH")))
+ .isEqualTo("2016-08-20T23:15:34.000+07:00");
}
}