经过的时间格式 HH:mm:ss

Elapsed time format HH:mm:ss

这是一个简单的问题,但我没有让它工作。

我每秒递增一个变量,并以毫秒为单位在 GregorianCalendar 中设置它。

我正在使用这种格式 HH:mmss 来显示经过的时间。

问题是小时开始显示 01 而不是 00。例如,在 1 分 35 秒后显示的是:01:01:35 而不是 00:01:35

问题出在哪里?

有重要代码:

GregorianCalendar timeIntervalDone = new GregorianCalendar(TimeZone.getTimeZone("GMT-1")); //initially I didn't have the TimeZone set, but no difference
SimpleDateFormat dateTimeIntervalFormat = new SimpleDateFormat("HH:mm:ss");

public String getTimeIntervalDoneAsString() {
    timeIntervalDone.setTimeInMillis(mTimeIntervalDone); //mTimeIntervalDone is the counter: 3seccond -> mTimeIntervalDone = 3000
    return dateTimeIntervalFormat.format(timeIntervalDone.getTime());
}

我认为原因是您将时区设置为 GMT-1,但输出是 utc。请在没有那个时区的情况下尝试,它应该可以工作。

我终于明白了:

GregorianCalendar timeIntervalDone = new GregorianCalendar(); 
SimpleDateFormat dateTimeIntervalFormat = new SimpleDateFormat("HH:mm:ss");
dateTimeIntervalFormat.setTimeZone(TimeZone.getTimeZone("GMT"));

您的方法是一种 hack,试图使用日期时间时刻 class (GregorianCalendar) 来表示时间跨度。另外,您的格式不明确,看起来像是时间而不是持续时间。

ISO 8601

另一种方法是使用 ISO 8601 standard way of describing a duration: PnYnMnDTnHnMnS,其中 P 标记开始,T 将年-月-日部分与时-分-秒部分分开。

java.time

Java 8 和更高版本中的 java.time 框架取代了旧的 java.util.Date/.Calendar classes。旧的 classes 已被证明是麻烦、混乱和有缺陷的。避开它们。

java.time 框架的灵感来自非常成功的 Joda-Time library, defined by JSR 310, extended by the ThreeTen-Extra project, and explained in the Tutorial

java.time 框架确实使用 ISO 8601 作为其默认值,这组优秀的 classes 缺少 class 来表示整个年-月-日-小时-分钟-秒。相反,它将概念一分为二。 Period class handles years-months-days while the Duration class 处理小时-分钟-秒。

Instant now = Instant.now ();
Instant later = now.plusSeconds ( 60 + 35 ); // One minute and 35 seconds later.

Duration duration = Duration.between ( now , later );
String output = duration.toString ();

转储到控制台。

System.out.println ( "output: " + output );

output: PT1M35S