diff --git a/app/src/main/java/org/tasks/compose/pickers/DatePickerDialog.kt b/app/src/main/java/org/tasks/compose/pickers/DatePickerDialog.kt index 740c7ea5a..94e173a15 100644 --- a/app/src/main/java/org/tasks/compose/pickers/DatePickerDialog.kt +++ b/app/src/main/java/org/tasks/compose/pickers/DatePickerDialog.kt @@ -25,7 +25,11 @@ fun DatePickerDialog( ) { val initialDateUTC by remember(initialDate) { derivedStateOf { - DateTime(initialDate).toUTC().millis + // DateTime(initialDate).toUTC().millis + // DateTime.toUTC() does not change DateTime.millis value, but DatePicker expects it + // is in local timezone and decrements it by TimeZone.offset. This shifts the date to + // the previous date in timezones to East of GMT, which is unexpected + DateTime(initialDate).let { it.millis + it.offset } } } val datePickerState = rememberDatePickerState( diff --git a/app/src/main/java/org/tasks/repeats/CustomRecurrenceViewModel.kt b/app/src/main/java/org/tasks/repeats/CustomRecurrenceViewModel.kt index 7b232cf04..d5cd03d3a 100644 --- a/app/src/main/java/org/tasks/repeats/CustomRecurrenceViewModel.kt +++ b/app/src/main/java/org/tasks/repeats/CustomRecurrenceViewModel.kt @@ -172,7 +172,11 @@ class CustomRecurrenceViewModel @Inject constructor( builder.interval(state.interval) } when (state.endSelection) { - 1 -> builder.until(Date(state.endDate)) + // 1 -> builder.until(Date(state.endDate)) + // builder.until expects that Date() is in local timezone and strips it, which effectively + // equivalent to decrementing the "endDate" value by TimeZone.offset. This changes the date + // to the previous day in timezones to the East of GMT, so this value shall be pre-shifted + 1 -> builder.until(Date(DateTime(state.endDate).let { it.millis + it.offset })) 2 -> builder.count(state.endCount.coerceAtLeast(1)) } return builder.build().toString()