99 */
1010package org.mifos.mobile.core.common
1111
12- import kotlinx.datetime.Clock
1312import kotlinx.datetime.DateTimePeriod
1413import kotlinx.datetime.DateTimeUnit
15- import kotlinx.datetime.Instant
1614import kotlinx.datetime.LocalDate
1715import kotlinx.datetime.LocalDateTime
1816import kotlinx.datetime.Month
@@ -23,8 +21,12 @@ import kotlinx.datetime.format.FormatStringsInDatetimeFormats
2321import kotlinx.datetime.format.byUnicodePattern
2422import kotlinx.datetime.isoDayNumber
2523import kotlinx.datetime.minus
24+ import kotlinx.datetime.number
2625import kotlinx.datetime.toLocalDateTime
26+ import kotlin.time.Clock
2727import 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 /* *
0 commit comments