From faa81a73a5a9973fc82474168c34557366e97852 Mon Sep 17 00:00:00 2001 From: Frank Tang Date: Wed, 8 Jan 2025 16:32:11 -0800 Subject: [PATCH] ICU-22991 Fix Java --- .../src/main/java/com/ibm/icu/impl/Grego.java | 41 ++++++++----------- 1 file changed, 18 insertions(+), 23 deletions(-) diff --git a/icu4j/main/core/src/main/java/com/ibm/icu/impl/Grego.java b/icu4j/main/core/src/main/java/com/ibm/icu/impl/Grego.java index 76529ca45a1a..50f38efa8b4d 100644 --- a/icu4j/main/core/src/main/java/com/ibm/icu/impl/Grego.java +++ b/icu4j/main/core/src/main/java/com/ibm/icu/impl/Grego.java @@ -107,9 +107,8 @@ public static long fieldsToDay(int year, int month, int dom) { * @return the day of week */ public static int dayOfWeek(long day) { - long[] remainder = new long[1]; - floorDivide(day + 5 /* Calendar.THURSDAY */, 7, remainder); - int dayOfWeek = (int)remainder[0]; + Pair result = floorDivideAndRemainer(day + 5 /* Calendar.THURSDAY */, 7); + int dayOfWeek = result.second; dayOfWeek = (dayOfWeek == 0) ? 7 : dayOfWeek; return dayOfWeek; } @@ -117,15 +116,14 @@ public static int dayOfWeek(long day) { public static Pair dayToYear(long day) { // Convert from 1970 CE epoch to 1 CE epoch (Gregorian calendar) day += JULIAN_1970_CE - JULIAN_1_CE; - long[] rem = new long[1]; - long n400 = floorDivide(day, 146097, rem); - long n100 = floorDivide(rem[0], 36524, rem); - long n4 = floorDivide(rem[0], 1461, rem); - long n1 = floorDivide(rem[0], 365, rem); - - int year = (int)(400 * n400 + 100 * n100 + 4 * n4 + n1); - int dayOfYear = (int)rem[0]; - if (n100 == 4 || n1 == 4) { + Pair n400 = floorDivideAndRemainer(day, 146097); + Pair n100 = floorDivideAndRemainer(n400.second, 36524); + Pair n4 = floorDivideAndRemainer(n100.second, 1461); + Pair n1 = floorDivideAndRemainer(n4.second, 365); + + int year = (int)(400 * n400.first + 100 * n100.first + 4 * n4.first + n1.first); + int dayOfYear = n1.second; + if (n100.first == 4 || n1.first == 4) { dayOfYear = 365; // Dec 31 at end of 4- or 400-yr cycle } else { @@ -182,15 +180,14 @@ public static int[] timeToFields(long time, int[] fields) { if (fields == null || fields.length < 6) { fields = new int[6]; } - long[] remainder = new long[1]; - long day = floorDivide(time, 24*60*60*1000 /* milliseconds per day */, remainder); - dayToFields(day, fields); - fields[5] = (int)remainder[0]; + Pair result = floorDivideAndRemainer(time, 24*60*60*1000 /* milliseconds per day */); + dayToFields(result.first, fields); + fields[5] = result.second; return fields; } public static int timeToYear(long time) { - return dayToYear(floorDivide(time, 24*60*60*1000 /* milliseconds per day */, new long[1])).first; + return dayToYear(floorDivideAndRemainer(time, 24*60*60*1000 /* milliseconds per day */).first).first; } public static long floorDivide(long numerator, long denominator) { @@ -201,14 +198,12 @@ public static long floorDivide(long numerator, long denominator) { ((numerator + 1) / denominator) - 1; } - private static long floorDivide(long numerator, long denominator, long[] remainder) { + private static Pair floorDivideAndRemainer(long numerator, int denominator) { if (numerator >= 0) { - remainder[0] = numerator % denominator; - return numerator / denominator; + return new Pair(floorDivide(numerator, denominator), (int)(numerator % denominator)); } - long quotient = ((numerator + 1) / denominator) - 1; - remainder[0] = numerator - (quotient * denominator); - return quotient; + long quotient = floorDivide(numerator, denominator); + return new Pair(quotient, (int)(numerator - (quotient * denominator))); } /*