Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将long转换为HH:mm:ss并在标签中显示的最有效方法是什么?_Java_Swing_Time_Format_Jlabel - Fatal编程技术网

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

Java 将long转换为HH:mm:ss并在标签中显示的最有效方法是什么?,java,swing,time,format,jlabel,Java,Swing,Time,Format,Jlabel,我想让我的JLabel以HH:mm:ss格式显示值,而不使用任何外部库。(标签将每秒更新一次) 例如,以下输入(以秒为单位)和所需输出如下: Seconds: Output: -------------------------------------------------- long seconds = 0 00:00:00 long seconds = 5 0

我想让我的JLabel以
HH:mm:ss
格式显示值,而不使用任何外部库。(标签将每秒更新一次)

例如,以下输入(以秒为单位)和所需输出如下:

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天(如果不是更长的话)


因此,我正在寻找一位在这方面比我更有经验的人,他知道解决这个问题的最有效的方法。

我想你想做你所说的数学,但要对每一个值都做一个底数。然后连接

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));
   }
}

我认为你想做你指出的数学,但每一个值都有底线。然后连接

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));
   }
}

SimpleDateFormat()确实非常适合您的需要。

SimpleDateFormat()确实非常适合您的需要。

使用该类,如图所示,与设置为以1秒间隔执行的类组合使用。

使用该类,如图所示,与设置为以1秒间隔执行的类结合使用。

如果我是您,我将使用SimpleDataFormat

如果SDF对您来说太慢,请分析所有选项并选择最快的选项,然后重构其余代码,直到足够快


请记住,过早优化是万恶之源,只有在分析了代码并错过了目标执行时间之后,才应该真正进行任何优化。

如果我是你,我会使用SimpleDataFormat

如果SDF对您来说太慢,请分析所有选项并选择最快的选项,然后重构其余代码,直到足够快


请记住,过早优化是万恶之源,只有在分析代码并错过目标执行时间后,才应该真正进行优化。

如果不想使用格式化程序类,您可以通过使用包装器类之间的转换和字符串操作等基本操作来完成工作。请看下面的代码:

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;
长h、m、s;//在计算之后初始化它们。
串h1、m1、s1;
h1=长toString(h);
m1=长toString(m);
s1=长toString(s);
if(s1.length()<2)
s1=“0”+s1;
if(m1.length()<2)
m1=“0”+m1;
如果(h1.length()<2)
h1=“0”+h1;
字符串输出=h1+“:”+m1+“:”+s1;

假设您已正确计算秒、分钟和小时的值,您可以收集这些变量的字符串版本,然后通过简单的长度检查对其进行格式化,最后连接这些时间单位部分。

如果您不想使用格式化程序类,您可以通过使用包装器类之间的转换和字符串操作等基本操作来完成工作。请看下面的代码:

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;
长h、m、s;//在计算之后初始化它们。
串h1、m1、s1;
h1=长toString(h);
m1=长toString(m);
s1=长toString(s);
if(s1.length()<2)
s1=“0”+s1;
if(m1.length()<2)
m1=“0”+m1;
如果(h1.length()<2)
h1=“0”+h1;
字符串输出=h1+“:”+m1+“:”+s1;

假设您已正确计算秒、分钟和小时的值,您可以收集这些变量的字符串版本,然后通过简单的长度检查对其进行格式化,最后连接这些时间单位部分。

如果您不介意值包装,请使用SimpleDataFormat,如下所示。记住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
121:23:20
如果你想让时间超过23.59.59,那么这是我能想到的最简单的方法。我使用DecimalFormat强制每个小时至少两位数字

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));
输出

01:23:20
121:23:20

如果您不介意值包装,请使用SimpleDataFormat,如下所示。记住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
121:23:20
如果你想让时间超过23.59.59,那么这是我能想到的最简单的方法。我使用DecimalFormat强制每个小时至少两位数字

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));
输出

01:23:20
121:23:20

我发现这个速度非常快。试试看。秒从0到59,分钟从0到59,小时从0到2562047788015。之后,小时数变为负值,并开始向最大值移动

对字符串执行“+”运算符非常慢。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();
StringBuilder sb=新的StringBuilder(8);
长时间=时间/3600000;
长分钟=(时间-小时*3600000)/60000;
长秒=(时间-小时*3600000-分钟*60000)/1000;
如果(小时<10)
某人附加('0');
某人(小时);
某人附加(“:”);
如果(分钟<10)
某人附加('0');
某人追加(分钟);
某人附加(“:”);
如果(秒<10)
某人附加('0');
某人追加(秒);
字符串formattedTime=sb.toString();

…我发现这个速度非常快。试试看。秒从0到59,分钟从0到59,小时从0到2562047788015。之后,小时数变为负值,并开始向最大值移动

对字符串执行“+”运算符非常慢。StringBuilder以最快的速度将字符串组合在一起