Index: src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java
===================================================================
--- src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java	(revision 14977)
+++ src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java	(working copy)
@@ -36,7 +36,6 @@
 import java.util.Hashtable;
 import java.util.List;
 import java.util.Objects;
-import java.util.Optional;
 import java.util.TimeZone;
 import java.util.concurrent.TimeUnit;
 
@@ -540,7 +539,58 @@
      *
      */
     private class SetOffsetActionListener implements ActionListener {
+        JCheckBox ckDst;
 
+        class TimeZoneItem implements Comparable<TimeZoneItem> {
+            private TimeZone tz;
+            private String rawString;
+            private String dstString;
+
+            public 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 arg0) {
             SimpleDateFormat dateFormat = (SimpleDateFormat) DateUtils.getDateTimeFormat(DateFormat.SHORT, DateFormat.MEDIUM);
@@ -598,36 +648,35 @@
             gc.weightx = gc.weighty = 0.0;
             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]));
+            JosmComboBox<TimeZoneItem> cbTimezones = new JosmComboBox<>(vtTimezones.toArray(new TimeZoneItem[0]));
 
-            String tzId = Config.getPref().get("geoimage.timezoneid", "");
-            TimeZone defaultTz;
-            if (tzId.isEmpty()) {
-                defaultTz = TimeZone.getDefault();
-            } else {
-                defaultTz = TimeZone.getTimeZone(tzId);
+            if (defTzItem != null) {
+                cbTimezones.setSelectedItem(defTzItem);
             }
 
-            cbTimezones.setSelectedItem(defaultTz.getID() + " (" +
-                    new GpxTimezone(((double) defaultTz.getRawOffset()) / TimeUnit.HOURS.toMillis(1)).formatTimezone() +
-                    ')');
-
             gc.gridx = 1;
             gc.weightx = 1.0;
             gc.gridwidth = 2;
@@ -634,6 +683,13 @@
             gc.fill = GridBagConstraints.HORIZONTAL;
             panelTf.add(cbTimezones, gc);
 
+            gc.gridy = 3;
+            panelTf.add(ckDst, gc);
+
+            ckDst.addActionListener(l -> {
+                cbTimezones.repaint();
+            });
+
             panel.add(panelTf, BorderLayout.SOUTH);
 
             JPanel panelLst = new JPanel(new BorderLayout());
@@ -710,7 +766,7 @@
 
                 try {
                     delta = dateFormat.parse(lbExifTime.getText()).getTime()
-                    - dateFormat.parse(tfGpsTime.getText()).getTime();
+                            - dateFormat.parse(tfGpsTime.getText()).getTime();
                 } catch (ParseException e) {
                     JOptionPane.showMessageDialog(MainApplication.getMainFrame(), tr("Error while parsing the date.\n"
                             + "Please use the requested format"),
@@ -718,14 +774,12 @@
                     continue;
                 }
 
-                String selectedTz = (String) cbTimezones.getSelectedItem();
-                int pos = selectedTz.lastIndexOf('(');
-                tzId = selectedTz.substring(0, pos - 1);
-                String tzValue = selectedTz.substring(pos + 1, selectedTz.length() - 1);
+                TimeZoneItem selectedTz = (TimeZoneItem) cbTimezones.getSelectedItem();
 
-                Config.getPref().put("geoimage.timezoneid", tzId);
+                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;
 
@@ -817,7 +871,12 @@
         JPanel panelTf = new JPanel(new GridBagLayout());
 
         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;
             Logging.trace(e);
@@ -1054,7 +1113,7 @@
             if (selGpx == null)
                 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);
 
             return trn("<html>Matched <b>{0}</b> of <b>{1}</b> photo to GPX track.</html>",
Index: src/org/openstreetmap/josm/tools/date/DateUtils.java
===================================================================
--- src/org/openstreetmap/josm/tools/date/DateUtils.java	(revision 14977)
+++ src/org/openstreetmap/josm/tools/date/DateUtils.java	(working copy)
@@ -6,7 +6,6 @@
 import java.text.SimpleDateFormat;
 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;
@@ -100,8 +99,7 @@
                 parsePart2(str, 14),
                 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) {
                 final int plusHr = parsePart2(str, 20);
@@ -122,8 +120,7 @@
                 parsePart2(str, 14),
                 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) {
                 final int plusHr = parsePart2(str, 24);
