Index: /trunk/src/org/openstreetmap/josm/tools/date/DateUtils.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/tools/date/DateUtils.java	(revision 10512)
+++ /trunk/src/org/openstreetmap/josm/tools/date/DateUtils.java	(revision 10513)
@@ -35,8 +35,4 @@
     public static final TimeZone UTC = TimeZone.getTimeZone("UTC");
 
-    protected DateUtils() {
-        // Hide default constructor for utils classes
-    }
-
     /**
      * Property to enable display of ISO dates globally.
@@ -52,4 +48,7 @@
      */
     private static final GregorianCalendar calendar = new GregorianCalendar(UTC);
+    /**
+     * A shared instance to convert local times. The time zone should be set before every conversion.
+     */
     private static final GregorianCalendar calendarLocale = new GregorianCalendar(TimeZone.getDefault());
     private static final DatatypeFactory XML_DATE;
@@ -68,4 +67,8 @@
     }
 
+    protected DateUtils() {
+        // Hide default constructor for utils classes
+    }
+
     /**
      * Parses XML date quickly, regardless of current locale.
@@ -74,5 +77,5 @@
      * @throws UncheckedParseException if the date does not match any of the supported date formats
      */
-    public static synchronized Date fromString(String str) throws UncheckedParseException {
+    public static synchronized Date fromString(String str) {
         return new Date(tsFromString(str));
     }
@@ -84,5 +87,5 @@
      * @throws UncheckedParseException if the date does not match any of the supported date formats
      */
-    public static synchronized long tsFromString(String str) throws UncheckedParseException {
+    public static synchronized long tsFromString(String str) {
         // "2007-07-25T09:26:24{Z|{+|-}01[:00]}"
         if (checkLayout(str, "xxxx-xx-xxTxx:xx:xxZ") ||
@@ -94,5 +97,10 @@
                 checkLayout(str, "xxxx-xx-xxTxx:xx:xx+xx:00") ||
                 checkLayout(str, "xxxx-xx-xxTxx:xx:xx-xx:00")) {
-            final Calendar c = checkLayout(str, "xxxx:xx:xx xx:xx:xx") ? calendarLocale : calendar; // consider EXIF date in default timezone
+            final Calendar c; // consider EXIF date in default timezone
+            if (checkLayout(str, "xxxx:xx:xx xx:xx:xx")) {
+                c = getLocalCalendar();
+            } else {
+                c = calendar;
+            }
             c.set(
                 parsePart4(str, 0),
@@ -116,5 +124,6 @@
                 checkLayout(str, "xxxx-xx-xxTxx:xx:xx.xxx+xx:00") ||
                 checkLayout(str, "xxxx-xx-xxTxx:xx:xx.xxx-xx:00")) {
-            final Calendar c = checkLayout(str, "xxxx:xx:xx xx:xx:xx.xxx") ? calendarLocale : calendar; // consider EXIF date in default timezone
+            // consider EXIF date in default timezone
+            final Calendar c = checkLayout(str, "xxxx:xx:xx xx:xx:xx.xxx") ? getLocalCalendar() : calendar;
             c.set(
                 parsePart4(str, 0),
@@ -134,5 +143,4 @@
             // example date format "18-AUG-08 13:33:03"
             SimpleDateFormat f = new SimpleDateFormat("dd-MMM-yy HH:mm:ss");
-            f.setTimeZone(calendarLocale.getTimeZone());
             Date d = f.parse(str, new ParsePosition(0));
             if (d != null)
@@ -145,4 +153,10 @@
             throw new UncheckedParseException("The date string (" + str + ") could not be parsed.", ex);
         }
+    }
+
+    private static Calendar getLocalCalendar() {
+        final Calendar c = calendarLocale;
+        c.setTimeZone(TimeZone.getDefault());
+        return c;
     }
 
@@ -316,11 +330,3 @@
         return getDateTimeFormat(dateStyle, timeStyle).format(datetime);
     }
-
-    /**
-     * Allows to override the timezone for unit tests.
-     * @param zone the timezone to use
-     */
-    protected static synchronized void setTimeZone(TimeZone zone) {
-        calendarLocale.setTimeZone(zone);
-    }
 }
Index: /trunk/test/unit/org/openstreetmap/josm/tools/ExifReaderTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/tools/ExifReaderTest.java	(revision 10512)
+++ /trunk/test/unit/org/openstreetmap/josm/tools/ExifReaderTest.java	(revision 10513)
@@ -15,5 +15,4 @@
 import java.util.TimeZone;
 
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Rule;
@@ -23,5 +22,4 @@
 import org.openstreetmap.josm.testutils.JOSMTestRules;
 import org.openstreetmap.josm.tools.date.DateUtils;
-import org.openstreetmap.josm.tools.date.DateUtilsTest;
 
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
@@ -37,5 +35,5 @@
     @Rule
     @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules();
+    public JOSMTestRules test = new JOSMTestRules().timeout(60000);
 
     private File orientationSampleFile, directionSampleFile;
@@ -48,13 +46,4 @@
         directionSampleFile = new File("data_nodist/exif-example_direction.jpg");
         orientationSampleFile = new File("data_nodist/exif-example_orientation=6.jpg");
-        DateUtilsTest.setTimeZone(TimeZone.getTimeZone("Europe/Berlin"));
-    }
-
-    /**
-     * Clean {@link DateUtils} state
-     */
-    @After
-    public void done() {
-        DateUtilsTest.setTimeZone(DateUtils.UTC);
     }
 
@@ -66,4 +55,9 @@
     public void testReadTime() throws ParseException {
         Date date = ExifReader.readTime(directionSampleFile);
+        assertEquals(new GregorianCalendar(2010, Calendar.MAY, 15, 17, 12, 05).getTime(), date);
+
+        TimeZone.setDefault(TimeZone.getTimeZone("Europe/Berlin"));
+        date = ExifReader.readTime(directionSampleFile);
+        TimeZone.setDefault(DateUtils.UTC);
         assertEquals(new GregorianCalendar(2010, Calendar.MAY, 15, 15, 12, 05).getTime(), date);
     }
@@ -77,4 +71,10 @@
         Date date = ExifReader.readTime(new File("data_nodist/IMG_20150711_193419.jpg"));
         String dateStr = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS").format(date);
+        assertEquals("2015-07-11T19:34:19.100", dateStr);
+
+        TimeZone.setDefault(TimeZone.getTimeZone("Europe/Berlin"));
+        date = ExifReader.readTime(new File("data_nodist/IMG_20150711_193419.jpg"));
+        TimeZone.setDefault(DateUtils.UTC);
+        dateStr = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS").format(date);
         assertEquals("2015-07-11T17:34:19.100", dateStr);
     }
@@ -117,5 +117,5 @@
         File file = new File(TestUtils.getRegressionDataFile(11685, "2015-11-08_15-33-27-Xiaomi_YI-Y0030832.jpg"));
         String dateStr = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS").format(ExifReader.readTime(file));
-        assertEquals("2015-11-08T14:33:27.500", dateStr);
+        assertEquals("2015-11-08T15:33:27.500", dateStr);
     }
 }
Index: /trunk/test/unit/org/openstreetmap/josm/tools/UtilsTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/tools/UtilsTest.java	(revision 10512)
+++ /trunk/test/unit/org/openstreetmap/josm/tools/UtilsTest.java	(revision 10513)
@@ -13,4 +13,5 @@
 import org.junit.Test;
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.testutils.JOSMTestRules;
 
 /**
@@ -18,4 +19,8 @@
  */
 public class UtilsTest {
+    /**
+     * Use default, basic test rules.
+     */
+    public JOSMTestRules rules = new JOSMTestRules();
 
     /**
Index: /trunk/test/unit/org/openstreetmap/josm/tools/date/DateUtilsTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/tools/date/DateUtilsTest.java	(revision 10512)
+++ /trunk/test/unit/org/openstreetmap/josm/tools/date/DateUtilsTest.java	(revision 10513)
@@ -34,5 +34,4 @@
      */
     public static void setTimeZone(TimeZone zone) {
-        DateUtils.setTimeZone(zone);
         TimeZone.setDefault(zone);
     }
