Ticket #17576: 17576-timezones.diff

File 17576-timezones.diff, 9.2 KB (added by Bjoeni, 2 months ago)
  • src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java

     
    3636import java.util.Hashtable;
    3737import java.util.List;
    3838import java.util.Objects;
    39 import java.util.Optional;
    4039import java.util.TimeZone;
    4140import java.util.concurrent.TimeUnit;
    4241
     
    540539     *
    541540     */
    542541    private class SetOffsetActionListener implements ActionListener {
     542        JCheckBox ckDst;
    543543
     544        class TimeZoneItem implements Comparable<TimeZoneItem> {
     545            private TimeZone tz;
     546            private String rawString;
     547            private String dstString;
     548
     549            public TimeZoneItem(TimeZone tz) {
     550                this.tz = tz;
     551            }
     552
     553            public String getFormattedString() {
     554                if (ckDst.isSelected()) {
     555                    return getDstString();
     556                } else {
     557                    return getRawString();
     558                }
     559            }
     560
     561            public String getDstString() {
     562                if (dstString == null) {
     563                    dstString = formatTimezone(tz.getRawOffset() + tz.getDSTSavings());
     564                }
     565                return dstString;
     566            }
     567
     568            public String getRawString() {
     569                if (rawString == null) {
     570                    rawString = formatTimezone(tz.getRawOffset());
     571                }
     572                return rawString;
     573            }
     574
     575            public String getID() {
     576                return tz.getID();
     577            }
     578
     579            @Override
     580            public String toString() {
     581                return getID() + " (" + getFormattedString() + ")";
     582            }
     583
     584            @Override
     585            public int compareTo(TimeZoneItem o) {
     586                return getID().compareTo(o.getID());
     587            }
     588
     589            private String formatTimezone(int offset) {
     590                return new GpxTimezone((double) offset / TimeUnit.HOURS.toMillis(1)).formatTimezone();
     591            }
     592        }
     593
    544594        @Override
    545595        public void actionPerformed(ActionEvent arg0) {
    546596            SimpleDateFormat dateFormat = (SimpleDateFormat) DateUtils.getDateTimeFormat(DateFormat.SHORT, DateFormat.MEDIUM);
     
    598648            gc.weightx = gc.weighty = 0.0;
    599649            gc.fill = GridBagConstraints.NONE;
    600650            gc.anchor = GridBagConstraints.WEST;
    601             panelTf.add(new JLabel(tr("I am in the timezone of: ")), gc);
     651            panelTf.add(new JLabel(tr("Photo taken in the timezone of: ")), gc);
    602652
     653            ckDst = new JCheckBox(tr("Use daylight saving time (where applicable)"), Config.getPref().getBoolean("geoimage.timezoneid.dst"));
     654
    603655            String[] tmp = TimeZone.getAvailableIDs();
    604             List<String> vtTimezones = new ArrayList<>(tmp.length);
     656            List<TimeZoneItem> vtTimezones = new ArrayList<>(tmp.length);
    605657
     658            String defTzStr = Config.getPref().get("geoimage.timezoneid", "");
     659            if (defTzStr.isEmpty()) {
     660                defTzStr = TimeZone.getDefault().getID();
     661            }
     662            TimeZoneItem defTzItem = null;
     663
    606664            for (String tzStr : tmp) {
    607                 TimeZone tz = TimeZone.getTimeZone(tzStr);
    608 
    609                 String tzDesc = tzStr + " (" +
    610                         new GpxTimezone(((double) tz.getRawOffset()) / TimeUnit.HOURS.toMillis(1)).formatTimezone() +
    611                         ')';
    612                 vtTimezones.add(tzDesc);
     665                TimeZoneItem tz = new TimeZoneItem(TimeZone.getTimeZone(tzStr));
     666                vtTimezones.add(tz);
     667                if (defTzStr.equals(tzStr)) {
     668                    defTzItem = tz;
     669                }
    613670            }
    614671
    615672            Collections.sort(vtTimezones);
    616673
    617             JosmComboBox<String> cbTimezones = new JosmComboBox<>(vtTimezones.toArray(new String[0]));
     674            JosmComboBox<TimeZoneItem> cbTimezones = new JosmComboBox<>(vtTimezones.toArray(new TimeZoneItem[0]));
    618675
    619             String tzId = Config.getPref().get("geoimage.timezoneid", "");
    620             TimeZone defaultTz;
    621             if (tzId.isEmpty()) {
    622                 defaultTz = TimeZone.getDefault();
    623             } else {
    624                 defaultTz = TimeZone.getTimeZone(tzId);
     676            if (defTzItem != null) {
     677                cbTimezones.setSelectedItem(defTzItem);
    625678            }
    626679
    627             cbTimezones.setSelectedItem(defaultTz.getID() + " (" +
    628                     new GpxTimezone(((double) defaultTz.getRawOffset()) / TimeUnit.HOURS.toMillis(1)).formatTimezone() +
    629                     ')');
    630 
    631680            gc.gridx = 1;
    632681            gc.weightx = 1.0;
    633682            gc.gridwidth = 2;
     
    634683            gc.fill = GridBagConstraints.HORIZONTAL;
    635684            panelTf.add(cbTimezones, gc);
    636685
     686            gc.gridy = 3;
     687            panelTf.add(ckDst, gc);
     688
     689            ckDst.addActionListener(l -> {
     690                cbTimezones.repaint();
     691            });
     692
    637693            panel.add(panelTf, BorderLayout.SOUTH);
    638694
    639695            JPanel panelLst = new JPanel(new BorderLayout());
     
    710766
    711767                try {
    712768                    delta = dateFormat.parse(lbExifTime.getText()).getTime()
    713                     - dateFormat.parse(tfGpsTime.getText()).getTime();
     769                            - dateFormat.parse(tfGpsTime.getText()).getTime();
    714770                } catch (ParseException e) {
    715771                    JOptionPane.showMessageDialog(MainApplication.getMainFrame(), tr("Error while parsing the date.\n"
    716772                            + "Please use the requested format"),
     
    718774                    continue;
    719775                }
    720776
    721                 String selectedTz = (String) cbTimezones.getSelectedItem();
    722                 int pos = selectedTz.lastIndexOf('(');
    723                 tzId = selectedTz.substring(0, pos - 1);
    724                 String tzValue = selectedTz.substring(pos + 1, selectedTz.length() - 1);
     777                TimeZoneItem selectedTz = (TimeZoneItem) cbTimezones.getSelectedItem();
    725778
    726                 Config.getPref().put("geoimage.timezoneid", tzId);
     779                Config.getPref().put("geoimage.timezoneid", selectedTz.getID());
     780                Config.getPref().putBoolean("geoimage.timezoneid.dst", ckDst.isSelected());
    727781                tfOffset.setText(GpxTimeOffset.milliseconds(delta).formatOffset());
    728                 tfTimezone.setText(tzValue);
     782                tfTimezone.setText(selectedTz.getFormattedString());
    729783
    730784                isOk = true;
    731785
     
    817871        JPanel panelTf = new JPanel(new GridBagLayout());
    818872
    819873        try {
    820             timezone = GpxTimezone.parseTimezone(Optional.ofNullable(Config.getPref().get("geoimage.timezone", "0:00")).orElse("0:00"));
     874            String tz = Config.getPref().get("geoimage.timezone");
     875            if (!tz.isEmpty()) {
     876                timezone = GpxTimezone.parseTimezone(tz);
     877            } else {
     878                timezone = new GpxTimezone(TimeUnit.MILLISECONDS.toMinutes(TimeZone.getDefault().getRawOffset()) / 60.); //hours is double
     879            }
    821880        } catch (ParseException e) {
    822881            timezone = GpxTimezone.ZERO;
    823882            Logging.trace(e);
     
    10541113            if (selGpx == null)
    10551114                return tr("No gpx selected");
    10561115
    1057             final long offsetMs = ((long) (timezone.getHours() * TimeUnit.HOURS.toMillis(-1))) + delta.getMilliseconds(); // in milliseconds
     1116            final long offsetMs = ((long) (timezone.getHours() * TimeUnit.HOURS.toMillis(1))) + delta.getMilliseconds(); // in milliseconds
    10581117            lastNumMatched = GpxImageCorrelation.matchGpxTrack(dateImgLst, selGpx.data, offsetMs, forceTags);
    10591118
    10601119            return trn("<html>Matched <b>{0}</b> of <b>{1}</b> photo to GPX track.</html>",
  • src/org/openstreetmap/josm/tools/date/DateUtils.java

     
    66import java.text.SimpleDateFormat;
    77import java.time.DateTimeException;
    88import java.time.Instant;
    9 import java.time.ZoneId;
    109import java.time.ZoneOffset;
    1110import java.time.ZonedDateTime;
    1211import java.time.format.DateTimeFormatter;
     
    10099                parsePart2(str, 14),
    101100                parsePart2(str, 17),
    102101                0,
    103                 // consider EXIF date in default timezone
    104                 checkLayout(str, "xxxx:xx:xx xx:xx:xx") ? ZoneId.systemDefault() : ZoneOffset.UTC
     102                ZoneOffset.UTC
    105103            );
    106104            if (str.length() == 22 || str.length() == 25) {
    107105                final int plusHr = parsePart2(str, 20);
     
    122120                parsePart2(str, 14),
    123121                parsePart2(str, 17),
    124122                parsePart3(str, 20) * 1_000_000,
    125                 // consider EXIF date in default timezone
    126                 checkLayout(str, "xxxx:xx:xx xx:xx:xx.xxx") ? ZoneId.systemDefault() : ZoneOffset.UTC
     123                ZoneOffset.UTC
    127124            );
    128125            if (str.length() == 29) {
    129126                final int plusHr = parsePart2(str, 24);