【问题标题】:Format remaining time untill date格式化剩余时间直到日期
【发布时间】:2020-05-20 01:13:12
【问题描述】:

我有一个未来的日期,并且必须像这样格式化直到这一天的剩余时间。

4 天

1 个月零 4 天

1 年 1 个月

我查看了 DateUtils 文档,但没有看到这种确切的格式。

我也可以使用像threetenabp这样的外部库。

是否有可以处理时间计算和字符串本地化的库?

【问题讨论】:

  • 这不是我的家乡,但我认为 Joda-Time 可以做这样的事情。不过,Joda-Time 即将退休,所以我可能仍会考虑在您提到的 the ThreeTenABP library 之上的本土产品。
  • 我的 answer to this elder SO-question 应该将您链接到正确的方向 - 对仅日期剩余时间进行一些调整。

标签: android date-format


【解决方案1】:

我不久前写了这个博客,它展示了如何做与你所要求的相反的事情 :-) https://blog.blundellapps.co.uk/creating-comments-with-timestamps-like-youtube/ 即给定时间,说出那是多久以前。 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

【讨论】:

  • 我采用了与此类似的方法,因此我将其标记为答案。谢谢
【解决方案2】:

使用threeten 的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

我希望这是你想要的,干杯!

【讨论】:

  • 使用LocalDate 是一个好的开始。你还不在那里。当我在你的代码中输入LocalDate.of(2021, 1, 20) 时,我 1 代表年,-1 代表几个月,16 代表几天。我宁愿期待 11 个月 16 天。
猜你喜欢
  • 2022-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多