在Java中获取时间hh:mm:ss从秒开始

时间:2014-02-24 12:37:38

标签: java time

我想将秒转换为HH:mm:ss时间格式,所以:

seconds = 3754 
result  = 10:25:40 

我知道传统方法将它除以3600以获得小时数,但我想知道我是否可以通过Java API实现这一目标?

3 个答案:

答案 0 :(得分:10)

使用java.util.Calendar

    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.HOUR_OF_DAY, 0);
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.MILLISECOND, 0);      
    calendar.set(Calendar.SECOND, 37540);
    System.out.println(new SimpleDateFormat("HH:mm:ss").format(calendar.getTime()));

答案 1 :(得分:1)

更新并更正了我的回答:

在我自己的库Time4J(v1.2)中,为Java 6及更高版本准备的基于模式的解决方案如下所示:

Duration<?> dur = 
  Duration.of(37540, ClockUnit.SECONDS).with(Duration.STD_CLOCK_PERIOD);
String s = Duration.Formatter.ofPattern("hh:mm:ss").format(dur);
System.out.println(s); // 10:25:40

在Joda-Time中,使用构建器方法可以使用以下代码:

PeriodFormatter f =
  new PeriodFormatterBuilder().appendHours().appendLiteral(":").appendMinutes()
  .appendLiteral(":").appendSeconds().toFormatter();
System.out.println("Joda-Time: " + f.print(new Period(37540 * 1000))); // 10:25:40

我之前发布的解决方案是基于字段的解决方法(使用字段SECOND_OF_DAY),它具有严重的缺点,即限制为小于86400(日长)的秒。 使用旧日历代码接受的答案也受到这个错误的影响,因此它不是一个真正的解决方案。在Java-8(包含一个新的时间库 - JSR-310)中也没有解决方案可用,因为它仍然错过格式化持续时间的可能性。不同提案的示例输出:

input = 337540 seconds (almost 4 days)
code of accepted solution => 21:45:40 (WRONG!!!)
Time4J-v1.2 => 93:45:40
Joda-Time => 93:45:40

结论,使用外部库来解决您的问题。

答案 2 :(得分:0)

LocalTime

Java中构建的java.time类可以执行此操作。 LocalTime类表示没有日期且没有时区的时间。这个课程包括第二天的概念,从一天开始的几秒钟。

LocalTime lt = LocalTime.ofSecondOfDay( 3_754L );

但结果与您在问题中显示的结果并不相符。

  

lt.toString():01:02:34

持续时间

请勿使用时间来表示已用时间。令人困惑和暧昧。不要使用时间类,也不要使用时间字符串格式。

对于在day-hours-minutes-seconds范围内的经过时间,请使用Duration类。

Duration d = Duration.ofSeconds( 3_754L );
  

d.toString():PT1H2M34S

该输出是以标准ISO 8601格式PnYnMnDTnHnMnS生成的字符串,其中P标记开头,T分隔年 - 月 - 日部分小时 - 分 - 秒部分。所以上面的结果意味着“一小时,两分钟,三十四秒”。

关于java.time

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

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

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

从哪里获取java.time类?

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