【问题标题】:Java/Kotlin/Android - format time (hh:mm:ss) and remove unnecessary zeros from the beginningJava/Kotlin/Android - 格式化时间 (hh:mm:ss) 并从头开始删除不必要的零
【发布时间】:2020-10-28 02:42:36
【问题描述】:

我的应用程序以 hh:mm:ss 格式显示剩余时间,例如 01:05:45 代表一小时 5 分 45 秒。

当小时或分钟为零时,我不想显示它们。目前,如果还剩 45 秒,我的计时器将显示“00:00:45”。预期结果只是“45”。

我需要某种 Java/Kotlin/Android 方法来产生以下输出:

  • 1 小时 13 分 10 秒 ==> 01:13:10
  • 0 小时 13 分 10 秒 ==> 13:10
  • 3 小时 0 分 16 秒 ==> 03:00:16
  • 0 小时 0 分 5 秒 ==> 5

目前我使用这样的字符串作为格式化程序:

<string name="time_default_formatter" translatable="false">%02d:%02d:%02d</string>

我尝试手动将字符串“00:”替换为“”,但在第三个示例中它失败了。另外,我认为标准格式应该提供类似的东西,但我一直找不到。

编辑:我可以在代码中做到这一点。问题是我正在寻找一个优雅的解决方案。

【问题讨论】:

  • 这是硬性要求吗?大多数电子计时器和计时器应用都至少包含分钟数,即使为零。
  • 恐怕这是一个硬性要求。客户在几个计时器应用程序中看到了这样的解决方案,他也想要同样的东西。
  • 在这种情况下,您可能需要条件逻辑来从不同格式中进行选择或仅连接相关字段。
  • 如果我必须这样做,我会这样做。但我希望有一个更优雅的解决方案。
  • 所以你需要一个格式化模式或代码?

标签: java android kotlin format string-formatting


【解决方案1】:

字符串资源旨在以易于本地化的方式显示实际文本。它们不适用于格式化日期和时间。这就是DateUtils 的用途。

此类包含用于创建文本的各种与日期相关的实用程序 对于诸如经过的时间和日期范围之类的内容,日期的字符串 星期和月份,以及 AM/PM 文本等。

它带有一个方便的formatElapsedTime() 方法,可以按照您的预期格式化持续时间。

以“MM:SS”或“H:MM:SS”的形式格式化经过的时间……

不幸的是,您提到的最后一种格式(仅显示秒数)相当少见,因此 DateUtils 不支持。虽然这可以通过以下函数轻松解决。

fun formatDuration(seconds: Long): String = if (seconds < 60) {
    seconds.toString()
} else {
    DateUtils.formatElapsedTime(seconds)
}

【讨论】:

  • 工作如梦。这正是我一直在寻找的:)
【解决方案2】:

到目前为止,我还没有在我的意见中找到任何优雅的解决方案,我就是这样做的。

我有三个格式化字符串,每种情况一个:

<string name="time_hours_minutes_seconds_formatter" translatable="false">%02d:%02d:%02d</string>
<string name="time_minutes_seconds_formatter" translatable="false">%02d:%02d</string>
<string name="time_seconds_formatter" translatable="false">%02d</string>

然后,我使用函数(在 Kotlin 中)手动对其进行格式化:

    private fun formatTime(millis: Long): String {
    val hours = TimeUnit.MILLISECONDS.toHours(millis) % 24
    val minutes = TimeUnit.MILLISECONDS.toMinutes(millis) % 60
    val seconds = TimeUnit.MILLISECONDS.toSeconds(millis) % 60

    return when {
        hours == 0L && minutes == 0L -> String.format(
            resources.getString(R.string.time_seconds_formatter), seconds
        )

        hours == 0L && minutes > 0L -> String.format(
            resources.getString(R.string.time_minutes_seconds_formatter), minutes, seconds
        )

        else -> resources.getString(R.string.time_hours_minutes_seconds_formatter, hours, minutes, seconds)
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 2014-03-28
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    相关资源
    最近更新 更多