9
9
*/
10
10
package org.mifos.mobile.core.common
11
11
12
- import kotlinx.datetime.Clock
13
12
import kotlinx.datetime.DateTimePeriod
14
13
import kotlinx.datetime.DateTimeUnit
15
- import kotlinx.datetime.Instant
16
14
import kotlinx.datetime.LocalDate
17
15
import kotlinx.datetime.LocalDateTime
18
16
import kotlinx.datetime.Month
@@ -23,8 +21,12 @@ import kotlinx.datetime.format.FormatStringsInDatetimeFormats
23
21
import kotlinx.datetime.format.byUnicodePattern
24
22
import kotlinx.datetime.isoDayNumber
25
23
import kotlinx.datetime.minus
24
+ import kotlinx.datetime.number
26
25
import kotlinx.datetime.toLocalDateTime
26
+ import kotlin.time.Clock
27
27
import kotlin.time.Duration.Companion.days
28
+ import kotlin.time.ExperimentalTime
29
+ import kotlin.time.Instant
28
30
29
31
@Suppress(" TooManyFunctions" )
30
32
@OptIn(FormatStringsInDatetimeFormats ::class )
@@ -67,11 +69,12 @@ object DateHelper {
67
69
return stringBuilder.toString()
68
70
}
69
71
72
+ @OptIn(ExperimentalTime ::class )
70
73
fun getFormattedDateWithPrefix (dateList : List <Int >): String {
71
74
val inputDate = LocalDate (dateList[0 ], dateList[1 ], dateList[2 ])
72
75
val now = Clock .System .now().toLocalDateTime(TimeZone .currentSystemDefault()).date
73
76
74
- val formatted = " ${inputDate.dayOfMonth } ${getMonthName(inputDate.monthNumber )} ${inputDate.year} "
77
+ val formatted = " ${inputDate.month.number } ${getMonthName(inputDate.month.number )} ${inputDate.year} "
75
78
76
79
val today = now
77
80
val yesterday = today.minus(1 , DateTimeUnit .DAY )
@@ -83,9 +86,9 @@ object DateHelper {
83
86
val endOfLastWeek = startOfThisWeek.minus(1 , DateTimeUnit .DAY )
84
87
85
88
// Last Month
86
- val firstOfThisMonth = LocalDate (today.year, today.monthNumber , 1 )
89
+ val firstOfThisMonth = LocalDate (today.year, today.month.number , 1 )
87
90
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 )
89
92
val endOfLastMonth = firstOfThisMonth.minus(1 , DateTimeUnit .DAY )
90
93
91
94
// Last Year
@@ -132,6 +135,7 @@ object DateHelper {
132
135
return listOf (year, month, day)
133
136
}
134
137
138
+ @OptIn(ExperimentalTime ::class )
135
139
fun subtractTime (number : Int , unit : String ): Long {
136
140
val now: Instant = Clock .System .now()
137
141
val daysToSubtract = when (unit.lowercase()) {
@@ -153,15 +157,16 @@ object DateHelper {
153
157
val input = LocalDate .Format { byUnicodePattern(format) }
154
158
val localDate = input.parse(dateString)
155
159
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 ]
158
162
val year = localDate.year
159
163
160
164
return " $day $month $year "
161
165
}
162
166
163
167
private val monthNumberToAbbreviation = monthMap.entries.associate { (k, v) -> v to k }
164
168
169
+ @OptIn(ExperimentalTime ::class )
165
170
fun getDateAsLongFromList (integersOfDate : List <Int >? ): Long? {
166
171
if (integersOfDate == null ) return null
167
172
val dateStr = getDateAsString(integersOfDate)
@@ -202,8 +207,8 @@ object DateHelper {
202
207
// Extension function to format LocalDate
203
208
fun LocalDate.format (pattern : String ): String {
204
209
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' )
207
212
208
213
return pattern
209
214
.replace(" yyyy" , year)
@@ -238,6 +243,7 @@ object DateHelper {
238
243
* Example timestamp "1698278400000"
239
244
* Output examples: "dd-MM-yyyy" - "14-04-2016"
240
245
*/
246
+ @OptIn(ExperimentalTime ::class )
241
247
fun getDateAsStringFromLong (timeInMillis : Long ): String {
242
248
val instant = Instant .fromEpochMilliseconds(timeInMillis)
243
249
.toLocalDateTime(TimeZone .currentSystemDefault())
@@ -250,20 +256,22 @@ object DateHelper {
250
256
* Example timestamp "1698278400000"
251
257
* Output examples: "14 April"
252
258
*/
259
+ @OptIn(ExperimentalTime ::class )
253
260
fun getMonthAsStringFromLong (timeInMillis : Long ): String {
254
261
val instant = Instant .fromEpochMilliseconds(timeInMillis)
255
262
.toLocalDateTime(TimeZone .currentSystemDefault())
256
263
257
264
val monthName = instant.month.name.lowercase().capitalize()
258
265
259
- return " ${instant.dayOfMonth } $monthName "
266
+ return " ${instant.day } $monthName "
260
267
}
261
268
269
+ @OptIn(ExperimentalTime ::class )
262
270
fun getDateMonthYearString (timeInMillis : Long ): String {
263
271
val instant = Instant .fromEpochMilliseconds(timeInMillis)
264
272
.toLocalDateTime(TimeZone .currentSystemDefault())
265
273
266
- val day = instant.dayOfMonth
274
+ val day = instant.day
267
275
val month = instant.month.name.lowercase().replaceFirstChar { it.uppercase() }.take(3 )
268
276
val year = instant.year
269
277
@@ -337,6 +345,7 @@ object DateHelper {
337
345
* "Today at 05:41"
338
346
* "Tomorrow at 05:41"
339
347
*/
348
+ @OptIn(ExperimentalTime ::class )
340
349
fun String.toFormattedDateTime (): String {
341
350
// Parse the datetime string
342
351
val dateTime = try {
@@ -361,41 +370,41 @@ object DateHelper {
361
370
nowDateTime.year == dateTime.year -> {
362
371
when {
363
372
// Same month
364
- nowDateTime.monthNumber == dateTime.monthNumber -> {
373
+ nowDateTime.month.number == dateTime.month.number -> {
365
374
when {
366
375
// Tomorrow
367
- dateTime.dayOfMonth - nowDateTime.dayOfMonth == 1 -> {
376
+ dateTime.month.number - nowDateTime.month.number == 1 -> {
368
377
" Tomorrow at ${dateTime.format()} "
369
378
}
370
379
// Today
371
- dateTime.dayOfMonth == nowDateTime.dayOfMonth -> {
380
+ dateTime.month.number == nowDateTime.month.number -> {
372
381
" Today at ${dateTime.format()} "
373
382
}
374
383
// Yesterday
375
- nowDateTime.dayOfMonth - dateTime.dayOfMonth == 1 -> {
384
+ nowDateTime.month.number - dateTime.month.number == 1 -> {
376
385
" Yesterday at ${dateTime.format()} "
377
386
}
378
387
// Same month but different day
379
388
else -> {
380
389
" ${
381
390
dateTime.month.name.lowercase().capitalize()
382
- } ${dateTime.dayOfMonth } , ${dateTime.format()} "
391
+ } ${dateTime.month.number } , ${dateTime.format()} "
383
392
}
384
393
}
385
394
}
386
395
// Different month, same year
387
396
else -> {
388
397
" ${
389
398
dateTime.month.name.lowercase().capitalize()
390
- } ${dateTime.dayOfMonth } , ${dateTime.format()} "
399
+ } ${dateTime.month.number } , ${dateTime.format()} "
391
400
}
392
401
}
393
402
}
394
403
// Different year
395
404
else -> {
396
405
" ${
397
406
dateTime.month.name.lowercase().capitalize()
398
- } ${dateTime.dayOfMonth } ${dateTime.year} , ${dateTime.format()} "
407
+ } ${dateTime.month.number } ${dateTime.year} , ${dateTime.format()} "
399
408
}
400
409
}
401
410
}
@@ -407,6 +416,7 @@ object DateHelper {
407
416
* "Today at 12:00"
408
417
* "Tomorrow at 15:30"
409
418
*/
419
+ @OptIn(ExperimentalTime ::class )
410
420
fun String.toPrettyDate (): String {
411
421
val timestamp = this .toLong()
412
422
val instant = Instant .fromEpochMilliseconds(timestamp)
@@ -419,44 +429,44 @@ object DateHelper {
419
429
nowDateTime.year == neededDateTime.year -> {
420
430
when {
421
431
// Same month
422
- nowDateTime.monthNumber == neededDateTime.monthNumber -> {
432
+ nowDateTime.month.number == neededDateTime.month.number -> {
423
433
when {
424
434
// Tomorrow
425
- neededDateTime.dayOfMonth - nowDateTime.dayOfMonth == 1 -> {
435
+ neededDateTime.month.number - nowDateTime.month.number == 1 -> {
426
436
val time = neededDateTime.format()
427
437
" Tomorrow at $time "
428
438
}
429
439
// Today
430
- neededDateTime.dayOfMonth == nowDateTime.dayOfMonth -> {
440
+ neededDateTime.month.number == nowDateTime.month.number -> {
431
441
val time = neededDateTime.format()
432
442
" Today at $time "
433
443
}
434
444
// Yesterday
435
- nowDateTime.dayOfMonth - neededDateTime.dayOfMonth == 1 -> {
445
+ nowDateTime.month.number - neededDateTime.month.number == 1 -> {
436
446
val time = neededDateTime.format()
437
447
" Yesterday at $time "
438
448
}
439
449
// Same month but different day
440
450
else -> {
441
451
" ${
442
452
neededDateTime.month.name.lowercase().capitalize()
443
- } ${neededDateTime.dayOfMonth } , ${neededDateTime.format()} "
453
+ } ${neededDateTime.month.number } , ${neededDateTime.format()} "
444
454
}
445
455
}
446
456
}
447
457
// Different month, same year
448
458
else -> {
449
459
" ${
450
460
neededDateTime.month.name.lowercase().capitalize()
451
- } ${neededDateTime.dayOfMonth } , ${neededDateTime.format()} "
461
+ } ${neededDateTime.month.number } , ${neededDateTime.format()} "
452
462
}
453
463
}
454
464
}
455
465
// Different year
456
466
else -> {
457
467
" ${
458
468
neededDateTime.month.name.lowercase().capitalize()
459
- } ${neededDateTime.dayOfMonth } ${neededDateTime.year} , ${neededDateTime.format()} "
469
+ } ${neededDateTime.month.number } ${neededDateTime.year} , ${neededDateTime.format()} "
460
470
}
461
471
}
462
472
}
@@ -471,6 +481,7 @@ object DateHelper {
471
481
if (it.isLowerCase()) it.titlecase() else it.toString()
472
482
}
473
483
484
+ @OptIn(ExperimentalTime ::class )
474
485
val currentDate = Clock .System .now().toLocalDateTime(TimeZone .currentSystemDefault())
475
486
476
487
/* *
0 commit comments