Index: /trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java	(revision 16940)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java	(revision 16941)
@@ -157,22 +157,29 @@
     public static String getTimespanForTrack(IGpxTrack trk) {
         Date[] bounds = GpxData.getMinMaxTimeForTrack(trk);
+        return bounds != null ? formatTimespan(bounds) : "";
+    }
+
+    /**
+     * Formats the timespan of the given track as a human readable string
+     * @param bounds The bounds to format, i.e., an array containing the min/max date
+     * @return The timespan as a string
+     */
+    public static String formatTimespan(Date[] bounds) {
         String ts = "";
-        if (bounds != null) {
-            DateFormat df = DateUtils.getDateFormat(DateFormat.SHORT);
-            String earliestDate = df.format(bounds[0]);
-            String latestDate = df.format(bounds[1]);
-
-            if (earliestDate.equals(latestDate)) {
-                DateFormat tf = DateUtils.getTimeFormat(DateFormat.SHORT);
-                ts += earliestDate + ' ';
-                ts += tf.format(bounds[0]) + " - " + tf.format(bounds[1]);
-            } else {
-                DateFormat dtf = DateUtils.getDateTimeFormat(DateFormat.SHORT, DateFormat.MEDIUM);
-                ts += dtf.format(bounds[0]) + " - " + dtf.format(bounds[1]);
-            }
-
-            int diff = (int) (bounds[1].getTime() - bounds[0].getTime()) / 1000;
-            ts += String.format(" (%d:%02d)", diff / 3600, (diff % 3600) / 60);
-        }
+        DateFormat df = DateUtils.getDateFormat(DateFormat.SHORT);
+        String earliestDate = df.format(bounds[0]);
+        String latestDate = df.format(bounds[1]);
+
+        if (earliestDate.equals(latestDate)) {
+            DateFormat tf = DateUtils.getTimeFormat(DateFormat.SHORT);
+            ts += earliestDate + ' ';
+            ts += tf.format(bounds[0]) + " - " + tf.format(bounds[1]);
+        } else {
+            DateFormat dtf = DateUtils.getDateTimeFormat(DateFormat.SHORT, DateFormat.MEDIUM);
+            ts += dtf.format(bounds[0]) + " - " + dtf.format(bounds[1]);
+        }
+
+        int diff = (int) (bounds[1].getTime() - bounds[0].getTime()) / 1000;
+        ts += String.format(" (%d:%02d)", diff / 3600, (diff % 3600) / 60);
         return ts;
     }
Index: /trunk/src/org/openstreetmap/josm/gui/layer/gpx/ChooseTrackVisibilityAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/gpx/ChooseTrackVisibilityAction.java	(revision 16940)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/gpx/ChooseTrackVisibilityAction.java	(revision 16941)
@@ -15,4 +15,5 @@
 import java.util.Arrays;
 import java.util.Comparator;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
@@ -42,4 +43,5 @@
 import org.openstreetmap.josm.data.SystemOfMeasurement;
 import org.openstreetmap.josm.data.gpx.GpxConstants;
+import org.openstreetmap.josm.data.gpx.GpxData;
 import org.openstreetmap.josm.data.gpx.IGpxTrack;
 import org.openstreetmap.josm.gui.ExtendedDialog;
@@ -86,5 +88,5 @@
             String name = (String) Optional.ofNullable(attr.get(GpxConstants.GPX_NAME)).orElse("");
             String desc = (String) Optional.ofNullable(attr.get(GpxConstants.GPX_DESC)).orElse("");
-            String time = GpxLayer.getTimespanForTrack(trk);
+            Date[] time = GpxData.getMinMaxTimeForTrack(trk);
             String url = (String) Optional.ofNullable(attr.get("url")).orElse("");
             tracks[i] = new Object[]{name, desc, time, trk.length(), url, trk};
@@ -138,4 +140,5 @@
         t.setRowSorter(rowSorter);
         rowSorter.setModel(model);
+        rowSorter.setComparator(2, Comparator.comparing((Date[] d) -> d == null ? Long.MIN_VALUE : d[0].getTime()));
         rowSorter.setComparator(3, Comparator.comparingDouble(length -> (double) length));
         // default column widths
@@ -143,4 +146,14 @@
         t.getColumnModel().getColumn(1).setPreferredWidth(300);
         t.getColumnModel().getColumn(2).setPreferredWidth(200);
+        t.getColumnModel().getColumn(2).setCellRenderer(new DefaultTableCellRenderer() {
+            @Override
+            public Component getTableCellRendererComponent(
+                    JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
+                if (value instanceof Date[]) {
+                    value = GpxLayer.formatTimespan(((Date[]) value));
+                }
+                return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
+            }
+        });
         t.getColumnModel().getColumn(3).setPreferredWidth(50);
         t.getColumnModel().getColumn(3).setCellRenderer(new DefaultTableCellRenderer() {
