提交 96b50c6f authored 作者: Steve McLeod's avatar Steve McLeod

Fix for date-handling error affecting "Europe/Moscow" timezone with Java 1.8.0_60

上级 1e48ee39
...@@ -501,9 +501,12 @@ public class DateTimeUtils { ...@@ -501,9 +501,12 @@ public class DateTimeUtils {
* @return the number of milliseconds in UTC * @return the number of milliseconds in UTC
*/ */
public static long getTimeUTCWithoutDst(long millis) { public static long getTimeUTCWithoutDst(long millis) {
return millis - getCalendar().get(Calendar.ZONE_OFFSET); Calendar calendar = getCalendar();
// clearing calendar is work-around for bug with "Europe/Moscow" timezone with Java 1.8.0_60
// if calendar is not cleared, then subsequent calls to this method with the same input return different values.
calendar.clear();
return millis - calendar.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
......
...@@ -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 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论