diff --git a/src/org/openstreetmap/josm/tools/date/DateUtils.java b/src/org/openstreetmap/josm/tools/date/DateUtils.java
index c148194..c8a3245 100644
--- a/src/org/openstreetmap/josm/tools/date/DateUtils.java
+++ b/src/org/openstreetmap/josm/tools/date/DateUtils.java
@@ -34,10 +34,6 @@ public final class DateUtils {
      */
     public static final TimeZone UTC = TimeZone.getTimeZone("UTC");
 
-    protected DateUtils() {
-        // Hide default constructor for utils classes
-    }
-
     /**
      * Property to enable display of ISO dates globally.
      * @since 7299
@@ -51,6 +47,9 @@ public final class DateUtils {
      * with the timezone lookup, is very expensive.
      */
     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;
 
@@ -67,13 +66,17 @@ public final class DateUtils {
         XML_DATE = fact;
     }
 
+    protected DateUtils() {
+        // Hide default constructor for utils classes
+    }
+
     /**
      * Parses XML date quickly, regardless of current locale.
      * @param str The XML date as string
      * @return The date
      * @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));
     }
 
@@ -83,7 +86,7 @@ public final class DateUtils {
      * @return The date in milliseconds since epoch
      * @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") ||
                 checkLayout(str, "xxxx-xx-xxTxx:xx:xx") ||
@@ -93,7 +96,12 @@ public final class DateUtils {
                 checkLayout(str, "xxxx-xx-xxTxx:xx:xx-xx") ||
                 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),
                 parsePart2(str, 5)-1,
@@ -115,7 +123,8 @@ public final class DateUtils {
                 checkLayout(str, "xxxx:xx:xx xx:xx:xx.xxx") ||
                 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),
                 parsePart2(str, 5)-1,
@@ -133,7 +142,6 @@ public final class DateUtils {
         } else {
             // 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)
                 return d.getTime();
@@ -146,6 +154,12 @@ public final class DateUtils {
         }
     }
 
+    private static Calendar getLocalCalendar() {
+        final Calendar c = calendarLocale;
+        c.setTimeZone(TimeZone.getDefault());
+        return c;
+    }
+
     private static String toXmlFormat(GregorianCalendar cal) {
         XMLGregorianCalendar xgc = XML_DATE.newXMLGregorianCalendar(cal);
         if (cal.get(Calendar.MILLISECOND) == 0) {
@@ -315,12 +329,4 @@ public final class DateUtils {
         CheckParameterUtil.ensureParameterNotNull(datetime, "datetime");
         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);
-    }
 }
diff --git a/test/unit/org/openstreetmap/josm/tools/ExifReaderTest.java b/test/unit/org/openstreetmap/josm/tools/ExifReaderTest.java
index 7ae3e3a..658ba4f 100644
--- a/test/unit/org/openstreetmap/josm/tools/ExifReaderTest.java
+++ b/test/unit/org/openstreetmap/josm/tools/ExifReaderTest.java
@@ -14,7 +14,6 @@ import java.util.Date;
 import java.util.GregorianCalendar;
 import java.util.TimeZone;
 
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -22,7 +21,6 @@ import org.openstreetmap.josm.TestUtils;
 import org.openstreetmap.josm.data.coor.LatLon;
 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;
 
@@ -36,7 +34,7 @@ public class ExifReaderTest {
      */
     @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;
 
@@ -47,15 +45,6 @@ public class ExifReaderTest {
     public void setUp() {
         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);
     }
 
     /**
@@ -65,6 +54,11 @@ public class ExifReaderTest {
     @Test
     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);
     }
 
@@ -76,6 +70,12 @@ public class ExifReaderTest {
     public void testReadTimeSubSecond1() throws ParseException {
         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);
     }
 
@@ -116,6 +116,6 @@ public class ExifReaderTest {
     public void testTicket11685() throws IOException {
         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);
     }
 }
diff --git a/test/unit/org/openstreetmap/josm/tools/UtilsTest.java b/test/unit/org/openstreetmap/josm/tools/UtilsTest.java
index bffa099..cbe2b8b 100644
--- a/test/unit/org/openstreetmap/josm/tools/UtilsTest.java
+++ b/test/unit/org/openstreetmap/josm/tools/UtilsTest.java
@@ -12,11 +12,16 @@ import java.util.Locale;
 import org.junit.Assert;
 import org.junit.Test;
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.testutils.JOSMTestRules;
 
 /**
  * Unit tests of {@link Utils} class.
  */
 public class UtilsTest {
+    /**
+     * Use default, basic test rules.
+     */
+    public JOSMTestRules rules = new JOSMTestRules();
 
     /**
      * Test of {@link Utils#strip} method.
diff --git a/test/unit/org/openstreetmap/josm/tools/date/DateUtilsTest.java b/test/unit/org/openstreetmap/josm/tools/date/DateUtilsTest.java
index 9e55379..06803a7 100644
--- a/test/unit/org/openstreetmap/josm/tools/date/DateUtilsTest.java
+++ b/test/unit/org/openstreetmap/josm/tools/date/DateUtilsTest.java
@@ -33,7 +33,6 @@ public class DateUtilsTest {
      * @param zone the timezone to use
      */
     public static void setTimeZone(TimeZone zone) {
-        DateUtils.setTimeZone(zone);
         TimeZone.setDefault(zone);
     }
 
