我希望以HH:mm:ss
的格式显示我的JLabel显示值,而不使用任何外部库。 (标签将每秒更新一次)
例如,以下输入以秒为单位,所需的输出如下:
Seconds: Output:
--------------------------------------------------
long seconds = 0 00:00:00
long seconds = 5 00:00:05
long seconds = 500 00:08:20
long seconds = 5000 01:23:20
Note: the seconds value is of type long
我知道通常只会进行以下转换以获得所需的数字:
long s = 5000; //total seconds
long hrs = (s / 3600) //hours
long mins = ((s%3600)/60) //minutes
long secs = (s%60) //seconds
但是,这会在值上留下小数。也许有某种格式可以让我抛出不需要的小数。
我遇到的选项是String.format()
,SimpleDateFormat()
,或者自己连接字符串。
问题是,我将每秒更新一次这个JLabel,有时甚至可以计算相当于5-6天。
所以我正在寻找一个比我更有经验的人,并且知道解决这个问题的最有效方法。
答案 0 :(得分:5)
如果我是你,我会使用SimpleDateFormat。
如果SDF对你来说太慢,请分析所有选项并选择最快的选项,然后重构其余代码,直到它足够快。
请记住, 过早优化是所有邪恶的根源 ,并且您只应在之后进行任何优化代码和错过了目标执行时间。
答案 1 :(得分:3)
SimpleDateFormat()非常适合您的需求。
答案 2 :(得分:3)
使用TimeUnit
类,如here所示,结合javax.swing.Timer
类设置,每隔1秒执行一次。
答案 3 :(得分:2)
如果您不介意值换行,请按如下方式使用SimpleDateFormat。请记住x1000转换为毫秒并手动覆盖时区。
long value = 5 * 24 * 3600 + 5000;
// wrapping solution
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
// ensure no daylight saving +1 hour
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
System.out.println(sdf.format(value * 1000));
输出
01:23:20
如果你想让时间超过23.59.59,那么这是我能想到的最简单的。我使用DecimalFormat强制小时至少2位数。
long value = 5 * 24 * 3600 + 5000;
long hours = value / 3600; // whole hours
long mins = value / 60 - hours * 60;
long secs = value % 60;
System.out.println(String.format("%s:%2d:%2d",
new DecimalFormat("00").format(hours), mins, secs));
输出
121:23:20
答案 4 :(得分:2)
我发现这非常快。试试看。秒数从0到59,分钟从0到59,小时从0到2,562,047,788,015。之后,小时变为负数,并开始朝着最大值开始。
在字符串上执行“+”运算符非常慢。 StringBuilder以我见过的最快的速度执行分组字符串。你也应该使用“字符”而不是“字符串/字节”字节也非常慢。我更喜欢只进行乘法运算,但是除以36和6时,给出的数字小得多。
StringBuilder sb = new StringBuilder(8);
long hours = time / 3600000;
long minutes = (time - hours * 3600000) / 60000;
long seconds = (time - hours * 3600000 - minutes * 60000) / 1000;
if (hours < 10)
sb.append('0');
sb.append(hours);
sb.append(':');
if (minutes < 10)
sb.append('0');
sb.append(minutes);
sb.append(':');
if (seconds < 10)
sb.append('0');
sb.append(seconds);
String formattedTime = sb.toString();
.....
答案 5 :(得分:1)
我认为你想要做你指出的数学计算,但要考虑每个值。然后连接..
public class Test{
public static void main(String args[]){
double d = -100.675;
float f = -90;
System.out.println(Math.floor(d));
System.out.println(Math.floor(f));
System.out.println(Math.ceil(d));
System.out.println(Math.ceil(f));
}
}
答案 6 :(得分:1)
如果您不想使用格式化程序类,则可以使用基本操作(如包装类和字符串操作之间的转换)来完成工作。看看这段代码:
long h, m, s; // Initialize them after calculation.
String h1, m1, s1;
h1 = Long.toString( h );
m1 = Long.toString( m );
s1 = Long.toString( s );
if ( s1.length() < 2 )
s1 = "0" + s1;
if ( m1.length() < 2 )
m1 = "0" + m1;
if ( h1.length() < 2 )
h1 = "0" + h1;
String output = h1+":"+m1+":"+s1;
假设您有正确计算的秒,分钟和小时值,您可以收集这些变量的String版本,然后使用简单的长度检查对其进行格式化,最后连接这些时间单位部分。