Index: trunk/src/org/openstreetmap/josm/io/ChangesetClosedException.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/ChangesetClosedException.java	(revision 17839)
+++ trunk/src/org/openstreetmap/josm/io/ChangesetClosedException.java	(revision 17840)
@@ -4,10 +4,10 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
-import java.text.ParseException;
-import java.util.Date;
+import java.time.Instant;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 import org.openstreetmap.josm.tools.Logging;
+import org.openstreetmap.josm.tools.UncheckedParseException;
 import org.openstreetmap.josm.tools.date.DateUtils;
 
@@ -66,5 +66,5 @@
     private long changesetId;
     /** the date on which the changeset was closed */
-    private Date closedOn;
+    private Instant closedOn;
     /** the source */
     private Source source;
@@ -76,6 +76,6 @@
             changesetId = Long.parseLong(m.group(1));
             try {
-                closedOn = DateUtils.newOsmApiDateTimeFormat().parse(m.group(2));
-            } catch (ParseException ex) {
+                closedOn = DateUtils.parseInstant(m.group(2));
+            } catch (UncheckedParseException ex) {
                 Logging.error(tr("Failed to parse date ''{0}'' replied by server.", m.group(2)));
                 Logging.error(ex);
@@ -129,9 +129,9 @@
      * @param source the source for the exception
      */
-    public ChangesetClosedException(long changesetId, Date closedOn, Source source) {
+    public ChangesetClosedException(long changesetId, Instant closedOn, Source source) {
         super("");
         this.source = source == null ? Source.UNSPECIFIED : source;
         this.changesetId = changesetId;
-        this.closedOn = DateUtils.cloneDate(closedOn);
+        this.closedOn = closedOn;
     }
 
@@ -150,6 +150,6 @@
      * @return the date the changeset was closed. May be null if the date isn't known.
      */
-    public Date getClosedOn() {
-        return DateUtils.cloneDate(closedOn);
+    public Instant getClosedOn() {
+        return closedOn;
     }
 
Index: trunk/src/org/openstreetmap/josm/tools/ExceptionUtil.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/ExceptionUtil.java	(revision 17839)
+++ trunk/src/org/openstreetmap/josm/tools/ExceptionUtil.java	(revision 17840)
@@ -11,9 +11,9 @@
 import java.net.URL;
 import java.net.UnknownHostException;
-import java.text.DateFormat;
-import java.text.ParseException;
+import java.time.Instant;
+import java.time.ZoneId;
+import java.time.format.FormatStyle;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.Date;
 import java.util.List;
 import java.util.Objects;
@@ -398,8 +398,8 @@
             if (m.matches()) {
                 long changesetId = Long.parseLong(m.group(1));
-                Date closeDate = null;
+                Instant closeDate = null;
                 try {
-                    closeDate = DateUtils.newOsmApiDateTimeFormat().parse(m.group(2));
-                } catch (ParseException ex) {
+                    closeDate = DateUtils.parseInstant(m.group(2));
+                } catch (UncheckedParseException ex) {
                     Logging.error(tr("Failed to parse date ''{0}'' replied by server.", m.group(2)));
                     Logging.error(ex);
@@ -415,5 +415,5 @@
                             +" because it has already been closed on {1}.",
                             changesetId,
-                            DateUtils.formatDateTime(closeDate, DateFormat.DEFAULT, DateFormat.DEFAULT)
+                            formatClosedOn(closeDate)
                     );
                 }
@@ -445,6 +445,10 @@
                 +"because it has already been closed on {1}.",
                 e.getChangesetId(),
-                e.getClosedOn() == null ? "?" : DateUtils.formatDateTime(e.getClosedOn(), DateFormat.DEFAULT, DateFormat.DEFAULT)
+                e.getClosedOn() == null ? "?" : formatClosedOn(e.getClosedOn())
         );
+    }
+
+    private static String formatClosedOn(Instant closedOn) {
+        return DateUtils.getDateTimeFormatter(FormatStyle.SHORT, FormatStyle.SHORT).format(closedOn.atZone(ZoneId.systemDefault()));
     }
 
Index: trunk/src/org/openstreetmap/josm/tools/date/DateUtils.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/date/DateUtils.java	(revision 17839)
+++ trunk/src/org/openstreetmap/josm/tools/date/DateUtils.java	(revision 17840)
@@ -11,4 +11,5 @@
 import java.time.ZonedDateTime;
 import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeFormatterBuilder;
 import java.time.format.DateTimeParseException;
 import java.time.format.FormatStyle;
@@ -76,4 +77,5 @@
      * @param str the date string
      * @return the parsed instant
+     * @throws UncheckedParseException if the date does not match any of the supported date formats
      */
     public static Instant parseInstant(String str) {
@@ -249,15 +251,4 @@
 
     /**
-     * Returns a new {@code SimpleDateFormat} for date and time, according to format used in OSM API errors.
-     * @return a new date format, for date and time, to use for OSM API error handling.
-     * @since 7299
-     */
-    public static SimpleDateFormat newOsmApiDateTimeFormat() {
-        // Example: "2010-09-07 14:39:41 UTC".
-        // Always parsed with US locale regardless of the current locale in JOSM
-        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z", Locale.US);
-    }
-
-    /**
      * Returns the date format to be used for current user, based on user preferences.
      * @param dateStyle The date style as described in {@link DateFormat#getDateInstance}. Ignored if "ISO dates" option is set
@@ -367,4 +358,14 @@
 
     /**
+     * Differs from {@link DateTimeFormatter#ISO_LOCAL_DATE_TIME} by using ' ' instead of 'T' to separate date/time.
+     */
+    private static final DateTimeFormatter ISO_LOCAL_DATE_TIME = new DateTimeFormatterBuilder()
+                .parseCaseInsensitive()
+                .append(DateTimeFormatter.ISO_LOCAL_DATE)
+                .appendLiteral(' ')
+                .append(DateTimeFormatter.ISO_LOCAL_TIME)
+                .toFormatter();
+
+    /**
      * Returns the date/time formatter to be used for current user, based on user preferences.
      * @param dateStyle The date style. Ignored if "ISO dates" option is set.
@@ -374,5 +375,5 @@
     public static DateTimeFormatter getDateTimeFormatter(FormatStyle dateStyle, FormatStyle timeStyle) {
         DateTimeFormatter formatter = PROP_ISO_DATES.get()
-                ? DateTimeFormatter.ISO_LOCAL_DATE_TIME
+                ? ISO_LOCAL_DATE_TIME
                 : DateTimeFormatter.ofLocalizedDateTime(dateStyle, timeStyle);
         return formatter.withZone(ZoneId.systemDefault());
