Will Android DateUtils.getRelativeTimeSpanString format relative past datetimes to required statements

148 views Asked by At

In my current Android project I have a requirement to display historical string datetimes that have the following format/value examples

2023-01-06T14:52:41.633
2023-01-06T00:00:00
2022-12-23T00:00:00
2022-12-22T11:17:43.94

into string "phrases" such as

Today
1 Day Ago
3 Days Ago
1 Week Ago
4 Weeks Ago
1 Month Ago
5 Months Ago
1 Year Ago

I thought android.text.format.DateUtils would provide the solution however the results I am seeing are wrong

the code I am using is as follows

            val then = LocalDateTime.parse(productionDate)
            doLogging{"xxooxx past date = ${productionDate}"}

            doLogging{"xxooxx ${DateUtils.getRelativeTimeSpanString(then.toEpochSecond(ZoneOffset.UTC), LocalDateTime.now().toEpochSecond(ZoneOffset.UTC),0L, DateUtils.FORMAT_ABBREV_RELATIVE)}"}
            doLogging{"xxooxx \t\t ${DateUtils.getRelativeTimeSpanString(then.toEpochSecond(ZoneOffset.UTC), LocalDateTime.now().toEpochSecond(ZoneOffset.UTC),MINUTE_IN_MILLIS, DateUtils.FORMAT_ABBREV_RELATIVE)}"}
            doLogging{"xxooxx \t\t ${DateUtils.getRelativeTimeSpanString(then.toEpochSecond(ZoneOffset.UTC), LocalDateTime.now().toEpochSecond(ZoneOffset.UTC),HOUR_IN_MILLIS, DateUtils.FORMAT_ABBREV_RELATIVE)}"}
            doLogging{"xxooxx \t\t ${DateUtils.getRelativeTimeSpanString(then.toEpochSecond(ZoneOffset.UTC), LocalDateTime.now().toEpochSecond(ZoneOffset.UTC),DAY_IN_MILLIS, DateUtils.FORMAT_ABBREV_RELATIVE)}"}
            doLogging{"xxooxx \t\t ${DateUtils.getRelativeTimeSpanString(then.toEpochSecond(ZoneOffset.UTC), LocalDateTime.now().toEpochSecond(ZoneOffset.UTC),WEEK_IN_MILLIS, DateUtils.FORMAT_ABBREV_RELATIVE)}"}

for example

2023-01-11 11:38:08.143 D  xxooxx past date = 2023-01-11T08:33:18.047
2023-01-11 11:38:08.162 D  xxooxx 11 sec. ago
2023-01-11 11:38:08.163 D  xxooxx    0 min. ago
2023-01-11 11:38:08.164 D  xxooxx    0 hr. ago
2023-01-11 11:38:08.165 D  xxooxx    Today
2023-01-11 11:38:08.165 D  xxooxx    0 wk. ago

2023-01-11T08:33:18.047 is Today, however it is not 11 seconds ago.

2023-01-11 11:38:08.557   xxooxx past date = 2021-11-04T00:00:00
2023-01-11 11:38:08.557   xxooxx 10 hr. ago
2023-01-11 11:38:08.557   xxooxx    10 hr. ago
2023-01-11 11:38:08.558   xxooxx    10 hr. ago
2023-01-11 11:38:08.558   xxooxx    Yesterday
2023-01-11 11:38:08.558   xxooxx    0 wk. ago

2021-11-04 is not 10 hours ago from 2023-01-11 11:38:08.557

Where am I going wrong?

Can I achieve the desired result using android.text.format.DateUtils

1

There are 1 answers

0
Nitish On BEST ANSWER

First convert the String date to LocalDateTime object.(have used LocalDateTime as date deosn't seems to contain any time zone info. If time zone is also to be considered use ZonedDateTime )

val date1 = "2022-12-22T11:17:43"
val formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME
val dateTime: LocalDateTime = LocalDateTime.parse(date1, formatter)
// current date
val currentDate = LocalDateTime.now()

Then use Duration class to find difference betwwen 2 dates.

  val duration: Duration = Duration.between(currentDate, dateTime)
  val diff: Long = Math.abs(duration.toDays())
  Log.e("Date", "Difference $diff")

Output:

E/Date: Difference 20

Or

Use getRelativeTimeSpanString

val differ = DateUtils.getRelativeTimeSpanString(
dateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(),
        Instant.now().toEpochMilli(),
        DateUtils.DAY_IN_MILLIS,
        DateUtils.FORMAT_ABBREV_RELATIVE
    )
    Log.e("Date", "Difference $differ")

Output:

Difference 5 days ago