将long转换为HH:mm:ss并将其显示在标签中的最有效方法是什么?

时间:2012-03-12 19:55:19

标签: java swing time format jlabel

我希望以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天。

所以我正在寻找一个比我更有经验的人,并且知道解决这个问题的最有效方法。

7 个答案:

答案 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版本,然后使用简单的长度检查对其进行格式化,最后连接这些时间单位部分。