From 70ff2ad79f3af87ddd7e5761434cc0ebaa9b81b3 Mon Sep 17 00:00:00 2001 From: Hady <71843721+hady-exc@users.noreply.github.com> Date: Fri, 21 Mar 2025 10:52:43 +0200 Subject: [PATCH] fix of two minor misbehaviors in date-time handling (#3248) --- .../main/java/org/tasks/compose/pickers/DatePickerDialog.kt | 6 +++++- .../java/org/tasks/repeats/CustomRecurrenceViewModel.kt | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) 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()