我想显示带有分钟,秒和仅一个毫秒字符的格式化字符串。这是我整理的内容(主要来自此处的其他帖子):
public static final String getTimeDurationAsString(long milliseconds) {
int millis = (int) (milliseconds % 1000);
int seconds = (int) (milliseconds / 1000) % 60;
int minutes = (int) ((milliseconds / (1000*60)) % 60);
int hours = (int) ((milliseconds / (1000*60*60)) % 24);
StringBuilder sb = new StringBuilder();
if (hours > 0) {
sb.append(String.format("%02d", hours));
sb.append(":");
}
sb.append(String.format("%02d", minutes));
sb.append(":");
sb.append(String.format("%02d", seconds));
sb.append(".");
sb.append(String.format("%03d", millis).substring(0, 1));
return sb.toString();
}
因此,如果持续时间不超过59.9分钟(通常是这种情况),我将隐藏小时位置。我为毫秒位置做了一个非常糟糕的substring(),只是为了抓住第一个数字。有没有更好的方法来执行以上操作?我想要像这样的字符串:
00:14.9
00:05.1
00:05.2
33:20:4
etc
我必须为正在制作的游戏重复生成此字符串(以上渲染为每帧),以免它做很多不必要的工作?
谢谢!
最佳答案
毫无疑问,有更有效的方式对此进行编码(实际上总是如此)。
但是,在我的盒子上,您的函数可以每秒格式化130,000个时间戳。显然,对于您陈述的用例,这足够快。
就是说,如果我对此进行了编码,并且先验地认为它可能在性能关键的路径上,那么我会避免使用String.format()
:
public static final String getTimeDurationAsString(long milliseconds) {
int millis = (int) (milliseconds % 1000);
int seconds = (int) (milliseconds / 1000) % 60;
int minutes = (int) ((milliseconds / (1000*60)) % 60);
int hours = (int) ((milliseconds / (1000*60*60)) % 24);
StringBuilder sb = new StringBuilder();
if (hours > 0) {
sb.append((char)('0' + hours / 10))
.append((char)('0' + hours % 10)).append(":");
}
sb.append((char)('0' + minutes / 10))
.append((char)('0' + minutes % 10)).append(":")
.append((char)('0' + seconds / 10))
.append((char)('0' + seconds % 10)).append(".")
.append((char)('0' + millis / 100));
return sb.toString();
}
在我的盒子上,每秒可以完成约800万次转换。它还创建的临时对象明显减少,最终不得不被垃圾回收。