提交 0e6a9baa authored 作者: Sergi Vladykin's avatar Sergi Vladykin

Merge pull request #224 from stevemcleod/moscow_timezone_fix

Fix for date-handling error in "Europe/Moscow" timezone with Java 1.8.0_60
...@@ -91,6 +91,7 @@ public class DateTimeUtils { ...@@ -91,6 +91,7 @@ public class DateTimeUtils {
c = Calendar.getInstance(); c = Calendar.getInstance();
CACHED_CALENDAR.set(c); CACHED_CALENDAR.set(c);
} }
c.clear();
return c; return c;
} }
...@@ -106,6 +107,7 @@ public class DateTimeUtils { ...@@ -106,6 +107,7 @@ public class DateTimeUtils {
c = Calendar.getInstance(tz); c = Calendar.getInstance(tz);
CACHED_CALENDAR_NON_DEFAULT_TIMEZONE.set(c); CACHED_CALENDAR_NON_DEFAULT_TIMEZONE.set(c);
} }
c.clear();
return c; return c;
} }
...@@ -423,7 +425,6 @@ public class DateTimeUtils { ...@@ -423,7 +425,6 @@ public class DateTimeUtils {
} else { } else {
c = getCalendar(tz); c = getCalendar(tz);
} }
c.clear();
c.setLenient(lenient); c.setLenient(lenient);
setCalendarFields(c, year, month, day, hour, minute, second, millis); setCalendarFields(c, year, month, day, hour, minute, second, millis);
return c.getTime().getTime(); return c.getTime().getTime();
...@@ -490,7 +491,8 @@ public class DateTimeUtils { ...@@ -490,7 +491,8 @@ public class DateTimeUtils {
* @return the milliseconds * @return the milliseconds
*/ */
public static long getTimeLocalWithoutDst(java.util.Date d) { public static long getTimeLocalWithoutDst(java.util.Date d) {
return d.getTime() + getCalendar().get(Calendar.ZONE_OFFSET); Calendar calendar = getCalendar();
return d.getTime() + calendar.get(Calendar.ZONE_OFFSET);
} }
/** /**
...@@ -503,7 +505,6 @@ public class DateTimeUtils { ...@@ -503,7 +505,6 @@ public class DateTimeUtils {
public static long getTimeUTCWithoutDst(long millis) { public static long getTimeUTCWithoutDst(long millis) {
return millis - getCalendar().get(Calendar.ZONE_OFFSET); return millis - getCalendar().get(Calendar.ZONE_OFFSET);
} }
/** /**
* Return the day of week according to the ISO 8601 specification. Week * Return the day of week according to the ISO 8601 specification. Week
* starts at Monday. See also http://en.wikipedia.org/wiki/ISO_8601 * starts at Monday. See also http://en.wikipedia.org/wiki/ISO_8601
...@@ -772,7 +773,6 @@ public class DateTimeUtils { ...@@ -772,7 +773,6 @@ public class DateTimeUtils {
*/ */
public static long dateValueFromDate(long ms) { public static long dateValueFromDate(long ms) {
Calendar cal = getCalendar(); Calendar cal = getCalendar();
cal.clear();
cal.setTimeInMillis(ms); cal.setTimeInMillis(ms);
return dateValueFromCalendar(cal); return dateValueFromCalendar(cal);
} }
...@@ -800,7 +800,6 @@ public class DateTimeUtils { ...@@ -800,7 +800,6 @@ public class DateTimeUtils {
*/ */
public static long nanosFromDate(long ms) { public static long nanosFromDate(long ms) {
Calendar cal = getCalendar(); Calendar cal = getCalendar();
cal.clear();
cal.setTimeInMillis(ms); cal.setTimeInMillis(ms);
return nanosFromCalendar(cal); return nanosFromCalendar(cal);
} }
......
...@@ -473,6 +473,12 @@ public class TestDate extends TestBase { ...@@ -473,6 +473,12 @@ public class TestDate extends TestBase {
ts2.getTimestamp(), Calendar.getInstance()); ts2.getTimestamp(), Calendar.getInstance());
assertEquals("-999-08-07 13:14:15.16", ts1a.getString()); assertEquals("-999-08-07 13:14:15.16", ts1a.getString());
assertEquals("19999-08-07 13:14:15.16", ts2a.getString()); assertEquals("19999-08-07 13:14:15.16", ts2a.getString());
// test for bug on Java 1.8.0_60 in "Europe/Moscow" timezone. Doesn't affect most other timezones
long millis = 1407437460000L;
long result1 = DateTimeUtils.nanosFromDate(DateTimeUtils.getTimeUTCWithoutDst(millis));
long result2 = DateTimeUtils.nanosFromDate(DateTimeUtils.getTimeUTCWithoutDst(millis));
assertEquals(result1, result2);
} }
} }
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论