From f007a9236b6ee6dc38bb2f001528aeaf4e743a39 Mon Sep 17 00:00:00 2001 From: TommyDL-Infomaniak Date: Mon, 18 Nov 2024 09:09:07 +0100 Subject: [PATCH 1/9] feat: Add methods to DateUtils for more flexibility --- .../infomaniak/lib/core/utils/DateUtils.kt | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/Legacy/src/main/java/com/infomaniak/lib/core/utils/DateUtils.kt b/Legacy/src/main/java/com/infomaniak/lib/core/utils/DateUtils.kt index c90c1180..1db62518 100644 --- a/Legacy/src/main/java/com/infomaniak/lib/core/utils/DateUtils.kt +++ b/Legacy/src/main/java/com/infomaniak/lib/core/utils/DateUtils.kt @@ -28,6 +28,10 @@ import java.util.Date import java.util.Locale const val FORMAT_DATE_CLEAR_MONTH = "dd MMM yyyy" +const val FORMAT_DATE_CLEAR_FULL_MONTH = "EEEE d MMMM yyyy" +const val FORMAT_DATE_DAY_MONTH = "EEE d MMM" +const val FORMAT_DATE_DAY_MONTH_YEAR = "EEE d MMM yyyy" +const val FORMAT_DATE_DAY_FULL_MONTH_WITH_TIME = "EEEE d MMMM HH:mm" const val FORMAT_DATE_DAY_FULL_MONTH_YEAR_WITH_TIME = "EEEE d MMMM yyyy HH:mm" const val FORMAT_DATE_CLEAR_MONTH_DAY_ONE_CHAR = "d MMM yyyy" const val FORMAT_DATE_DEFAULT = "dd.MM.yy" @@ -122,16 +126,33 @@ fun Date.day(): Int = time = this@day }.get(Calendar.DAY_OF_MONTH) +fun Date.setDay(day: Int): Date = Calendar.getInstance().apply { + time = this@setDay + set(Calendar.DAY_OF_MONTH, day) +}.time + fun Date.hours(): Int = Calendar.getInstance().apply { time = this@hours }.get(Calendar.HOUR_OF_DAY) +fun Date.setHour(hour: Int): Date = Calendar.getInstance().apply { + time = this@setHour + set(Calendar.HOUR_OF_DAY, hour) + + this@setHour.time = time.time +}.time + fun Date.minutes(): Int = Calendar.getInstance().apply { time = this@minutes }.get(Calendar.MINUTE) +fun Date.setMinute(minute: Int): Date = Calendar.getInstance().apply { + time = this@setMinute + set(Calendar.MINUTE, minute) +}.time + fun Date.isSameDayAs(targetDate: Date): Boolean { return year() == targetDate.year() && month() == targetDate.month() && @@ -157,6 +178,48 @@ fun Date.isThisWeek(): Boolean { return this in now.startOfTheWeek()..now.endOfTheWeek() } +fun Date.isWeekend(): Boolean = this.day() in 6..7 + fun Date.isThisMonth(): Boolean = Date().let { now -> year() == now.year() && month() == now.month() } fun Date.isThisYear(): Boolean = Date().let { now -> year() == now.year() } + +fun Date.roundUpToNextFiveMinutes(): Date = Calendar.getInstance().apply { + time = this@roundUpToNextFiveMinutes + + val minutesToAdd = 5 - (get(Calendar.MINUTE) % 5) + + add(Calendar.MINUTE, minutesToAdd) + set(Calendar.SECOND, 0) +}.time + +fun Date.getTimeAtHour(hour: Int): Date = Calendar.getInstance().apply { + time = this@getTimeAtHour + + set(Calendar.HOUR_OF_DAY, hour) + set(Calendar.MINUTE, 0) + set(Calendar.SECOND, 0) + set(Calendar.MILLISECOND, 0) +}.time + +fun Date.getMorning(): Date = this.getTimeAtHour(8) + +fun Date.getAfternoon(): Date = this.getTimeAtHour(14) + +fun Date.getEvening(): Date = this.getTimeAtHour(18) + +fun Date.getTomorrow(): Date = Calendar.getInstance().apply { + time = this@getTomorrow + add(Calendar.DAY_OF_YEAR, 1) +}.time + +fun Date.getNextMonday(): Date = Calendar.getInstance().apply { + time = this@getNextMonday + + val daysToAdd = (Calendar.MONDAY - get(Calendar.DAY_OF_WEEK) + 7) % 7 + if (daysToAdd == 0) { + add(Calendar.DAY_OF_YEAR, 7) + } else { + add(Calendar.DAY_OF_YEAR, daysToAdd) + } +}.time From 2a4cf2d1dc01758d4d8725c5d4c0443af0a39f5e Mon Sep 17 00:00:00 2001 From: TommyDL-Infomaniak Date: Fri, 29 Nov 2024 15:21:31 +0100 Subject: [PATCH 2/9] feat: Add date format for message scheduling --- Legacy/src/main/java/com/infomaniak/lib/core/utils/DateUtils.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/Legacy/src/main/java/com/infomaniak/lib/core/utils/DateUtils.kt b/Legacy/src/main/java/com/infomaniak/lib/core/utils/DateUtils.kt index 1db62518..667878b9 100644 --- a/Legacy/src/main/java/com/infomaniak/lib/core/utils/DateUtils.kt +++ b/Legacy/src/main/java/com/infomaniak/lib/core/utils/DateUtils.kt @@ -37,6 +37,7 @@ const val FORMAT_DATE_CLEAR_MONTH_DAY_ONE_CHAR = "d MMM yyyy" const val FORMAT_DATE_DEFAULT = "dd.MM.yy" const val FORMAT_DATE_HOUR_MINUTE = "HH:mm" const val FORMAT_DATE_SHORT_DAY_ONE_CHAR = "d MMM" +const val FORMAT_SCHEDULE_MAIL = "yyyy-MM-dd'T'HH:mm:ssXXX" const val FORMAT_DATE_WITH_TIMEZONE = "yyyy-MM-dd'T'HH:mm:ssZ" const val FORMAT_EVENT_DATE = "dd/MM/yyyy HH:mm" const val FORMAT_FULL_DATE = "EEEE dd MMMM yyyy" From f348fe6af227ace6a18e030c7abd6ab7b91ded7d Mon Sep 17 00:00:00 2001 From: TommyDL-Infomaniak Date: Tue, 24 Dec 2024 13:30:10 +0100 Subject: [PATCH 3/9] feat: Add date extension functions for checks and rounding --- .../infomaniak/lib/core/utils/DateUtils.kt | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/Legacy/src/main/java/com/infomaniak/lib/core/utils/DateUtils.kt b/Legacy/src/main/java/com/infomaniak/lib/core/utils/DateUtils.kt index 667878b9..e57ba032 100644 --- a/Legacy/src/main/java/com/infomaniak/lib/core/utils/DateUtils.kt +++ b/Legacy/src/main/java/com/infomaniak/lib/core/utils/DateUtils.kt @@ -167,6 +167,17 @@ fun Date.addDays(amount: Int): Date = Calendar.getInstance().apply { fun Date.isInTheFuture(): Boolean = after(Date()) +// TODO: Check how much a date needs to be in the future (on the API side). +fun Date.isAtLeastTenMinutesInTheFuture(): Boolean { + val dateTenMinutesLater = Calendar.getInstance().apply { + time = Date() + + add(Calendar.MINUTE, 10) + }.time + + return after(dateTenMinutesLater) +} + fun Date.isToday(): Boolean = isSameDayAs(Date()) fun Date.isYesterday(): Boolean { @@ -185,10 +196,14 @@ fun Date.isThisMonth(): Boolean = Date().let { now -> year() == now.year() && mo fun Date.isThisYear(): Boolean = Date().let { now -> year() == now.year() } -fun Date.roundUpToNextFiveMinutes(): Date = Calendar.getInstance().apply { - time = this@roundUpToNextFiveMinutes +fun Date.roundUpToNextTenMinutes(): Date = Calendar.getInstance().apply { + time = this@roundUpToNextTenMinutes - val minutesToAdd = 5 - (get(Calendar.MINUTE) % 5) + val currentMinute = get(Calendar.MINUTE) + val minutesToAdd = when { + currentMinute % 5 == 0 -> 10 + else -> 5 - (currentMinute % 5) + 10 + } add(Calendar.MINUTE, minutesToAdd) set(Calendar.SECOND, 0) From cea8f4a48c822a6f23904e19cb5ebc6890bfed24 Mon Sep 17 00:00:00 2001 From: TommyDL-Infomaniak Date: Tue, 21 Jan 2025 11:24:35 +0100 Subject: [PATCH 4/9] feat: Modify Date.isAtLeastTenMinutesInTheFuture to make it generic --- .../main/java/com/infomaniak/lib/core/utils/DateUtils.kt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Legacy/src/main/java/com/infomaniak/lib/core/utils/DateUtils.kt b/Legacy/src/main/java/com/infomaniak/lib/core/utils/DateUtils.kt index e57ba032..e819bbde 100644 --- a/Legacy/src/main/java/com/infomaniak/lib/core/utils/DateUtils.kt +++ b/Legacy/src/main/java/com/infomaniak/lib/core/utils/DateUtils.kt @@ -1,6 +1,6 @@ /* * Infomaniak Core - Android - * Copyright (C) 2022-2024 Infomaniak Network SA + * Copyright (C) 2022-2025 Infomaniak Network SA * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -167,12 +167,11 @@ fun Date.addDays(amount: Int): Date = Calendar.getInstance().apply { fun Date.isInTheFuture(): Boolean = after(Date()) -// TODO: Check how much a date needs to be in the future (on the API side). -fun Date.isAtLeastTenMinutesInTheFuture(): Boolean { +fun Date.isAtLeastXMinutesInTheFuture(minutes: Int): Boolean { val dateTenMinutesLater = Calendar.getInstance().apply { time = Date() - add(Calendar.MINUTE, 10) + add(Calendar.MINUTE, minutes) }.time return after(dateTenMinutesLater) From 82f9d0e82a515bc89822c2656084d76bf748ae23 Mon Sep 17 00:00:00 2001 From: TommyDL-Infomaniak Date: Wed, 22 Jan 2025 09:04:49 +0100 Subject: [PATCH 5/9] feat: Add Date.addYears --- .../src/main/java/com/infomaniak/lib/core/utils/DateUtils.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Legacy/src/main/java/com/infomaniak/lib/core/utils/DateUtils.kt b/Legacy/src/main/java/com/infomaniak/lib/core/utils/DateUtils.kt index e819bbde..4170f0c0 100644 --- a/Legacy/src/main/java/com/infomaniak/lib/core/utils/DateUtils.kt +++ b/Legacy/src/main/java/com/infomaniak/lib/core/utils/DateUtils.kt @@ -117,6 +117,11 @@ fun Date.year(): Int = time = this@year }.get(Calendar.YEAR) +fun Date.addYears(years: Int): Date = Calendar.getInstance().apply { + time = this@addYears + add(Calendar.YEAR, years) +}.time + fun Date.month(): Int = Calendar.getInstance().apply { time = this@month From 3a1462a8fb61aacf20ff8275ab31bea88544196d Mon Sep 17 00:00:00 2001 From: TommyDL-Infomaniak Date: Thu, 23 Jan 2025 13:25:45 +0100 Subject: [PATCH 6/9] chore: Apply suggestions --- .../src/main/java/com/infomaniak/lib/core/utils/DateUtils.kt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Legacy/src/main/java/com/infomaniak/lib/core/utils/DateUtils.kt b/Legacy/src/main/java/com/infomaniak/lib/core/utils/DateUtils.kt index 4170f0c0..1ab42de8 100644 --- a/Legacy/src/main/java/com/infomaniak/lib/core/utils/DateUtils.kt +++ b/Legacy/src/main/java/com/infomaniak/lib/core/utils/DateUtils.kt @@ -145,8 +145,6 @@ fun Date.hours(): Int = fun Date.setHour(hour: Int): Date = Calendar.getInstance().apply { time = this@setHour set(Calendar.HOUR_OF_DAY, hour) - - this@setHour.time = time.time }.time fun Date.minutes(): Int = @@ -194,7 +192,7 @@ fun Date.isThisWeek(): Boolean { return this in now.startOfTheWeek()..now.endOfTheWeek() } -fun Date.isWeekend(): Boolean = this.day() in 6..7 +fun Date.isWeekend(): Boolean = this.day() == 6 || this.day() == 0 fun Date.isThisMonth(): Boolean = Date().let { now -> year() == now.year() && month() == now.month() } From 2f5ab6c0ad7cea3f03bf7cbb853e961d7e0e74ba Mon Sep 17 00:00:00 2001 From: Kevin Boulongne Date: Thu, 23 Jan 2025 14:02:26 +0100 Subject: [PATCH 7/9] fix: Date `isWeekend()` don't wrongly look at the day of the month anymore --- .../main/java/com/infomaniak/lib/core/utils/DateUtils.kt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Legacy/src/main/java/com/infomaniak/lib/core/utils/DateUtils.kt b/Legacy/src/main/java/com/infomaniak/lib/core/utils/DateUtils.kt index 1ab42de8..c91cad09 100644 --- a/Legacy/src/main/java/com/infomaniak/lib/core/utils/DateUtils.kt +++ b/Legacy/src/main/java/com/infomaniak/lib/core/utils/DateUtils.kt @@ -192,7 +192,13 @@ fun Date.isThisWeek(): Boolean { return this in now.startOfTheWeek()..now.endOfTheWeek() } -fun Date.isWeekend(): Boolean = this.day() == 6 || this.day() == 0 +fun Date.isWeekend(): Boolean { + val calendar = Calendar.getInstance().apply { + time = this@isWeekend + } + val day = calendar.get(Calendar.DAY_OF_WEEK) + return day == 1 || day == 7 +} fun Date.isThisMonth(): Boolean = Date().let { now -> year() == now.year() && month() == now.month() } From d754427c8ab02f9bfa34b62cb86b47fa23636e9a Mon Sep 17 00:00:00 2001 From: Kevin Boulongne Date: Thu, 23 Jan 2025 14:02:38 +0100 Subject: [PATCH 8/9] refactor: Clean DateUtils code --- .../infomaniak/lib/core/utils/DateUtils.kt | 127 ++++++++---------- 1 file changed, 57 insertions(+), 70 deletions(-) diff --git a/Legacy/src/main/java/com/infomaniak/lib/core/utils/DateUtils.kt b/Legacy/src/main/java/com/infomaniak/lib/core/utils/DateUtils.kt index c91cad09..4921f7be 100644 --- a/Legacy/src/main/java/com/infomaniak/lib/core/utils/DateUtils.kt +++ b/Legacy/src/main/java/com/infomaniak/lib/core/utils/DateUtils.kt @@ -44,6 +44,12 @@ const val FORMAT_FULL_DATE = "EEEE dd MMMM yyyy" const val FORMAT_FULL_DATE_WITH_HOUR = "EEEE MMM d yyyy HH:mm:ss" const val FORMAT_NEW_FILE = "yyyyMMdd_HHmmss" +enum class FormatData { + DATE, + HOUR, + BOTH, +} + fun Date.format(pattern: String = FORMAT_DATE_DEFAULT): String { val simpleDateFormat = SimpleDateFormat(pattern, Locale.getDefault()) return simpleDateFormat.format(this) @@ -60,97 +66,79 @@ fun Date.formatWithLocal(formatData: FormatData, formatStyle: FormatStyle, forma return toInstant().atZone(ZoneId.systemDefault()).format(formatter) } -enum class FormatData { - DATE, - HOUR, - BOTH, -} - -fun Date.startOfTheDay(): Date = - Calendar.getInstance().apply { - time = this@startOfTheDay - set(Calendar.HOUR_OF_DAY, 0) - set(Calendar.MINUTE, 0) - set(Calendar.SECOND, 0) - }.time +fun Date.startOfTheDay(): Date = Calendar.getInstance().apply { + time = this@startOfTheDay + set(Calendar.HOUR_OF_DAY, 0) + set(Calendar.MINUTE, 0) + set(Calendar.SECOND, 0) +}.time -fun Date.endOfTheDay(): Date = - Calendar.getInstance().apply { - time = this@endOfTheDay - set(Calendar.HOUR_OF_DAY, 23) - set(Calendar.MINUTE, 59) - set(Calendar.SECOND, 59) - }.time +fun Date.endOfTheDay(): Date = Calendar.getInstance().apply { + time = this@endOfTheDay + set(Calendar.HOUR_OF_DAY, 23) + set(Calendar.MINUTE, 59) + set(Calendar.SECOND, 59) +}.time -fun Date.startOfTomorrow(): Date = - Calendar.getInstance().apply { - time = this@startOfTomorrow - add(Calendar.DATE, 1) - }.time.startOfTheDay() - -fun Date.endOfTomorrow(): Date = - Calendar.getInstance().apply { - time = this@endOfTomorrow - add(Calendar.DATE, 1) - }.time.endOfTheDay() - -fun Date.startOfTheWeek(): Date = - Calendar.getInstance().apply { - time = this@startOfTheWeek - set(Calendar.DAY_OF_WEEK, firstDayOfWeek) - }.time.startOfTheDay() - -fun Date.endOfTheWeek(): Date = - Calendar.getInstance().apply { - time = this@endOfTheWeek - set(Calendar.DAY_OF_WEEK, (firstDayOfWeek - 1 + 6) % 7 + 1) - }.time.endOfTheDay() - -fun Date.monthsAgo(value: Int): Date = - Calendar.getInstance().apply { - time = this@monthsAgo - add(Calendar.MONTH, -value) - }.time +fun Date.startOfTomorrow(): Date = Calendar.getInstance().apply { + time = this@startOfTomorrow + add(Calendar.DATE, 1) +}.time.startOfTheDay() + +fun Date.endOfTomorrow(): Date = Calendar.getInstance().apply { + time = this@endOfTomorrow + add(Calendar.DATE, 1) +}.time.endOfTheDay() + +fun Date.startOfTheWeek(): Date = Calendar.getInstance().apply { + time = this@startOfTheWeek + set(Calendar.DAY_OF_WEEK, firstDayOfWeek) +}.time.startOfTheDay() + +fun Date.endOfTheWeek(): Date = Calendar.getInstance().apply { + time = this@endOfTheWeek + set(Calendar.DAY_OF_WEEK, (firstDayOfWeek - 1 + 6) % 7 + 1) +}.time.endOfTheDay() + +fun Date.monthsAgo(value: Int): Date = Calendar.getInstance().apply { + time = this@monthsAgo + add(Calendar.MONTH, -value) +}.time -fun Date.year(): Int = - Calendar.getInstance().apply { - time = this@year - }.get(Calendar.YEAR) +fun Date.year(): Int = Calendar.getInstance().apply { + time = this@year +}.get(Calendar.YEAR) fun Date.addYears(years: Int): Date = Calendar.getInstance().apply { time = this@addYears add(Calendar.YEAR, years) }.time -fun Date.month(): Int = - Calendar.getInstance().apply { - time = this@month - }.get(Calendar.MONTH) +fun Date.month(): Int = Calendar.getInstance().apply { + time = this@month +}.get(Calendar.MONTH) -fun Date.day(): Int = - Calendar.getInstance().apply { - time = this@day - }.get(Calendar.DAY_OF_MONTH) +fun Date.day(): Int = Calendar.getInstance().apply { + time = this@day +}.get(Calendar.DAY_OF_MONTH) fun Date.setDay(day: Int): Date = Calendar.getInstance().apply { time = this@setDay set(Calendar.DAY_OF_MONTH, day) }.time -fun Date.hours(): Int = - Calendar.getInstance().apply { - time = this@hours - }.get(Calendar.HOUR_OF_DAY) +fun Date.hours(): Int = Calendar.getInstance().apply { + time = this@hours +}.get(Calendar.HOUR_OF_DAY) fun Date.setHour(hour: Int): Date = Calendar.getInstance().apply { time = this@setHour set(Calendar.HOUR_OF_DAY, hour) }.time -fun Date.minutes(): Int = - Calendar.getInstance().apply { - time = this@minutes - }.get(Calendar.MINUTE) +fun Date.minutes(): Int = Calendar.getInstance().apply { + time = this@minutes +}.get(Calendar.MINUTE) fun Date.setMinute(minute: Int): Date = Calendar.getInstance().apply { time = this@setMinute @@ -173,7 +161,6 @@ fun Date.isInTheFuture(): Boolean = after(Date()) fun Date.isAtLeastXMinutesInTheFuture(minutes: Int): Boolean { val dateTenMinutesLater = Calendar.getInstance().apply { time = Date() - add(Calendar.MINUTE, minutes) }.time From f3de7a238a197a1f78503b82558713cc31b22807 Mon Sep 17 00:00:00 2001 From: Kevin Boulongne Date: Thu, 23 Jan 2025 14:33:47 +0100 Subject: [PATCH 9/9] refactor: Add regions in DateUtils code --- .../infomaniak/lib/core/utils/DateUtils.kt | 156 +++++++++--------- 1 file changed, 79 insertions(+), 77 deletions(-) diff --git a/Legacy/src/main/java/com/infomaniak/lib/core/utils/DateUtils.kt b/Legacy/src/main/java/com/infomaniak/lib/core/utils/DateUtils.kt index 4921f7be..b7f89919 100644 --- a/Legacy/src/main/java/com/infomaniak/lib/core/utils/DateUtils.kt +++ b/Legacy/src/main/java/com/infomaniak/lib/core/utils/DateUtils.kt @@ -44,6 +44,7 @@ const val FORMAT_FULL_DATE = "EEEE dd MMMM yyyy" const val FORMAT_FULL_DATE_WITH_HOUR = "EEEE MMM d yyyy HH:mm:ss" const val FORMAT_NEW_FILE = "yyyyMMdd_HHmmss" +//region Format Dates enum class FormatData { DATE, HOUR, @@ -65,7 +66,9 @@ fun Date.formatWithLocal(formatData: FormatData, formatStyle: FormatStyle, forma return toInstant().atZone(ZoneId.systemDefault()).format(formatter) } +//endregion +//region Get a new Date relatively to a given Date fun Date.startOfTheDay(): Date = Calendar.getInstance().apply { time = this@startOfTheDay set(Calendar.HOUR_OF_DAY, 0) @@ -80,15 +83,14 @@ fun Date.endOfTheDay(): Date = Calendar.getInstance().apply { set(Calendar.SECOND, 59) }.time -fun Date.startOfTomorrow(): Date = Calendar.getInstance().apply { - time = this@startOfTomorrow +fun Date.tomorrow(): Date = Calendar.getInstance().apply { + time = this@tomorrow add(Calendar.DATE, 1) -}.time.startOfTheDay() +}.time -fun Date.endOfTomorrow(): Date = Calendar.getInstance().apply { - time = this@endOfTomorrow - add(Calendar.DATE, 1) -}.time.endOfTheDay() +fun Date.startOfTomorrow(): Date = tomorrow().startOfTheDay() + +fun Date.endOfTomorrow(): Date = tomorrow().endOfTheDay() fun Date.startOfTheWeek(): Date = Calendar.getInstance().apply { time = this@startOfTheWeek @@ -105,92 +107,31 @@ fun Date.monthsAgo(value: Int): Date = Calendar.getInstance().apply { add(Calendar.MONTH, -value) }.time -fun Date.year(): Int = Calendar.getInstance().apply { - time = this@year -}.get(Calendar.YEAR) - fun Date.addYears(years: Int): Date = Calendar.getInstance().apply { time = this@addYears add(Calendar.YEAR, years) }.time -fun Date.month(): Int = Calendar.getInstance().apply { - time = this@month -}.get(Calendar.MONTH) - -fun Date.day(): Int = Calendar.getInstance().apply { - time = this@day -}.get(Calendar.DAY_OF_MONTH) +fun Date.addDays(amount: Int): Date = Calendar.getInstance().apply { + time = this@addDays + add(Calendar.DATE, amount) +}.time fun Date.setDay(day: Int): Date = Calendar.getInstance().apply { time = this@setDay set(Calendar.DAY_OF_MONTH, day) }.time -fun Date.hours(): Int = Calendar.getInstance().apply { - time = this@hours -}.get(Calendar.HOUR_OF_DAY) - fun Date.setHour(hour: Int): Date = Calendar.getInstance().apply { time = this@setHour set(Calendar.HOUR_OF_DAY, hour) }.time -fun Date.minutes(): Int = Calendar.getInstance().apply { - time = this@minutes -}.get(Calendar.MINUTE) - fun Date.setMinute(minute: Int): Date = Calendar.getInstance().apply { time = this@setMinute set(Calendar.MINUTE, minute) }.time -fun Date.isSameDayAs(targetDate: Date): Boolean { - return year() == targetDate.year() && - month() == targetDate.month() && - day() == targetDate.day() -} - -fun Date.addDays(amount: Int): Date = Calendar.getInstance().apply { - time = this@addDays - add(Calendar.DATE, amount) -}.time - -fun Date.isInTheFuture(): Boolean = after(Date()) - -fun Date.isAtLeastXMinutesInTheFuture(minutes: Int): Boolean { - val dateTenMinutesLater = Calendar.getInstance().apply { - time = Date() - add(Calendar.MINUTE, minutes) - }.time - - return after(dateTenMinutesLater) -} - -fun Date.isToday(): Boolean = isSameDayAs(Date()) - -fun Date.isYesterday(): Boolean { - val yesterday = Date().addDays(-1) - return isSameDayAs(yesterday) -} - -fun Date.isThisWeek(): Boolean { - val now = Date() - return this in now.startOfTheWeek()..now.endOfTheWeek() -} - -fun Date.isWeekend(): Boolean { - val calendar = Calendar.getInstance().apply { - time = this@isWeekend - } - val day = calendar.get(Calendar.DAY_OF_WEEK) - return day == 1 || day == 7 -} - -fun Date.isThisMonth(): Boolean = Date().let { now -> year() == now.year() && month() == now.month() } - -fun Date.isThisYear(): Boolean = Date().let { now -> year() == now.year() } - fun Date.roundUpToNextTenMinutes(): Date = Calendar.getInstance().apply { time = this@roundUpToNextTenMinutes @@ -219,11 +160,6 @@ fun Date.getAfternoon(): Date = this.getTimeAtHour(14) fun Date.getEvening(): Date = this.getTimeAtHour(18) -fun Date.getTomorrow(): Date = Calendar.getInstance().apply { - time = this@getTomorrow - add(Calendar.DAY_OF_YEAR, 1) -}.time - fun Date.getNextMonday(): Date = Calendar.getInstance().apply { time = this@getNextMonday @@ -234,3 +170,69 @@ fun Date.getNextMonday(): Date = Calendar.getInstance().apply { add(Calendar.DAY_OF_YEAR, daysToAdd) } }.time +//endregion + +//region Get specific data about a given Date +fun Date.year(): Int = Calendar.getInstance().apply { + time = this@year +}.get(Calendar.YEAR) + +fun Date.month(): Int = Calendar.getInstance().apply { + time = this@month +}.get(Calendar.MONTH) + +fun Date.day(): Int = Calendar.getInstance().apply { + time = this@day +}.get(Calendar.DAY_OF_MONTH) + +fun Date.hours(): Int = Calendar.getInstance().apply { + time = this@hours +}.get(Calendar.HOUR_OF_DAY) + +fun Date.minutes(): Int = Calendar.getInstance().apply { + time = this@minutes +}.get(Calendar.MINUTE) +//endregion + +//region Various checks about a given Date +fun Date.isInTheFuture(): Boolean = after(Date()) + +fun Date.isAtLeastXMinutesInTheFuture(minutes: Int): Boolean { + val dateTenMinutesLater = Calendar.getInstance().apply { + time = Date() + add(Calendar.MINUTE, minutes) + }.time + + return after(dateTenMinutesLater) +} + +fun Date.isSameDayAs(targetDate: Date): Boolean { + return year() == targetDate.year() && + month() == targetDate.month() && + day() == targetDate.day() +} + +fun Date.isToday(): Boolean = isSameDayAs(Date()) + +fun Date.isYesterday(): Boolean { + val yesterday = Date().addDays(-1) + return isSameDayAs(yesterday) +} + +fun Date.isThisWeek(): Boolean { + val now = Date() + return this in now.startOfTheWeek()..now.endOfTheWeek() +} + +fun Date.isWeekend(): Boolean { + val calendar = Calendar.getInstance().apply { + time = this@isWeekend + } + val day = calendar.get(Calendar.DAY_OF_WEEK) + return day == 1 || day == 7 +} + +fun Date.isThisMonth(): Boolean = Date().let { now -> year() == now.year() && month() == now.month() } + +fun Date.isThisYear(): Boolean = Date().let { now -> year() == now.year() } +//endregion