日期格式的零填充小时

时间:2012-01-08 02:17:00

标签: java time date-format hour

我正在尝试将时间差显示为字符串,其形式为00:00:00(小时:分钟:秒),零填充。我有以下代码:

long timeDiff = System.currentTimeMillis() - mStartRecordingTime;
time = DateFormat.format("hh:mm:ss", timeDiff).toString(); 

当timeDiff不超过几秒但我的小时没有显示为00时,我正在测试它。顺便说一句,我在JST时区。

4 个答案:

答案 0 :(得分:2)

使用SimpleDateFormat

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)

TL;博士

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

请参阅live code in IdeOne.com

时刻!=时间跨度

请勿滥用java.util.Date等日期时间类来存储已用时间。这样一个阶级代表的是一个时刻,而不是一段时间。

避免遗留日期时间类

请勿使用麻烦的旧日期时间类,例如java.util.Date。这些现在被java.time类取代。

Instant

Instant类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds

获取当前时刻。

Instant now = Instant.now();

模拟以后的时间。

Instant future = now.plus( Duration.ofMinutes( 5 ) );

Duration

使用DurationPeriod对象捕获已用时间。其中每个代表一段时间,第一个处理时间 - 小时 - 分钟 - 秒,第二个处理数年 - 月 - 天。

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

请参阅live code in IdeOne.com

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore