Java/Kotlin/Android - 格式化时间 (hh:mm:ss) 并从开头删除不必要的零
Java/Kotlin/Android - format time (hh:mm:ss) and remove unnecessary zeros from the beginning
我的应用程序以 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:”替换为“”,但在涉及到第三个示例时失败了。另外,我认为标准格式应该提供类似的东西,但我一直找不到它。
编辑:我可以用代码来完成。问题是我正在寻找一个优雅的解决方案。
到目前为止,我还没有发现任何优雅的解决方案,我就这样做了。
我有三个格式化字符串,每种情况一个:
<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)
}
}
字符串资源用于以易于本地化的方式显示实际文本。它们不是用来格式化日期和时间的;这就是 DateUtils
的目的。
This class contains various date-related utilities for creating text
for things like elapsed time and date ranges, strings for days of the
week and months, and AM/PM text etc.
它带有一个方便的 formatElapsedTime()
方法,可以按照您的预期格式化持续时间。
Formats an elapsed time in the form "MM:SS" or "H:MM:SS"…
不幸的是,您提到的最后一种格式(只显示秒)并不常见,因此 DateUtils
不支持。虽然这可以通过以下功能轻松解决。
fun formatDuration(seconds: Long): String = if (seconds < 60) {
seconds.toString()
} else {
DateUtils.formatElapsedTime(seconds)
}
我的应用程序以 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:”替换为“”,但在涉及到第三个示例时失败了。另外,我认为标准格式应该提供类似的东西,但我一直找不到它。
编辑:我可以用代码来完成。问题是我正在寻找一个优雅的解决方案。
到目前为止,我还没有发现任何优雅的解决方案,我就这样做了。
我有三个格式化字符串,每种情况一个:
<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)
}
}
字符串资源用于以易于本地化的方式显示实际文本。它们不是用来格式化日期和时间的;这就是 DateUtils
的目的。
This class contains various date-related utilities for creating text for things like elapsed time and date ranges, strings for days of the week and months, and AM/PM text etc.
它带有一个方便的 formatElapsedTime()
方法,可以按照您的预期格式化持续时间。
Formats an elapsed time in the form "MM:SS" or "H:MM:SS"…
不幸的是,您提到的最后一种格式(只显示秒)并不常见,因此 DateUtils
不支持。虽然这可以通过以下功能轻松解决。
fun formatDuration(seconds: Long): String = if (seconds < 60) {
seconds.toString()
} else {
DateUtils.formatElapsedTime(seconds)
}