计算经过的时间并用Java显示

时间:2018-03-02 20:50:26

标签: java date calendar

对于此问题,stackoverflow中似乎没有简单的答案。我只想获得两个Calendar实例之间的差异并以HH显示:mm:ss.SSS

到目前为止,我有

SimpleDateFormat dateFormat = new                      
  SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");           
  Calendar start = Calendar.getInstance();               
  say("start time:"+dateFormat.format(start.getTime())); 

 Calendar ending = Calendar.getInstance();              
  say("ending time:"+dateFormat.format(ending.getTime()));
 long milli = ending.getTime().getTime()      
             - start.getTime().getTime();     
 long sec = milli / 1000; // millisec to sec  
 say("elapsed time: " + sec + "." + milli );  

可以显示两次。

 start time: 2018-03-02 15:44:41.194  
*** program runs ***
 ending time:2018-03-02 15:44:41.198 
 elapsed time: 0.4                   

但不应该说0.004秒吗?

请不要JodaTime回答。本店不支持。

4 个答案:

答案 0 :(得分:1)

    Instant start = Instant.now();

    Instant end = Instant.now();
    long milli = ChronoUnit.MILLIS.between(start, end);
    System.out.format(Locale.ENGLISH, "elapsed time: %.3f%n", milli / 1000.0);

在我的电脑上打印

  

已用时间:0.004

使用String.formatSystem.out.format()进行格式化也适用于您测量毫秒的方式。

如果需要,使用Java 9(至少在某些计算机上)可以有更多的小数:

    System.out.println("elapsed time: " 
            +  ChronoUnit.NANOS.between(start, end) / (double) TimeUnit.SECONDS.toNanos(1));

我得到了

  

已用时间:0.003739

答案 1 :(得分:0)

我为你写了一个小函数,它返回一个数字作为一个字符串,填充了多少" 0"如你所愿。

public String getStringNumber(long number, int displaySize) {
    String str = new String();
    int length = String.valueOf(number).length();
    while (length++ < displaySize)
        str += "0";
    str += number;
    return str;
}

现在您可以在代码中替换

say("elapsed time: " + sec + "." + getStringNumber(milli, 4));

答案 2 :(得分:0)

我终于找到了这个解决方案。它很尴尬而且不是很优雅,但它很有效。

  

日历结束= Calendar.getInstance();
  说(&#34;结束时间:&#34; + dateFormat.format(ending.getTime()));

     

long milli = ending.getTime()。getTime()
                - start.getTime()。getTime();

     

long hrs = TimeUnit.MILLISECONDS.toHours(milli)%24;
  长   min = TimeUnit.MILLISECONDS.toMinutes(milli)%60;
  长的   = TimeUnit.MILLISECONDS.toSeconds(milli)%60;
  long mls = milli%1000;
  String elaps =   String.format(&#34;%02d:%02d:%02d。%03d&#34;,hrs,
                                  min,sec,mls);

     

说(&#34;经过时间:&#34; +经过);

以下是解释:我将两个Calendar变量转换为long,然后减去。然后我将Long格式化为格式为hh:mm:ss.SSS的字符串,这首先是我想要的。

这是输出

  

结束时间:2018-03-05 15:07:17.923
                                         经过时间:00:01:15.964

答案 3 :(得分:0)

好吧,所以,只是在我的脑海中,不试图执行任何想象,你可以使用Java 8日期/时间API,它提供了计算两个时间点之间的差异的能力

因此,接受输入并通过下面的代码运行,输出

2018-03-02T15:44:41.194
2018-03-02T15:44:41.198
0.004

现在,就个人而言,我采取这个概念并简单地创建一个DurationFormatter,它可能需要Duration并吐出您所需的格式,但这里的想法是让您跳跃从...开始。

import java.time.Duration;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class Test {

    public static void main(String[] args) {
        String startTime = "2018-03-02 15:44:41.194";
        String endTime = "2018-03-02 15:44:41.198";

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");

        LocalDateTime startDateTime = LocalDateTime.parse(startTime, formatter);
        LocalDateTime endDateTime = LocalDateTime.parse(endTime, formatter);

        System.out.println(startDateTime);
        System.out.println(endDateTime);

        Duration duration = Duration.between(startDateTime, endDateTime);

        long hours = duration.toHours();
        duration = duration.minusHours(hours);
        long mins = duration.toMinutes();
        duration = duration.minusMinutes(mins);
        long secs = duration.getSeconds();
        duration = duration.minusSeconds(secs);
        long millis = duration.toMillis();

        StringBuilder sb = new StringBuilder(12);
        if (hours > 0) {
            sb.append(pad(hours, 2));
        }
        if (mins == 0 && sb.length() > 0) {
            sb.append(":00");
        } else if (mins > 0) {
            if (hours > 0) {
                sb.append(":");
            }
            sb.append(pad(mins, 2));
        }
        if (secs == 0 & sb.length() > 0) {
            sb.append(":00");
        } else if (secs > 0) {
            if (mins > 0) {
                sb.append(":");
            }
            sb.append(pad(secs, 2));
        }
        if (millis == 0 & sb.length() > 0) {
            sb.append(".00");
        } else if (millis > 0) {
            if (secs > 0 || sb.length() > 0) {
                sb.append(".");
            } else if (sb.length() == 0) {
                sb.append("0.");
            }
            sb.append(pad(millis, 3));
        }

        System.out.println(sb.toString());
    }

    public static String pad(long value, long length) {
        return String.format("%0" + length + "d", value);
    }

}

现在,如果我们将输入更改为......

String startTime = "2018-03-02 15:44:41.194";
String endTime = "2018-03-08 15:44:41.198";

输出

144:00:00.004

或者如果我们使用

String startTime = "2018-03-02 15:44:41.194";
String endTime = "2018-03-08 15:15:41.198";

输出

143:31:00.004

或者

String startTime = "2018-03-02 15:44:41.194";
String endTime = "2018-03-08 15:15:50.198";

输出

143:31:09.004

或者

2018-03-02T15:44:41.194
2018-03-02T15:50:41.194

输出

06:00.00

...对我而言,这是奇怪的,技术上它是正确的(6分钟),但从格式来看,很难准确推断出它意味着什么

这是我可能想要使用更像String.format("%02d:%02d:%02d.%04d", hours, mins, secs, millis)的东西来输出00:06:00.0000的地方,但这一切都可以满足您的需求。您需要决定如何最好地获取原始信息并根据您的需求呈现它,但有几个不同的想法