On Wed, 15 Mar 2023 19:50:46 GMT, Naoto Sato <na...@openjdk.org> wrote:

>> This PR fixes the bug which occurred when `Calendar.roll(WEEK_OF_YEAR)` 
>> rolled into a minimal first week with an invalid `WEEK_OF_YEAR` and 
>> `DAY_OF_WEEK` combo.
>> 
>> For example, Rolling _Monday, 30 December 2019_ by 1 week produced _Monday, 
>> 31 December 2018_, which is incorrect. This is because `WEEK_OF_YEAR` is 
>> rolled from 52 to 1, and the original `DAY_OF_WEEK` is 1. However, there is 
>> no Monday in week 1 of 2019. This is exposed when a future method calls 
>> `Calendar.complete()`, which eventually calculates a `fixedDate` with the 
>> invalid `WEEK_OF_YEAR` and `DAY_OF_WEEK` combo.
>> 
>> To prevent this, a check is added for rolls into week 1, which determines if 
>> the first week is minimal. If it is indeed minimal, then it is checked if  
>> `DAY_OF_WEEK` exists in that week, if not, `WEEK_OF_YEAR` must be 
>> incremented by one.
>> 
>> After the fix, Rolling _Monday, 30 December 2019_ by 1 week produces 
>> _Monday, 7 January 2019_
>
> src/java.base/share/classes/java/util/GregorianCalendar.java line 3030:
> 
>> 3028:         }
>> 3029:     }
>> 3030: 
> 
> Are these `GregorianCalendar` specific? What about other calendars?

Good point, these are _probably_ applicable to the other calendars, will take 
another look there.

-------------

PR: https://git.openjdk.org/jdk/pull/13031

Reply via email to