我正在尝试将时间差显示为字符串,其形式为00:00:00(小时:分钟:秒),零填充。我有以下代码:
long timeDiff = System.currentTimeMillis() - mStartRecordingTime;
time = DateFormat.format("hh:mm:ss", timeDiff).toString();
当timeDiff不超过几秒但我的小时没有显示为00时,我正在测试它。顺便说一句,我在JST时区。
答案 0 :(得分:2)
long timeDiff = System.currentTimeMillis() - mStartRecordingTime;
String time = new SimpleDateFormat("hh:mm:ss").format(new Date(timeDiff));
答案 1 :(得分:2)
你从哪里获得mStartRecordingTime?它不像我在同一语言环境中使用System.currentTimeMillis()设置的那样;如果它已经存在,那么时差会反映出实际的差异,这会有效。似乎记录时间以某种方式设置为UTC,距离JST 9小时。
另一张海报是正确的,使用此值生成的日期将接近纪元,但如果您只是想获得小时,分钟和秒,那么您应该没事。请记住,您正在处理已用时间,而不是时钟/日历时间,所以我不希望日期格式化(而不是时间格式化)对您有效。
答案 2 :(得分:0)
您需要补偿时区。根据您所拥有的,最简单的方法是更改日期格式化程序以使用UTC作为时区。以下是一些应该有用的代码:
long timeDiff = System.currentTimeMillis() - mStartRecordingTime;
DateFormat df = new SimpleDateFormat("HH:mm:ss");
df.setTimeZone(TimeZone.getTimeZone("UTC"));
String time = df.format(new Date(timeDiff));
请注意,更改为“HH”是以24小时格式显示时间的日期格式。
答案 3 :(得分:0)
Duration.between(
LocalTime.of( 12 , 5 , 0 ) ,
LocalTime.of( 12 , 7 , 0 )
).toString()
PT2M
如果我强烈建议您使用Duration
,则坚持使用模糊/混乱的时间格式:
LocalTime.MIN.plus(
Duration.between(
LocalTime.of( 12 , 5 , 0 ) ,
LocalTime.of( 12 , 7 , 0 )
)
).toString();
00:02
要强制所有三个组件(小时,分钟,秒),请使用预定义的DateTimeFormatter.ISO_LOCAL_TIME
。
LocalTime.MIN.plus(
Duration.between(
LocalTime.of( 12 , 5 , 0 ) ,
LocalTime.of( 12 , 7 , 0 )
)
).format( DateTimeFormatter.ISO_LOCAL_TIME )
00:02:00
请勿滥用java.util.Date
等日期时间类来存储已用时间。这样一个阶级代表的是一个时刻,而不是一段时间。
请勿使用麻烦的旧日期时间类,例如java.util.Date
。这些现在被java.time类取代。
Instant
Instant
类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds。
获取当前时刻。
Instant now = Instant.now();
模拟以后的时间。
Instant future = now.plus( Duration.ofMinutes( 5 ) );
Duration
使用Duration
或Period
对象捕获已用时间。其中每个代表一段时间,第一个处理时间 - 小时 - 分钟 - 秒,第二个处理数年 - 月 - 天。
Duration duration = Duration.between( now , future );
要将该持续时间值显示为String,请不要使用时间格式,因为这是不明确的。而是使用标准ISO 8601 format for durations。这种格式PnYnMnDTnHnMnS
标志着P
的开头。中间的T
将年 - 月 - 日部分与小时 - 分 - 秒部分分开。例如,两个半小时是PT2H30M
。我们这里的五分钟示例是PT5M
。
String output = duration.toString(); // PT5M
LocalTime
如果您确实有实际的时间,并希望使用填充零进行格式化,请使用默认格式LocalTime::toString
。
LocalTime.now( ZoneId.of( "America/Montreal" ) ).toString(); // 02:03:04.789Z
另一个例子。我再次不建议以这种方式滥用LocalTime
。 (相反,坚持使用Duration
经过的时间。)
LocalTime start = LocalTime.now( ZoneId.of( "America/Montreal" ) );
LocalTime stop = start.plusMinutes( 7 );
Duration d = Duration.between( start , stop );
LocalTime result = LocalTime.MIN.plus( d ); // I do *not* recommend abusing `LocalTime` this way. Use `Duration` instead for elapsed time.
DateTimeFormatter f = DateTimeFormatter.ISO_LOCAL_TIME ;
String output = result.format( f );
System.out.println( "output: " + output );
输出:00:07:00
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。