提交 586bd8b4 authored 作者: Evgenij Ryazanov's avatar Evgenij Ryazanov

Add and use fast DateTimeUtils.absoluteDayFromYear()

上级 5ba9d11d
...@@ -744,8 +744,7 @@ public class DateTimeUtils { ...@@ -744,8 +744,7 @@ public class DateTimeUtils {
* @return number of day in year * @return number of day in year
*/ */
public static int getDayOfYear(long dateValue) { public static int getDayOfYear(long dateValue) {
int year = yearFromDateValue(dateValue); return (int) (absoluteDayFromDateValue(dateValue) - absoluteDayFromYear(yearFromDateValue(dateValue))) + 1;
return (int) (absoluteDayFromDateValue(dateValue) - absoluteDayFromDateValue(dateValue(year, 1, 1))) + 1;
} }
/** /**
...@@ -825,7 +824,7 @@ public class DateTimeUtils { ...@@ -825,7 +824,7 @@ public class DateTimeUtils {
} }
private static long getWeekOfYearBase(int year, int firstDayOfWeek, int minimalDaysInFirstWeek) { private static long getWeekOfYearBase(int year, int firstDayOfWeek, int minimalDaysInFirstWeek) {
long first = absoluteDayFromDateValue(dateValue(year, 1, 1)); long first = absoluteDayFromYear(year);
int daysInFirstWeek = 8 - getDayOfWeekFromAbsolute(first, firstDayOfWeek); int daysInFirstWeek = 8 - getDayOfWeekFromAbsolute(first, firstDayOfWeek);
long base = first + daysInFirstWeek; long base = first + daysInFirstWeek;
if (daysInFirstWeek >= minimalDaysInFirstWeek) { if (daysInFirstWeek >= minimalDaysInFirstWeek) {
...@@ -1230,6 +1229,26 @@ public class DateTimeUtils { ...@@ -1230,6 +1229,26 @@ public class DateTimeUtils {
return ValueTimestampTimeZone.fromDateValueAndNanos(dateValue, timeNanos, (short) offsetMins); return ValueTimestampTimeZone.fromDateValueAndNanos(dateValue, timeNanos, (short) offsetMins);
} }
/**
* Calculate the absolute day for a January, 1 of the specified year.
*
* @param year
* the year
* @return the absolute day
*/
public static long absoluteDayFromYear(long year) {
year--;
long a = ((year * 2922L) >> 3) - 719_177;
if (year < 1582) {
// Julian calendar
a += 13;
} else if (year < 1900 || year > 2099) {
// Gregorian calendar (slow mode)
a += (year / 400) - (year / 100) + 15;
}
return a;
}
/** /**
* Calculate the absolute day from an encoded date value. * Calculate the absolute day from an encoded date value.
* *
......
...@@ -91,8 +91,7 @@ public class ToDateParser { ...@@ -91,8 +91,7 @@ public class ToDateParser {
} }
if (doyValid) { if (doyValid) {
dateValue = DateTimeUtils.dateValueFromAbsoluteDay( dateValue = DateTimeUtils.dateValueFromAbsoluteDay(
DateTimeUtils.absoluteDayFromDateValue(DateTimeUtils.dateValue(year, 1, 1)) DateTimeUtils.absoluteDayFromYear(year) + dayOfYear - 1);
+ dayOfYear - 1);
} else { } else {
int month = this.month; int month = this.month;
if (month == 0) { if (month == 0) {
......
...@@ -371,6 +371,9 @@ public class TestDate extends TestBase { ...@@ -371,6 +371,9 @@ public class TestDate extends TestBase {
if (abs != next && next != Long.MIN_VALUE) { if (abs != next && next != Long.MIN_VALUE) {
assertEquals(abs, next); assertEquals(abs, next);
} }
if (m == 1 && d == 1) {
assertEquals(abs, DateTimeUtils.absoluteDayFromYear(y));
}
next = abs + 1; next = abs + 1;
long d2 = DateTimeUtils.dateValueFromAbsoluteDay(abs); long d2 = DateTimeUtils.dateValueFromAbsoluteDay(abs);
assertEquals(date, d2); assertEquals(date, d2);
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论