Формат оставшегося времени до даты - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть дата в будущем, и мне нужно отформатировать оставшееся до этого дня время следующим образом.

4 дня

1 месяц, 4 дня

1 год , 1 месяц

Я посмотрел документацию DateUtils, но не увидел точного формата.

Я также в порядке, используя внешнюю библиотеку, например threetenabp.

Is библиотека, которая может обрабатывать как время, так и локализацию строк?

Ответы [ 2 ]

0 голосов
/ 04 февраля 2020

Я написал этот блог некоторое время go, он показывает, как сделать противоположное тому, что вы просите :-) https://blog.blundellapps.co.uk/creating-comments-with-timestamps-like-youtube/ то есть, учитывая время, скажите, как долго go что было. Android также предлагает это решение для прошлых времен: https://developer.android.com/reference/android/text/format/DateUtils.html#getRelativeDateTimeString (android .content.Context,% 20long,% 20long,% 20long,% 20int) . Так что вам нужно противоположное этому!

Это не должно быть слишком трудно, чтобы инвертировать. Вместо того чтобы использовать время сейчас и отрицать разницу времени в прошлом. Вы используете время сейчас и добавляете время в будущем.

Итак, обратное значение: https://github.com/blundell/YouTubeTimeStamps/blob/master/app/src/main/java/com/blundell/tut/TimeStampFormatter.kt

Основное различие заключается в том, что вы хотите разницу между сейчас и дата в будущем, вот так:

private fun getMillisFromNow(futureTime: Date): Long {
    val futureTimeMillis = futureTime.time
    val nowMillis = System.currentTimeMillis()
    return futureTimeMillis - nowMillis
}

А затем отформатируйте ее. Примерно так:

 fun format(timestamp: Date): String {
    val millisFromNow = getMillisFromNow(timestamp)

    val minutesFromNow = TimeUnit.MILLISECONDS.toMinutes(millisFromNow)
    if (minutesFromNow < 1) {
        return "about now"
    }
    val hoursFromNow = TimeUnit.MILLISECONDS.toHours(millisFromNow)
    if (hoursFromNow < 1) {
        return formatMinutes(minutesFromNow)
    }
    val daysFromNow = TimeUnit.MILLISECONDS.toDays(millisFromNow)
    if (daysFromNow < 1) {
        return formatHours(hoursFromNow)
    }
    val weeksFromNow = TimeUnit.MILLISECONDS.toDays(millisFromNow) / 7
    if (weeksFromNow < 1) {
        return formatDays(daysFromNow)
    }
    val monthsFromNow = TimeUnit.MILLISECONDS.toDays(millisFromNow) / 30
    if (monthsFromNow < 1) {
        return formatWeeks(weeksFromNow)
    }
    val yearsFromNow = TimeUnit.MILLISECONDS.toDays(millisFromNow) / 365
    return if (yearsFromNow < 1) {
        formatMonths(monthsFromNow)
    } else formatYears(yearsFromNow)
}

 private fun getMillisFromNow(futureTime: Date): Long {
    val futureTimeMillis = futureTime.time
    val nowMillis = System.currentTimeMillis()
    return futureTimeMillis - nowMillis
}

private fun formatMinutes(minutes: Long): String {
    return format(minutes, " minute to go", " minutes to go")
}

private fun formatHours(hours: Long): String {
    return format(hours, " hour to go", " hours to go")
}

private fun formatDays(days: Long): String {
    return format(days, " day to go", " days to go")
}

private fun formatWeeks(weeks: Long): String {
    return format(weeks, " week to go", " weeks to go")
}

private fun formatMonths(months: Long): String {
    return format(months, " month to go", " months to go")
}

private fun formatYears(years: Long): String {
    return format(years, " year to go", " years to go")
}

private fun format(hand: Long, singular: String, plural: String): String {
    return if (hand == 1L) {
        hand.toString() + singular
    } else {
        hand.toString() + plural
    }
}

Просто здравомыслие проверило это с помощью этого теста:

@Test
fun test() {
    val twoDaysInMillisInstant = Instant.now().plusMillis(TimeUnit.HOURS.toMillis(50))
    val result = format(Date.from(twoDaysInMillisInstant))

    assertEquals("2 days to go", result)
}

Для локализации вы можете преобразовать это в Strings.xml.

0 голосов
/ 04 февраля 2020

используя Threeten's LocalDate , вы можете получить оставшиеся годы, месяцы и дни от одной даты к другой. Имея эти значения, вы можете 0 проверить их и показать только те из них, которые> 0. Простой пример:

    val futureDate = LocalDate.of(2020,2,20)
    val todayDate = LocalDate.now()
    val remainingYears = futureDate.year - todayDate.year //output 0
    val remainingMonth = futureDate.monthValue - todayDate.monthValue //output 0
    val remainingDays = futureDate.dayOfMonth - todayDate.dayOfMonth // output 16

Я надеюсь, что это то, что вы хотели, ура!

...