Index: trunk/src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java	(revision 15043)
+++ trunk/src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java	(revision 15045)
@@ -29,5 +29,4 @@
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
@@ -37,5 +36,4 @@
 import java.util.List;
 import java.util.Objects;
-import java.util.Optional;
 import java.util.TimeZone;
 import java.util.concurrent.TimeUnit;
@@ -108,4 +106,5 @@
  * This class displays the window to select the GPX file and the offset (timezone + delta).
  * Then it correlates the images of the layer with that GPX file.
+ * @since 2566
  */
 public class CorrelateGpxWithImages extends AbstractAction {
@@ -541,7 +540,61 @@
      */
     private class SetOffsetActionListener implements ActionListener {
-
-        @Override
-        public void actionPerformed(ActionEvent arg0) {
+        JCheckBox ckDst;
+        ImageDisplay imgDisp;
+        JLabel lbExifTime;
+        JosmTextField tfGpsTime;
+
+        class TimeZoneItem implements Comparable<TimeZoneItem> {
+            private final TimeZone tz;
+            private String rawString;
+            private String dstString;
+
+            TimeZoneItem(TimeZone tz) {
+                this.tz = tz;
+            }
+
+            public String getFormattedString() {
+                if (ckDst.isSelected()) {
+                    return getDstString();
+                } else {
+                    return getRawString();
+                }
+            }
+
+            public String getDstString() {
+                if (dstString == null) {
+                    dstString = formatTimezone(tz.getRawOffset() + tz.getDSTSavings());
+                }
+                return dstString;
+            }
+
+            public String getRawString() {
+                if (rawString == null) {
+                    rawString = formatTimezone(tz.getRawOffset());
+                }
+                return rawString;
+            }
+
+            public String getID() {
+                return tz.getID();
+            }
+
+            @Override
+            public String toString() {
+                return getID() + " (" + getFormattedString() + ')';
+            }
+
+            @Override
+            public int compareTo(TimeZoneItem o) {
+                return getID().compareTo(o.getID());
+            }
+
+            private String formatTimezone(int offset) {
+                return new GpxTimezone((double) offset / TimeUnit.HOURS.toMillis(1)).formatTimezone();
+            }
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
             SimpleDateFormat dateFormat = (SimpleDateFormat) DateUtils.getDateTimeFormat(DateFormat.SHORT, DateFormat.MEDIUM);
 
@@ -552,5 +605,5 @@
                     BorderLayout.NORTH);
 
-            ImageDisplay imgDisp = new ImageDisplay();
+            imgDisp = new ImageDisplay();
             imgDisp.setPreferredSize(new Dimension(300, 225));
             panel.add(imgDisp, BorderLayout.CENTER);
@@ -566,5 +619,5 @@
             panelTf.add(new JLabel(tr("Photo time (from exif):")), gc);
 
-            JLabel lbExifTime = new JLabel();
+            lbExifTime = new JLabel();
             gc.gridx = 1;
             gc.weightx = 1.0;
@@ -581,5 +634,5 @@
             panelTf.add(new JLabel(tr("Gps time (read from the above photo): ")), gc);
 
-            JosmTextField tfGpsTime = new JosmTextField(12);
+            tfGpsTime = new JosmTextField(12);
             tfGpsTime.setEnabled(false);
             tfGpsTime.setMinimumSize(new Dimension(155, tfGpsTime.getMinimumSize().height));
@@ -599,33 +652,32 @@
             gc.fill = GridBagConstraints.NONE;
             gc.anchor = GridBagConstraints.WEST;
-            panelTf.add(new JLabel(tr("I am in the timezone of: ")), gc);
+            panelTf.add(new JLabel(tr("Photo taken in the timezone of: ")), gc);
+
+            ckDst = new JCheckBox(tr("Use daylight saving time (where applicable)"), Config.getPref().getBoolean("geoimage.timezoneid.dst"));
 
             String[] tmp = TimeZone.getAvailableIDs();
-            List<String> vtTimezones = new ArrayList<>(tmp.length);
+            List<TimeZoneItem> vtTimezones = new ArrayList<>(tmp.length);
+
+            String defTzStr = Config.getPref().get("geoimage.timezoneid", "");
+            if (defTzStr.isEmpty()) {
+                defTzStr = TimeZone.getDefault().getID();
+            }
+            TimeZoneItem defTzItem = null;
 
             for (String tzStr : tmp) {
-                TimeZone tz = TimeZone.getTimeZone(tzStr);
-
-                String tzDesc = tzStr + " (" +
-                        new GpxTimezone(((double) tz.getRawOffset()) / TimeUnit.HOURS.toMillis(1)).formatTimezone() +
-                        ')';
-                vtTimezones.add(tzDesc);
+                TimeZoneItem tz = new TimeZoneItem(TimeZone.getTimeZone(tzStr));
+                vtTimezones.add(tz);
+                if (defTzStr.equals(tzStr)) {
+                    defTzItem = tz;
+                }
             }
 
             Collections.sort(vtTimezones);
 
-            JosmComboBox<String> cbTimezones = new JosmComboBox<>(vtTimezones.toArray(new String[0]));
-
-            String tzId = Config.getPref().get("geoimage.timezoneid", "");
-            TimeZone defaultTz;
-            if (tzId.isEmpty()) {
-                defaultTz = TimeZone.getDefault();
-            } else {
-                defaultTz = TimeZone.getTimeZone(tzId);
-            }
-
-            cbTimezones.setSelectedItem(defaultTz.getID() + " (" +
-                    new GpxTimezone(((double) defaultTz.getRawOffset()) / TimeUnit.HOURS.toMillis(1)).formatTimezone() +
-                    ')');
+            JosmComboBox<TimeZoneItem> cbTimezones = new JosmComboBox<>(vtTimezones.toArray(new TimeZoneItem[0]));
+
+            if (defTzItem != null) {
+                cbTimezones.setSelectedItem(defTzItem);
+            }
 
             gc.gridx = 1;
@@ -635,4 +687,9 @@
             panelTf.add(cbTimezones, gc);
 
+            gc.gridy = 3;
+            panelTf.add(ckDst, gc);
+
+            ckDst.addActionListener(x -> cbTimezones.repaint());
+
             panel.add(panelTf, BorderLayout.SOUTH);
 
@@ -654,18 +711,5 @@
                 int index = imgList.getSelectedIndex();
                 ImageEntry img = yLayer.getImageData().getImages().get(index);
-                imgDisp.setImage(img);
-                Date date = img.getExifTime();
-                if (date != null) {
-                    DateFormat df = DateUtils.getDateTimeFormat(DateFormat.SHORT, DateFormat.MEDIUM);
-                    lbExifTime.setText(df.format(date));
-                    tfGpsTime.setText(df.format(date));
-                    tfGpsTime.setCaretPosition(tfGpsTime.getText().length());
-                    tfGpsTime.setEnabled(true);
-                    tfGpsTime.requestFocus();
-                } else {
-                    lbExifTime.setText(tr("No date"));
-                    tfGpsTime.setText("");
-                    tfGpsTime.setEnabled(false);
-                }
+                updateExifComponents(img);
             });
             panelLst.add(new JScrollPane(imgList), BorderLayout.CENTER);
@@ -679,16 +723,5 @@
                 ImageEntry entry = new ImageEntry(fc.getSelectedFile());
                 entry.extractExif();
-                imgDisp.setImage(entry);
-
-                Date date = entry.getExifTime();
-                if (date != null) {
-                    lbExifTime.setText(DateUtils.getDateTimeFormat(DateFormat.SHORT, DateFormat.MEDIUM).format(date));
-                    tfGpsTime.setText(DateUtils.getDateFormat(DateFormat.SHORT).format(date)+' ');
-                    tfGpsTime.setEnabled(true);
-                } else {
-                    lbExifTime.setText(tr("No date"));
-                    tfGpsTime.setText("");
-                    tfGpsTime.setEnabled(false);
-                }
+                updateExifComponents(entry);
             });
             panelLst.add(openButton, BorderLayout.PAGE_END);
@@ -711,6 +744,6 @@
                 try {
                     delta = dateFormat.parse(lbExifTime.getText()).getTime()
-                    - dateFormat.parse(tfGpsTime.getText()).getTime();
-                } catch (ParseException e) {
+                          - dateFormat.parse(tfGpsTime.getText()).getTime();
+                } catch (ParseException ex) {
                     JOptionPane.showMessageDialog(MainApplication.getMainFrame(), tr("Error while parsing the date.\n"
                             + "Please use the requested format"),
@@ -719,12 +752,10 @@
                 }
 
-                String selectedTz = (String) cbTimezones.getSelectedItem();
-                int pos = selectedTz.lastIndexOf('(');
-                tzId = selectedTz.substring(0, pos - 1);
-                String tzValue = selectedTz.substring(pos + 1, selectedTz.length() - 1);
-
-                Config.getPref().put("geoimage.timezoneid", tzId);
+                TimeZoneItem selectedTz = (TimeZoneItem) cbTimezones.getSelectedItem();
+
+                Config.getPref().put("geoimage.timezoneid", selectedTz.getID());
+                Config.getPref().putBoolean("geoimage.timezoneid.dst", ckDst.isSelected());
                 tfOffset.setText(GpxTimeOffset.milliseconds(delta).formatOffset());
-                tfTimezone.setText(tzValue);
+                tfTimezone.setText(selectedTz.getFormattedString());
 
                 isOk = true;
@@ -733,4 +764,22 @@
             statusBarUpdater.updateStatusBar();
             yLayer.updateBufferAndRepaint();
+        }
+
+        void updateExifComponents(ImageEntry img) {
+            imgDisp.setImage(img);
+            Date date = img.getExifTime();
+            if (date != null) {
+                DateFormat df = DateUtils.getDateTimeFormat(DateFormat.SHORT, DateFormat.MEDIUM);
+                df.setTimeZone(DateUtils.UTC); // EXIF data does not contain timezone information and is read as UTC
+                lbExifTime.setText(df.format(date));
+                tfGpsTime.setText(df.format(date));
+                tfGpsTime.setCaretPosition(tfGpsTime.getText().length());
+                tfGpsTime.setEnabled(true);
+                tfGpsTime.requestFocus();
+            } else {
+                lbExifTime.setText(tr("No date"));
+                tfGpsTime.setText("");
+                tfGpsTime.setEnabled(false);
+            }
         }
     }
@@ -769,15 +818,11 @@
     public void actionPerformed(ActionEvent ae) {
         // Construct the list of loaded GPX tracks
-        Collection<Layer> layerLst = MainApplication.getLayerManager().getLayers();
         gpxLst.clear();
         GpxDataWrapper defaultItem = null;
-        for (Layer cur : layerLst) {
-            if (cur instanceof GpxLayer) {
-                GpxLayer curGpx = (GpxLayer) cur;
-                GpxDataWrapper gdw = new GpxDataWrapper(curGpx.getName(), curGpx.data, curGpx.data.storageFile);
-                gpxLst.add(gdw);
-                if (cur == yLayer.gpxLayer) {
-                    defaultItem = gdw;
-                }
+        for (GpxLayer cur : MainApplication.getLayerManager().getLayersOfType(GpxLayer.class)) {
+            GpxDataWrapper gdw = new GpxDataWrapper(cur.getName(), cur.data, cur.data.storageFile);
+            gpxLst.add(gdw);
+            if (cur == yLayer.gpxLayer) {
+                defaultItem = gdw;
             }
         }
@@ -801,10 +846,5 @@
         } else {
             // select first GPX track associated to a file
-            for (GpxDataWrapper item : gpxLst) {
-                if (item.file != null) {
-                    cbGpx.setSelectedItem(item);
-                    break;
-                }
-            }
+            gpxLst.stream().filter(i -> i.file != null).findFirst().ifPresent(cbGpx::setSelectedItem);
         }
         cbGpx.addActionListener(statusBarUpdaterWithRepaint);
@@ -818,5 +858,10 @@
 
         try {
-            timezone = GpxTimezone.parseTimezone(Optional.ofNullable(Config.getPref().get("geoimage.timezone", "0:00")).orElse("0:00"));
+            String tz = Config.getPref().get("geoimage.timezone");
+            if (!tz.isEmpty()) {
+                timezone = GpxTimezone.parseTimezone(tz);
+            } else {
+                timezone = new GpxTimezone(TimeUnit.MILLISECONDS.toMinutes(TimeZone.getDefault().getRawOffset()) / 60.); //hours is double
+            }
         } catch (ParseException e) {
             timezone = GpxTimezone.ZERO;
@@ -837,6 +882,5 @@
         tfOffset.setText(delta.formatOffset());
 
-        JButton buttonViewGpsPhoto = new JButton(tr("<html>Use photo of an accurate clock,<br>"
-                + "e.g. GPS receiver display</html>"));
+        JButton buttonViewGpsPhoto = new JButton(tr("<html>Use photo of an accurate clock,<br>e.g. GPS receiver display</html>"));
         buttonViewGpsPhoto.setIcon(ImageProvider.get("clock"));
         buttonViewGpsPhoto.addActionListener(new SetOffsetActionListener());
@@ -1055,5 +1099,5 @@
                 return tr("No gpx selected");
 
-            final long offsetMs = ((long) (timezone.getHours() * TimeUnit.HOURS.toMillis(-1))) + delta.getMilliseconds(); // in milliseconds
+            final long offsetMs = ((long) (timezone.getHours() * TimeUnit.HOURS.toMillis(1))) + delta.getMilliseconds(); // in milliseconds
             lastNumMatched = GpxImageCorrelation.matchGpxTrack(dateImgLst, selGpx.data, offsetMs, forceTags);
 
Index: trunk/src/org/openstreetmap/josm/tools/date/DateUtils.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/date/DateUtils.java	(revision 15043)
+++ trunk/src/org/openstreetmap/josm/tools/date/DateUtils.java	(revision 15045)
@@ -7,5 +7,4 @@
 import java.time.DateTimeException;
 import java.time.Instant;
-import java.time.ZoneId;
 import java.time.ZoneOffset;
 import java.time.ZonedDateTime;
@@ -101,6 +100,5 @@
                 parsePart2(str, 17),
                 0,
-                // consider EXIF date in default timezone
-                checkLayout(str, "xxxx:xx:xx xx:xx:xx") ? ZoneId.systemDefault() : ZoneOffset.UTC
+                ZoneOffset.UTC
             );
             if (str.length() == 22 || str.length() == 25) {
@@ -123,6 +121,5 @@
                 parsePart2(str, 17),
                 parsePart3(str, 20) * 1_000_000,
-                // consider EXIF date in default timezone
-                checkLayout(str, "xxxx:xx:xx xx:xx:xx.xxx") ? ZoneId.systemDefault() : ZoneOffset.UTC
+                ZoneOffset.UTC
             );
             if (str.length() == 29) {
