经过的时间格式 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
这是一个简单的问题,但我没有让它工作。
我每秒递增一个变量,并以毫秒为单位在 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