我阅读了之前的帖子并了解了以下内容,但仍然无效。任何人都可以帮助我吗?
long startTime = System.currentTimeMillis();
......
long endTime = System.currentTimeMillis();
long different = endTime - startTime;
System.out.println("different : " + different);
long s = (different / 1000) % 60;
long m = (different / (1000 * 60)) % 60;
long h = (different / (1000 * 60 * 60)) % 24;
System.out.println(String.format("%d:%02d:%02d", h,m,s));
为什么我的输出时间仍为0:00:00?
[output]
different : 473
0:00:00
答案 0 :(得分:3)
因为473毫秒< 1s,所以你得到0:00:00。
答案 1 :(得分:1)
你正在运行473毫秒。那是半秒钟。
然后显示执行的小时分钟和秒,对所有小时都是0。
您的输出是正确的。
答案 2 :(得分:0)
您现在获得的输出在逻辑上是正确的。如果要计算毫秒时间,还要在print语句中显示毫秒数。
System.out.println(String.format("%02d:%02d:%02d.%03d", h,m,s,mls));
答案 3 :(得分:0)
Instant now = Instant.now();
String output = Duration.between( now ,
now.plus( 473 , ChronoUnit.MILLISECONDS ) )
.toString();
PT0.473S
正如其他人所说的那样,473毫秒不到一秒钟,因此它显示为零整秒。
不要使用时间格式跟踪已用时间。它含糊不清,令人困惑。并且根据您的格式细节会遇到这种小问题。
相反,请使用标准ISO 8601 format for a span of time:PnYnMnDTnHnMnS
,其中P
标记开头,T
将年 - 月 - 天与小时 - 分 - 秒分开。
您正在使用现在由java.time类取代的麻烦的旧日期时间类。
Instant
Instant
类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds。
Instant instant = Instant.now();
让我们通过在未来几分钟的时间来模拟输入数据。
Instant future = instant.plus( 473 , ChronoUnit.MILLISECONDS );
Duration
Duration
类表示从时间轴中未附加的时间跨度。
Duration duration = Duration.between( instant , future );
生成ISO 8601格式的字符串。
String output = duration.toString();
PT0.473S
内部跟踪的数字为整秒,加上一小部分秒数,以纳秒为单位。所以把它想象成:
持续时间=(秒+纳米)
您可以要求整秒的总数和小秒的秒数。
long seconds = duration.getSeconds();
int nanos = duration.getNano();
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧日期时间类,例如java.util.Date
,.Calendar
和& java.text.SimpleDateFormat
。
现在位于Joda-Time的maintenance mode项目建议迁移到java.time。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。
大部分java.time功能都被反向移植到Java 6& ThreeTen-Backport中的7,并进一步适应Android中的ThreeTenABP(见How to use…)。
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
等。