in amoro-format-mixed/amoro-mixed-flink/amoro-mixed-flink-common/src/main/java/org/apache/amoro/flink/util/DateTimeUtils.java [957:1022]
private static int julianExtract(TimeUnitRange range, int julian) {
int j = julian + 32044;
int g = j / 146097;
int dg = j % 146097;
int c = (dg / 36524 + 1) * 3 / 4;
int dc = dg - c * 36524;
int b = dc / 1461;
int db = dc % 1461;
int a = (db / 365 + 1) * 3 / 4;
int da = db - a * 365;
int y = g * 400 + c * 100 + b * 4 + a;
int m = (da * 5 + 308) / 153 - 2;
int d = da - (m + 4) * 153 / 5 + 122;
int year = y - 4800 + (m + 2) / 12;
int month = (m + 2) % 12 + 1;
int day = d + 1;
switch (range) {
case YEAR:
return year;
case YEAR_TO_MONTH:
case DAY_TO_SECOND:
case DAY_TO_MINUTE:
case DAY_TO_HOUR:
case HOUR:
case HOUR_TO_MINUTE:
case HOUR_TO_SECOND:
case MINUTE_TO_SECOND:
case MINUTE:
case SECOND:
case EPOCH:
default:
throw new AssertionError(range);
case MONTH:
return month;
case DAY:
return day;
case ISOYEAR:
int weekNumber = getIso8601WeekNumber(julian, year, month, day);
if (weekNumber == 1 && month == 12) {
return year + 1;
} else {
if (month == 1 && weekNumber > 50) {
return year - 1;
}
return year;
}
case QUARTER:
return (month + 2) / 3;
case DOW:
return (int) floorMod(julian + 1, 7L) + 1;
case ISODOW:
return (int) floorMod(julian, 7L) + 1;
case WEEK:
return getIso8601WeekNumber(julian, year, month, day);
case DOY:
long janFirst = ymdToJulian(year, 1, 1);
return (int) ((long) julian - janFirst) + 1;
case DECADE:
return year / 10;
case CENTURY:
return year > 0 ? (year + 99) / 100 : (year - 99) / 100;
case MILLENNIUM:
return year > 0 ? (year + 999) / 1000 : (year - 999) / 1000;
}
}