Index: trunk/src/org/openstreetmap/josm/data/notes/Note.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/notes/Note.java	(revision 17711)
+++ trunk/src/org/openstreetmap/josm/data/notes/Note.java	(revision 17712)
@@ -4,12 +4,11 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.time.Instant;
 import java.util.ArrayList;
 import java.util.Comparator;
-import java.util.Date;
 import java.util.List;
 import java.util.Objects;
 
 import org.openstreetmap.josm.data.coor.LatLon;
-import org.openstreetmap.josm.tools.date.DateUtils;
 
 /**
@@ -66,6 +65,6 @@
     private long id;
     private LatLon latLon;
-    private Date createdAt;
-    private Date closedAt;
+    private Instant createdAt;
+    private Instant closedAt;
     private State state;
     private List<NoteComment> comments = new ArrayList<>();
@@ -107,6 +106,6 @@
      * @return Date that this note was submitted
      */
-    public Date getCreatedAt() {
-        return DateUtils.cloneDate(createdAt);
+    public Instant getCreatedAt() {
+        return createdAt;
     }
 
@@ -115,6 +114,6 @@
      * @param createdAt date at which this note has been created
      */
-    public void setCreatedAt(Date createdAt) {
-        this.createdAt = DateUtils.cloneDate(createdAt);
+    public void setCreatedAt(Instant createdAt) {
+        this.createdAt = createdAt;
     }
 
@@ -123,6 +122,6 @@
      * @return Date that this note was closed. Null if it is still open.
      */
-    public Date getClosedAt() {
-        return DateUtils.cloneDate(closedAt);
+    public Instant getClosedAt() {
+        return closedAt;
     }
 
@@ -131,6 +130,6 @@
      * @param closedAt date at which this note has been closed
      */
-    public void setClosedAt(Date closedAt) {
-        this.closedAt = DateUtils.cloneDate(closedAt);
+    public void setClosedAt(Instant closedAt) {
+        this.closedAt = closedAt;
     }
 
@@ -191,5 +190,5 @@
     public void updateWith(Note note) {
         this.comments = note.comments;
-        this.createdAt = DateUtils.cloneDate(note.createdAt);
+        this.createdAt = note.createdAt;
         this.id = note.id;
         this.state = note.state;
Index: trunk/src/org/openstreetmap/josm/data/notes/NoteComment.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/notes/NoteComment.java	(revision 17711)
+++ trunk/src/org/openstreetmap/josm/data/notes/NoteComment.java	(revision 17712)
@@ -2,9 +2,8 @@
 package org.openstreetmap.josm.data.notes;
 
+import java.time.Instant;
 import java.util.Comparator;
-import java.util.Date;
 
 import org.openstreetmap.josm.data.osm.User;
-import org.openstreetmap.josm.tools.date.DateUtils;
 
 /**
@@ -17,5 +16,5 @@
     private final String text;
     private final User user;
-    private final Date commentTimestamp;
+    private final Instant commentTimestamp;
     private final Action action;
 
@@ -50,8 +49,8 @@
      * @param isNew Whether or not this comment is new and needs to be uploaded
      */
-    public NoteComment(Date createDate, User user, String commentText, Action action, boolean isNew) {
+    public NoteComment(Instant createDate, User user, String commentText, Action action, boolean isNew) {
         this.text = commentText;
         this.user = user;
-        this.commentTimestamp = DateUtils.cloneDate(createDate);
+        this.commentTimestamp = createDate;
         this.action = action;
         this.isNew = isNew;
@@ -78,6 +77,6 @@
      * @return The time at which this comment was created
      */
-    public Date getCommentTimestamp() {
-        return DateUtils.cloneDate(commentTimestamp);
+    public Instant getCommentTimestamp() {
+        return commentTimestamp;
     }
 
Index: trunk/src/org/openstreetmap/josm/data/osm/NoteData.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/NoteData.java	(revision 17711)
+++ trunk/src/org/openstreetmap/josm/data/osm/NoteData.java	(revision 17712)
@@ -2,9 +2,9 @@
 package org.openstreetmap.josm.data.osm;
 
+import java.time.Instant;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
-import java.util.Date;
 import java.util.List;
 import java.util.Map;
@@ -177,8 +177,8 @@
         }
         Note note = new Note(location);
-        note.setCreatedAt(new Date());
+        note.setCreatedAt(Instant.now());
         note.setState(State.OPEN);
         note.setId(newNoteId--);
-        NoteComment comment = new NoteComment(new Date(), getCurrentUser(), text, NoteComment.Action.OPENED, true);
+        NoteComment comment = new NoteComment(Instant.now(), getCurrentUser(), text, NoteComment.Action.OPENED, true);
         note.addComment(comment);
         if (Logging.isDebugEnabled()) {
@@ -204,5 +204,5 @@
             Logging.debug("Adding comment to note {0}: {1}", note.getId(), text);
         }
-        NoteComment comment = new NoteComment(new Date(), getCurrentUser(), text, NoteComment.Action.COMMENTED, true);
+        NoteComment comment = new NoteComment(Instant.now(), getCurrentUser(), text, NoteComment.Action.COMMENTED, true);
         note.addComment(comment);
         dataUpdated();
@@ -224,8 +224,8 @@
             Logging.debug("closing note {0} with comment: {1}", note.getId(), text);
         }
-        NoteComment comment = new NoteComment(new Date(), getCurrentUser(), text, NoteComment.Action.CLOSED, true);
+        NoteComment comment = new NoteComment(Instant.now(), getCurrentUser(), text, NoteComment.Action.CLOSED, true);
         note.addComment(comment);
         note.setState(State.CLOSED);
-        note.setClosedAt(new Date());
+        note.setClosedAt(Instant.now());
         dataUpdated();
     }
@@ -244,5 +244,5 @@
         }
         Logging.debug("reopening note {0} with comment: {1}", note.getId(), text);
-        NoteComment comment = new NoteComment(new Date(), getCurrentUser(), text, NoteComment.Action.REOPENED, true);
+        NoteComment comment = new NoteComment(Instant.now(), getCurrentUser(), text, NoteComment.Action.REOPENED, true);
         note.addComment(comment);
         note.setState(State.OPEN);
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/NotesDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/NotesDialog.java	(revision 17711)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/NotesDialog.java	(revision 17712)
@@ -10,5 +10,6 @@
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
-import java.text.DateFormat;
+import java.time.format.DateTimeFormatter;
+import java.time.format.FormatStyle;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -232,5 +233,5 @@
 
         private final DefaultListCellRenderer defaultListCellRenderer = new DefaultListCellRenderer();
-        private final DateFormat dateFormat = DateUtils.getDateTimeFormat(DateFormat.MEDIUM, DateFormat.SHORT);
+        private final DateTimeFormatter dateFormat = DateUtils.getDateTimeFormatter(FormatStyle.MEDIUM, FormatStyle.SHORT);
 
         @Override
Index: trunk/src/org/openstreetmap/josm/gui/layer/NoteLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/NoteLayer.java	(revision 17711)
+++ trunk/src/org/openstreetmap/josm/gui/layer/NoteLayer.java	(revision 17712)
@@ -15,5 +15,5 @@
 import java.io.File;
 import java.io.IOException;
-import java.text.DateFormat;
+import java.time.format.FormatStyle;
 import java.util.Collection;
 import java.util.Collections;
@@ -319,5 +319,5 @@
                 sb.append(userName)
                   .append(" on ")
-                  .append(DateUtils.getDateFormat(DateFormat.MEDIUM).format(comment.getCommentTimestamp()))
+                  .append(DateUtils.getDateFormatter(FormatStyle.MEDIUM).format(comment.getCommentTimestamp()))
                   .append(":<br>");
                 String htmlText = XmlWriter.encode(comment.getText(), true);
Index: trunk/src/org/openstreetmap/josm/io/NoteReader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/NoteReader.java	(revision 17711)
+++ trunk/src/org/openstreetmap/josm/io/NoteReader.java	(revision 17712)
@@ -6,6 +6,6 @@
 import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
+import java.time.Instant;
 import java.util.ArrayList;
-import java.util.Date;
 import java.util.List;
 import java.util.Locale;
@@ -60,5 +60,5 @@
         private String commentUsername;
         private Action noteAction;
-        private Date commentCreateDate;
+        private Instant commentCreateDate;
         private boolean commentIsNew;
         private List<Note> notes;
@@ -100,5 +100,5 @@
                 commentUsername = attrs.getValue("user");
                 noteAction = Action.valueOf(attrs.getValue("action").toUpperCase(Locale.ENGLISH));
-                commentCreateDate = DateUtils.fromString(attrs.getValue("timestamp"));
+                commentCreateDate = DateUtils.parseInstant(attrs.getValue("timestamp"));
                 commentIsNew = Boolean.parseBoolean(Optional.ofNullable(attrs.getValue("is_new")).orElse("false"));
                 break;
@@ -143,11 +143,11 @@
                 break;
             case "date_created":
-                thisNote.setCreatedAt(DateUtils.fromString(buffer.toString()));
+                thisNote.setCreatedAt(DateUtils.parseInstant(buffer.toString()));
                 break;
             case "date_closed":
-                thisNote.setClosedAt(DateUtils.fromString(buffer.toString()));
+                thisNote.setClosedAt(DateUtils.parseInstant(buffer.toString()));
                 break;
             case "date":
-                commentCreateDate = DateUtils.fromString(buffer.toString());
+                commentCreateDate = DateUtils.parseInstant(buffer.toString());
                 break;
             case "user":
@@ -205,9 +205,9 @@
         } else {
             note.setState(Note.State.CLOSED);
-            note.setClosedAt(DateUtils.fromString(closedTimeStr));
+            note.setClosedAt(DateUtils.parseInstant(closedTimeStr));
         }
         String createdAt = attrs.apply("created_at");
         if (createdAt != null) {
-            note.setCreatedAt(DateUtils.fromString(createdAt));
+            note.setCreatedAt(DateUtils.parseInstant(createdAt));
         }
         return note;
Index: trunk/src/org/openstreetmap/josm/io/NoteWriter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/NoteWriter.java	(revision 17711)
+++ trunk/src/org/openstreetmap/josm/io/NoteWriter.java	(revision 17712)
@@ -13,5 +13,4 @@
 import org.openstreetmap.josm.data.osm.NoteData;
 import org.openstreetmap.josm.data.osm.User;
-import org.openstreetmap.josm.tools.date.DateUtils;
 
 /**
@@ -53,7 +52,7 @@
             out.print("lat=\"" + LatLon.cDdHighPrecisionFormatter.format(ll.lat()) + "\" ");
             out.print("lon=\"" + LatLon.cDdHighPrecisionFormatter.format(ll.lon()) + "\" ");
-            out.print("created_at=\"" + DateUtils.fromDate(note.getCreatedAt()) + "\" ");
+            out.print("created_at=\"" + note.getCreatedAt() + "\" ");
             if (note.getClosedAt() != null) {
-                out.print("closed_at=\"" + DateUtils.fromDate(note.getClosedAt()) + "\" ");
+                out.print("closed_at=\"" + note.getClosedAt() + "\" ");
             }
 
@@ -72,5 +71,5 @@
         out.print("    <comment");
         out.print(" action=\"" + comment.getNoteAction() + "\" ");
-        out.print("timestamp=\"" + DateUtils.fromDate(comment.getCommentTimestamp()) + "\" ");
+        out.print("timestamp=\"" + comment.getCommentTimestamp() + "\" ");
         if (comment.getUser() != null && !comment.getUser().equals(User.getAnonymous())) {
             out.print("uid=\"" + comment.getUser().getId() + "\" ");
Index: trunk/src/org/openstreetmap/josm/tools/date/DateUtils.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/date/DateUtils.java	(revision 17711)
+++ trunk/src/org/openstreetmap/josm/tools/date/DateUtils.java	(revision 17712)
@@ -7,8 +7,10 @@
 import java.time.DateTimeException;
 import java.time.Instant;
+import java.time.ZoneId;
 import java.time.ZoneOffset;
 import java.time.ZonedDateTime;
 import java.time.format.DateTimeFormatter;
 import java.time.format.DateTimeParseException;
+import java.time.format.FormatStyle;
 import java.util.Date;
 import java.util.Locale;
@@ -270,4 +272,16 @@
 
     /**
+     * Returns the date formatter to be used for current user, based on user preferences.
+     * @param dateStyle The date style. Ignored if "ISO dates" option is set.
+     * @return The date format
+     */
+    public static DateTimeFormatter getDateFormatter(FormatStyle dateStyle) {
+        DateTimeFormatter formatter = PROP_ISO_DATES.get()
+                ? DateTimeFormatter.ISO_LOCAL_DATE
+                : DateTimeFormatter.ofLocalizedDate(dateStyle);
+        return formatter.withZone(ZoneId.systemDefault());
+    }
+
+    /**
      * Returns the date format used for GPX waypoints.
      * @return the date format used for GPX waypoints
@@ -305,4 +319,16 @@
             return DateFormat.getTimeInstance(timeStyle, Locale.getDefault());
         }
+    }
+
+    /**
+     * Returns the time formatter to be used for current user, based on user preferences.
+     * @param timeStyle The time style. Ignored if "ISO dates" option is set.
+     * @return The time format
+     */
+    public static DateTimeFormatter getTimeFormatter(FormatStyle timeStyle) {
+        DateTimeFormatter formatter = PROP_ISO_DATES.get()
+                ? DateTimeFormatter.ISO_LOCAL_TIME
+                : DateTimeFormatter.ofLocalizedTime(timeStyle);
+        return formatter.withZone(ZoneId.systemDefault());
     }
 
@@ -337,4 +363,17 @@
 
     /**
+     * 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.
+     * @param timeStyle The time style. Ignored if "ISO dates" option is set.
+     * @return The date/time format
+     */
+    public static DateTimeFormatter getDateTimeFormatter(FormatStyle dateStyle, FormatStyle timeStyle) {
+        DateTimeFormatter formatter = PROP_ISO_DATES.get()
+                ? DateTimeFormatter.ISO_LOCAL_DATE_TIME
+                : DateTimeFormatter.ofLocalizedDateTime(dateStyle, timeStyle);
+        return formatter.withZone(ZoneId.systemDefault());
+    }
+
+    /**
      * Formats a date/time to be displayed to current user, based on user preferences.
      * @param datetime The date/time to display. Must not be {@code null}
Index: trunk/test/unit/org/openstreetmap/josm/data/notes/NoteCommentTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/data/notes/NoteCommentTest.java	(revision 17711)
+++ trunk/test/unit/org/openstreetmap/josm/data/notes/NoteCommentTest.java	(revision 17712)
@@ -6,5 +6,5 @@
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
-import java.util.Date;
+import java.time.Instant;
 
 import org.junit.jupiter.api.extension.RegisterExtension;
@@ -31,5 +31,5 @@
     @Test
     void testNoteComment() {
-        NoteComment comment = new NoteComment(new Date(), null, "foo", null, true);
+        NoteComment comment = new NoteComment(Instant.now(), null, "foo", null, true);
         assertEquals("foo", comment.toString());
         assertTrue(comment.isNew());
Index: trunk/test/unit/org/openstreetmap/josm/data/notes/NoteTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/data/notes/NoteTest.java	(revision 17711)
+++ trunk/test/unit/org/openstreetmap/josm/data/notes/NoteTest.java	(revision 17712)
@@ -5,5 +5,5 @@
 import static org.junit.jupiter.api.Assertions.assertNotEquals;
 
-import java.util.Date;
+import java.time.Instant;
 
 import org.junit.jupiter.api.extension.RegisterExtension;
@@ -36,5 +36,5 @@
         Note note = new Note(LatLon.ZERO);
         assertEquals("Note 0: null", note.toString());
-        note.addComment(new NoteComment(new Date(), null, "foo", null, true));
+        note.addComment(new NoteComment(Instant.now(), null, "foo", null, true));
         assertEquals("Note 0: foo", note.toString());
     }
@@ -65,6 +65,6 @@
             .withPrefabValues(LatLon.class, LatLon.ZERO, new LatLon(1, 1))
             .withPrefabValues(NoteComment.class,
-                    new NoteComment(new Date(), null, "foo", null, true),
-                    new NoteComment(new Date(), null, "bar", null, false))
+                    new NoteComment(Instant.now(), null, "foo", null, true),
+                    new NoteComment(Instant.now(), null, "bar", null, false))
             .verify();
     }
Index: trunk/test/unit/org/openstreetmap/josm/gui/dialogs/NotesDialogTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/gui/dialogs/NotesDialogTest.java	(revision 17711)
+++ trunk/test/unit/org/openstreetmap/josm/gui/dialogs/NotesDialogTest.java	(revision 17712)
@@ -4,5 +4,5 @@
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
-import java.util.Date;
+import java.time.Instant;
 
 import javax.swing.JLabel;
@@ -35,6 +35,6 @@
     void testMultiLineNoteRendering() {
         Note note = new Note(LatLon.ZERO);
-        note.setCreatedAt(new Date());
-        note.addComment(new NoteComment(new Date(), User.createLocalUser(null), "foo\nbar\n\nbaz:\nfoo", null, false));
+        note.setCreatedAt(Instant.now());
+        note.addComment(new NoteComment(Instant.now(), User.createLocalUser(null), "foo\nbar\n\nbaz:\nfoo", null, false));
         assertEquals("0: foo; bar; baz: foo",
                 ((JLabel) new NoteRenderer().getListCellRendererComponent(new JList<>(), note, 0, false, false)).getText());
Index: trunk/test/unit/org/openstreetmap/josm/io/NoteReaderTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/io/NoteReaderTest.java	(revision 17711)
+++ trunk/test/unit/org/openstreetmap/josm/io/NoteReaderTest.java	(revision 17712)
@@ -64,6 +64,6 @@
         assertEquals(1, list.size());
         Note n = list.get(0);
-        assertEquals(DateUtils.fromString("2013-04-24 08:08:51 UTC"), n.getClosedAt());
-        assertEquals(DateUtils.fromString("2013-04-24 08:07:02 UTC"), n.getCreatedAt());
+        assertEquals(DateUtils.parseInstant("2013-04-24 08:08:51 UTC"), n.getClosedAt());
+        assertEquals(DateUtils.parseInstant("2013-04-24 08:07:02 UTC"), n.getCreatedAt());
         assertEquals(4, n.getId());
         assertEquals(new LatLon(36.7232991, 68.86415), n.getLatLon());
@@ -74,5 +74,5 @@
         NoteComment c1 = comments.get(0);
         assertEquals(c1, n.getFirstComment());
-        assertEquals(DateUtils.fromString("2013-04-24 08:07:02 UTC"), c1.getCommentTimestamp());
+        assertEquals(DateUtils.parseInstant("2013-04-24 08:07:02 UTC"), c1.getCommentTimestamp());
         assertEquals(Action.OPENED, c1.getNoteAction());
         assertEquals("test", c1.getText());
Index: trunk/test/unit/org/openstreetmap/josm/tools/date/DateUtilsTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/tools/date/DateUtilsTest.java	(revision 17711)
+++ trunk/test/unit/org/openstreetmap/josm/tools/date/DateUtilsTest.java	(revision 17712)
@@ -10,4 +10,6 @@
 
 import java.text.DateFormat;
+import java.time.Instant;
+import java.time.format.FormatStyle;
 import java.util.Date;
 import java.util.Random;
@@ -272,3 +274,23 @@
         assertNotSame(date, DateUtils.cloneDate(date));
     }
+
+    /**
+     * Unit test of {@link DateUtils#getDateTimeFormatter} method.
+     */
+    @Test
+    void testDateTimeFormatter() {
+        Instant instant = Instant.parse("2006-01-02T15:04:05Z");
+        Boolean iso = DateUtils.PROP_ISO_DATES.get();
+        try {
+            assertNotNull(DateUtils.getDateFormatter(FormatStyle.SHORT).format(instant));
+            assertNotNull(DateUtils.getTimeFormatter(FormatStyle.SHORT).format(instant));
+            assertNotNull(DateUtils.getDateTimeFormatter(FormatStyle.SHORT, FormatStyle.SHORT).format(instant));
+            DateUtils.PROP_ISO_DATES.put(!iso);
+            assertNotNull(DateUtils.getDateFormatter(FormatStyle.SHORT).format(instant));
+            assertNotNull(DateUtils.getTimeFormatter(FormatStyle.SHORT).format(instant));
+            assertNotNull(DateUtils.getDateTimeFormatter(FormatStyle.SHORT, FormatStyle.SHORT).format(instant));
+        } finally {
+            DateUtils.PROP_ISO_DATES.put(iso);
+        }
+    }
 }
