[英]calculate elapsed time and display it in Java
对于这个问题,stackoverflow 中似乎没有简单的答案。 我只是想获得两个日历实例之间的差异并以 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。 本店不支持。
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.format
或System.out.format()
格式化也适用于您测量毫秒的方式。
如果需要,使用 Java 9(至少在某些计算机上)可以有更多的小数:
System.out.println("elapsed time: "
+ ChronoUnit.NANOS.between(start, end) / (double) TimeUnit.SECONDS.toNanos(1));
我有
经过时间:0.003739
我为你写了一个小函数,它返回一个数字作为一个字符串,里面有你想要的尽可能多的“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));
我终于找到了这个解决方案。 这很尴尬,也不是很优雅,但它有效。
日历结尾 = Calendar.getInstance();
say("结束时间:"+dateFormat.format(ending.getTime()));长毫 = 结束.getTime().getTime()
- start.getTime().getTime();long hrs = TimeUnit.MILLISECONDS.toHours(milli) % 24;
long min = TimeUnit.MILLISECONDS.toMinutes(milli) % 60;
long sec = TimeUnit.MILLISECONDS.toSeconds(milli) % 60;
长毫升 = 毫 % 1000;
String elaps = String.format("%02d:%02d:%02d.%03d", hrs,
分钟,秒,毫升);say("经过的时间:" + eps);
这是解释:我将两个 Calendar 变量转换为 long,然后相减。 然后我将 Long 格式化为 hh:mm:ss.SSS 格式的字符串,这是我首先想要的。
这是输出
结束时间:2018-03-05 15:07:17.923
经过时间:00:01:15.964
好的,所以,简单地从我的脑海中浮现出来,无需尝试执行任何花哨的操作,您可以使用 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
,但这一切来做你的需要。 您需要决定如何最好地获取原始信息并根据您的需要呈现它,但有几个不同的想法
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.