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");
   }
 }