Unverified 提交 a1cf2956 authored 作者: Noel Grandin's avatar Noel Grandin 提交者: GitHub

Merge pull request #835 from katzyn/datetime2

Inline getTimeTry() into DateTimeUtils.getMillis()
...@@ -67,12 +67,12 @@ public class DateTimeUtils { ...@@ -67,12 +67,12 @@ public class DateTimeUtils {
* have that problem, and while it is still a small memory leak, it is not a * have that problem, and while it is still a small memory leak, it is not a
* class loader memory leak. * class loader memory leak.
*/ */
private static final ThreadLocal<Calendar> CACHED_CALENDAR = new ThreadLocal<>(); private static final ThreadLocal<GregorianCalendar> CACHED_CALENDAR = new ThreadLocal<>();
/** /**
* A cached instance of Calendar used when a timezone is specified. * A cached instance of Calendar used when a timezone is specified.
*/ */
private static final ThreadLocal<Calendar> CACHED_CALENDAR_NON_DEFAULT_TIMEZONE = private static final ThreadLocal<GregorianCalendar> CACHED_CALENDAR_NON_DEFAULT_TIMEZONE =
new ThreadLocal<>(); new ThreadLocal<>();
/** /**
...@@ -104,8 +104,8 @@ public class DateTimeUtils { ...@@ -104,8 +104,8 @@ public class DateTimeUtils {
* *
* @return a calendar instance. A cached instance is returned where possible * @return a calendar instance. A cached instance is returned where possible
*/ */
private static Calendar getCalendar() { private static GregorianCalendar getCalendar() {
Calendar c = CACHED_CALENDAR.get(); GregorianCalendar c = CACHED_CALENDAR.get();
if (c == null) { if (c == null) {
c = DateTimeUtils.createGregorianCalendar(); c = DateTimeUtils.createGregorianCalendar();
CACHED_CALENDAR.set(c); CACHED_CALENDAR.set(c);
...@@ -120,8 +120,8 @@ public class DateTimeUtils { ...@@ -120,8 +120,8 @@ public class DateTimeUtils {
* @param tz timezone for the calendar, is never null * @param tz timezone for the calendar, is never null
* @return a calendar instance. A cached instance is returned where possible * @return a calendar instance. A cached instance is returned where possible
*/ */
private static Calendar getCalendar(TimeZone tz) { private static GregorianCalendar getCalendar(TimeZone tz) {
Calendar c = CACHED_CALENDAR_NON_DEFAULT_TIMEZONE.get(); GregorianCalendar c = CACHED_CALENDAR_NON_DEFAULT_TIMEZONE.get();
if (c == null || !c.getTimeZone().equals(tz)) { if (c == null || !c.getTimeZone().equals(tz)) {
c = DateTimeUtils.createGregorianCalendar(tz); c = DateTimeUtils.createGregorianCalendar(tz);
CACHED_CALENDAR_NON_DEFAULT_TIMEZONE.set(c); CACHED_CALENDAR_NON_DEFAULT_TIMEZONE.set(c);
...@@ -139,7 +139,7 @@ public class DateTimeUtils { ...@@ -139,7 +139,7 @@ public class DateTimeUtils {
* *
* @return a new calendar instance. * @return a new calendar instance.
*/ */
public static Calendar createGregorianCalendar() { public static GregorianCalendar createGregorianCalendar() {
return new GregorianCalendar(); return new GregorianCalendar();
} }
...@@ -153,7 +153,7 @@ public class DateTimeUtils { ...@@ -153,7 +153,7 @@ public class DateTimeUtils {
* @param tz timezone for the calendar, is never null * @param tz timezone for the calendar, is never null
* @return a new calendar instance. * @return a new calendar instance.
*/ */
public static Calendar createGregorianCalendar(TimeZone tz) { public static GregorianCalendar createGregorianCalendar(TimeZone tz) {
return new GregorianCalendar(tz); return new GregorianCalendar(tz);
} }
...@@ -522,9 +522,15 @@ public class DateTimeUtils { ...@@ -522,9 +522,15 @@ public class DateTimeUtils {
*/ */
public static long getMillis(TimeZone tz, int year, int month, int day, public static long getMillis(TimeZone tz, int year, int month, int day,
int hour, int minute, int second, int millis) { int hour, int minute, int second, int millis) {
GregorianCalendar c;
if (tz == null) {
c = getCalendar();
} else {
c = getCalendar(tz);
}
c.setLenient(false);
try { try {
return getTimeTry(false, tz, year, month, day, hour, minute, second, return convertToMillis(c, year, month, day, hour, minute, second, millis);
millis);
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
// special case: if the time simply doesn't exist because of // special case: if the time simply doesn't exist because of
// daylight saving time changes, use the lenient version // daylight saving time changes, use the lenient version
...@@ -533,12 +539,10 @@ public class DateTimeUtils { ...@@ -533,12 +539,10 @@ public class DateTimeUtils {
if (hour < 0 || hour > 23) { if (hour < 0 || hour > 23) {
throw e; throw e;
} }
return getTimeTry(true, tz, year, month, day, hour, minute,
second, millis);
} else if (message.indexOf("DAY_OF_MONTH") > 0) { } else if (message.indexOf("DAY_OF_MONTH") > 0) {
int maxDay; int maxDay;
if (month == 2) { if (month == 2) {
maxDay = new GregorianCalendar().isLeapYear(year) ? 29 : 28; maxDay = c.isLeapYear(year) ? 29 : 28;
} else { } else {
maxDay = 30 + ((month + (month > 7 ? 1 : 0)) & 1); maxDay = 30 + ((month + (month > 7 ? 1 : 0)) & 1);
} }
...@@ -549,27 +553,12 @@ public class DateTimeUtils { ...@@ -549,27 +553,12 @@ public class DateTimeUtils {
// using the timezone Brasilia and others, // using the timezone Brasilia and others,
// for example for 2042-10-12 00:00:00. // for example for 2042-10-12 00:00:00.
hour += 6; hour += 6;
return getTimeTry(true, tz, year, month, day, hour, minute,
second, millis);
} else {
return getTimeTry(true, tz, year, month, day, hour, minute,
second, millis);
} }
c.setLenient(true);
return convertToMillis(c, year, month, day, hour, minute, second, millis);
} }
} }
private static long getTimeTry(boolean lenient, TimeZone tz, int year,
int month, int day, int hour, int minute, int second, int millis) {
Calendar c;
if (tz == null) {
c = getCalendar();
} else {
c = getCalendar(tz);
}
c.setLenient(lenient);
return convertToMillis(c, year, month, day, hour, minute, second, millis);
}
private static long convertToMillis(Calendar cal, int year, int month, int day, private static long convertToMillis(Calendar cal, int year, int month, int day,
int hour, int minute, int second, int millis) { int hour, int minute, int second, int millis) {
if (year <= 0) { if (year <= 0) {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论