Skip to content

Commit 5c3920b

Browse files
refactor: date time updated version (#2969)
1 parent 0eb2547 commit 5c3920b

File tree

4 files changed

+40
-29
lines changed

4 files changed

+40
-29
lines changed

core/common/src/commonMain/kotlin/org/mifos/mobile/core/common/DateHelper.kt

Lines changed: 36 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,8 @@
99
*/
1010
package org.mifos.mobile.core.common
1111

12-
import kotlinx.datetime.Clock
1312
import kotlinx.datetime.DateTimePeriod
1413
import kotlinx.datetime.DateTimeUnit
15-
import kotlinx.datetime.Instant
1614
import kotlinx.datetime.LocalDate
1715
import kotlinx.datetime.LocalDateTime
1816
import kotlinx.datetime.Month
@@ -23,8 +21,12 @@ import kotlinx.datetime.format.FormatStringsInDatetimeFormats
2321
import kotlinx.datetime.format.byUnicodePattern
2422
import kotlinx.datetime.isoDayNumber
2523
import kotlinx.datetime.minus
24+
import kotlinx.datetime.number
2625
import kotlinx.datetime.toLocalDateTime
26+
import kotlin.time.Clock
2727
import kotlin.time.Duration.Companion.days
28+
import kotlin.time.ExperimentalTime
29+
import kotlin.time.Instant
2830

2931
@Suppress("TooManyFunctions")
3032
@OptIn(FormatStringsInDatetimeFormats::class)
@@ -67,11 +69,12 @@ object DateHelper {
6769
return stringBuilder.toString()
6870
}
6971

72+
@OptIn(ExperimentalTime::class)
7073
fun getFormattedDateWithPrefix(dateList: List<Int>): String {
7174
val inputDate = LocalDate(dateList[0], dateList[1], dateList[2])
7275
val now = Clock.System.now().toLocalDateTime(TimeZone.currentSystemDefault()).date
7376

74-
val formatted = "${inputDate.dayOfMonth} ${getMonthName(inputDate.monthNumber)} ${inputDate.year}"
77+
val formatted = "${inputDate.month.number} ${getMonthName(inputDate.month.number)} ${inputDate.year}"
7578

7679
val today = now
7780
val yesterday = today.minus(1, DateTimeUnit.DAY)
@@ -83,9 +86,9 @@ object DateHelper {
8386
val endOfLastWeek = startOfThisWeek.minus(1, DateTimeUnit.DAY)
8487

8588
// Last Month
86-
val firstOfThisMonth = LocalDate(today.year, today.monthNumber, 1)
89+
val firstOfThisMonth = LocalDate(today.year, today.month.number, 1)
8790
val lastMonthDate = firstOfThisMonth.minus(1, DateTimeUnit.MONTH)
88-
val startOfLastMonth = LocalDate(lastMonthDate.year, lastMonthDate.monthNumber, 1)
91+
val startOfLastMonth = LocalDate(lastMonthDate.year, lastMonthDate.month.number, 1)
8992
val endOfLastMonth = firstOfThisMonth.minus(1, DateTimeUnit.DAY)
9093

9194
// Last Year
@@ -132,6 +135,7 @@ object DateHelper {
132135
return listOf(year, month, day)
133136
}
134137

138+
@OptIn(ExperimentalTime::class)
135139
fun subtractTime(number: Int, unit: String): Long {
136140
val now: Instant = Clock.System.now()
137141
val daysToSubtract = when (unit.lowercase()) {
@@ -153,15 +157,16 @@ object DateHelper {
153157
val input = LocalDate.Format { byUnicodePattern(format) }
154158
val localDate = input.parse(dateString)
155159

156-
val day = localDate.dayOfMonth.toString().padStart(2, '0')
157-
val month = monthNumberToAbbreviation[localDate.monthNumber]
160+
val day = localDate.day.toString().padStart(2, '0')
161+
val month = monthNumberToAbbreviation[localDate.month.number]
158162
val year = localDate.year
159163

160164
return "$day $month $year"
161165
}
162166

163167
private val monthNumberToAbbreviation = monthMap.entries.associate { (k, v) -> v to k }
164168

169+
@OptIn(ExperimentalTime::class)
165170
fun getDateAsLongFromList(integersOfDate: List<Int>?): Long? {
166171
if (integersOfDate == null) return null
167172
val dateStr = getDateAsString(integersOfDate)
@@ -202,8 +207,8 @@ object DateHelper {
202207
// Extension function to format LocalDate
203208
fun LocalDate.format(pattern: String): String {
204209
val year = this.year.toString().padStart(4, '0')
205-
val month = this.monthNumber.toString().padStart(2, '0')
206-
val day = this.dayOfMonth.toString().padStart(2, '0')
210+
val month = this.month.toString().padStart(2, '0')
211+
val day = this.day.toString().padStart(2, '0')
207212

208213
return pattern
209214
.replace("yyyy", year)
@@ -238,6 +243,7 @@ object DateHelper {
238243
* Example timestamp "1698278400000"
239244
* Output examples: "dd-MM-yyyy" - "14-04-2016"
240245
*/
246+
@OptIn(ExperimentalTime::class)
241247
fun getDateAsStringFromLong(timeInMillis: Long): String {
242248
val instant = Instant.fromEpochMilliseconds(timeInMillis)
243249
.toLocalDateTime(TimeZone.currentSystemDefault())
@@ -250,20 +256,22 @@ object DateHelper {
250256
* Example timestamp "1698278400000"
251257
* Output examples: "14 April"
252258
*/
259+
@OptIn(ExperimentalTime::class)
253260
fun getMonthAsStringFromLong(timeInMillis: Long): String {
254261
val instant = Instant.fromEpochMilliseconds(timeInMillis)
255262
.toLocalDateTime(TimeZone.currentSystemDefault())
256263

257264
val monthName = instant.month.name.lowercase().capitalize()
258265

259-
return "${instant.dayOfMonth} $monthName"
266+
return "${instant.day} $monthName"
260267
}
261268

269+
@OptIn(ExperimentalTime::class)
262270
fun getDateMonthYearString(timeInMillis: Long): String {
263271
val instant = Instant.fromEpochMilliseconds(timeInMillis)
264272
.toLocalDateTime(TimeZone.currentSystemDefault())
265273

266-
val day = instant.dayOfMonth
274+
val day = instant.day
267275
val month = instant.month.name.lowercase().replaceFirstChar { it.uppercase() }.take(3)
268276
val year = instant.year
269277

@@ -337,6 +345,7 @@ object DateHelper {
337345
* "Today at 05:41"
338346
* "Tomorrow at 05:41"
339347
*/
348+
@OptIn(ExperimentalTime::class)
340349
fun String.toFormattedDateTime(): String {
341350
// Parse the datetime string
342351
val dateTime = try {
@@ -361,41 +370,41 @@ object DateHelper {
361370
nowDateTime.year == dateTime.year -> {
362371
when {
363372
// Same month
364-
nowDateTime.monthNumber == dateTime.monthNumber -> {
373+
nowDateTime.month.number == dateTime.month.number -> {
365374
when {
366375
// Tomorrow
367-
dateTime.dayOfMonth - nowDateTime.dayOfMonth == 1 -> {
376+
dateTime.month.number - nowDateTime.month.number == 1 -> {
368377
"Tomorrow at ${dateTime.format()}"
369378
}
370379
// Today
371-
dateTime.dayOfMonth == nowDateTime.dayOfMonth -> {
380+
dateTime.month.number == nowDateTime.month.number -> {
372381
"Today at ${dateTime.format()}"
373382
}
374383
// Yesterday
375-
nowDateTime.dayOfMonth - dateTime.dayOfMonth == 1 -> {
384+
nowDateTime.month.number - dateTime.month.number == 1 -> {
376385
"Yesterday at ${dateTime.format()}"
377386
}
378387
// Same month but different day
379388
else -> {
380389
"${
381390
dateTime.month.name.lowercase().capitalize()
382-
} ${dateTime.dayOfMonth}, ${dateTime.format()}"
391+
} ${dateTime.month.number}, ${dateTime.format()}"
383392
}
384393
}
385394
}
386395
// Different month, same year
387396
else -> {
388397
"${
389398
dateTime.month.name.lowercase().capitalize()
390-
} ${dateTime.dayOfMonth}, ${dateTime.format()}"
399+
} ${dateTime.month.number}, ${dateTime.format()}"
391400
}
392401
}
393402
}
394403
// Different year
395404
else -> {
396405
"${
397406
dateTime.month.name.lowercase().capitalize()
398-
} ${dateTime.dayOfMonth} ${dateTime.year}, ${dateTime.format()}"
407+
} ${dateTime.month.number} ${dateTime.year}, ${dateTime.format()}"
399408
}
400409
}
401410
}
@@ -407,6 +416,7 @@ object DateHelper {
407416
* "Today at 12:00"
408417
* "Tomorrow at 15:30"
409418
*/
419+
@OptIn(ExperimentalTime::class)
410420
fun String.toPrettyDate(): String {
411421
val timestamp = this.toLong()
412422
val instant = Instant.fromEpochMilliseconds(timestamp)
@@ -419,44 +429,44 @@ object DateHelper {
419429
nowDateTime.year == neededDateTime.year -> {
420430
when {
421431
// Same month
422-
nowDateTime.monthNumber == neededDateTime.monthNumber -> {
432+
nowDateTime.month.number == neededDateTime.month.number -> {
423433
when {
424434
// Tomorrow
425-
neededDateTime.dayOfMonth - nowDateTime.dayOfMonth == 1 -> {
435+
neededDateTime.month.number - nowDateTime.month.number == 1 -> {
426436
val time = neededDateTime.format()
427437
"Tomorrow at $time"
428438
}
429439
// Today
430-
neededDateTime.dayOfMonth == nowDateTime.dayOfMonth -> {
440+
neededDateTime.month.number == nowDateTime.month.number -> {
431441
val time = neededDateTime.format()
432442
"Today at $time"
433443
}
434444
// Yesterday
435-
nowDateTime.dayOfMonth - neededDateTime.dayOfMonth == 1 -> {
445+
nowDateTime.month.number - neededDateTime.month.number == 1 -> {
436446
val time = neededDateTime.format()
437447
"Yesterday at $time"
438448
}
439449
// Same month but different day
440450
else -> {
441451
"${
442452
neededDateTime.month.name.lowercase().capitalize()
443-
} ${neededDateTime.dayOfMonth}, ${neededDateTime.format()}"
453+
} ${neededDateTime.month.number}, ${neededDateTime.format()}"
444454
}
445455
}
446456
}
447457
// Different month, same year
448458
else -> {
449459
"${
450460
neededDateTime.month.name.lowercase().capitalize()
451-
} ${neededDateTime.dayOfMonth}, ${neededDateTime.format()}"
461+
} ${neededDateTime.month.number}, ${neededDateTime.format()}"
452462
}
453463
}
454464
}
455465
// Different year
456466
else -> {
457467
"${
458468
neededDateTime.month.name.lowercase().capitalize()
459-
} ${neededDateTime.dayOfMonth} ${neededDateTime.year}, ${neededDateTime.format()}"
469+
} ${neededDateTime.month.number} ${neededDateTime.year}, ${neededDateTime.format()}"
460470
}
461471
}
462472
}
@@ -471,6 +481,7 @@ object DateHelper {
471481
if (it.isLowerCase()) it.titlecase() else it.toString()
472482
}
473483

484+
@OptIn(ExperimentalTime::class)
474485
val currentDate = Clock.System.now().toLocalDateTime(TimeZone.currentSystemDefault())
475486

476487
/**

feature/transfer-process/src/commonMain/kotlin/org/mifos/mobile/feature/transfer/process/transferProcess/TransferProcessViewModel.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import androidx.navigation.toRoute
1515
import kotlinx.coroutines.flow.distinctUntilChanged
1616
import kotlinx.coroutines.flow.update
1717
import kotlinx.coroutines.launch
18+
import kotlinx.datetime.number
1819
import mifos_mobile.feature.transfer_process.generated.resources.Res
1920
import mifos_mobile.feature.transfer_process.generated.resources.back_to_accounts
2021
import mifos_mobile.feature.transfer_process.generated.resources.transfer_failed
@@ -62,8 +63,8 @@ internal class TransferProcessViewModel(
6263
initialState = run {
6364
val route = savedStateHandle.toRoute<TransferProcessRoute>()
6465
val transferDate = listOf(
65-
currentDate.dayOfMonth,
66-
currentDate.monthNumber,
66+
currentDate.day,
67+
currentDate.month.number,
6768
currentDate.year,
6869
)
6970
println("TransferProcessViewModel: route = ${route.transferSuccessDestination}")

gradle.properties

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,4 +49,3 @@ android.defaults.buildfeatures.shaders=false
4949
org.jetbrains.compose.experimental.jscanvas.enabled=true
5050
kotlin.native.ignoreDisabledTargets=true
5151

52-
org.gradle.java.home=/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home

gradle/libs.versions.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ compottie = "2.0.0-rc05"
6060
kotlin = "2.1.20"
6161
kotlinInject = "0.7.2"
6262
kotlinxCoroutines = "1.10.1"
63-
kotlinxDatetime = "0.6.2"
63+
kotlinxDatetime = "0.7.1"
6464
kotlinxImmutable = "0.3.8"
6565
kotlinxSerializationJson = "1.8.1"
6666
ksp = "2.1.20-2.0.1"

0 commit comments

Comments
 (0)