我想将秒转换为HH:mm:ss
时间格式,所以:
seconds = 3754
result = 10:25:40
我知道传统方法将它除以3600以获得小时数,但我想知道我是否可以通过Java API实现这一目标?
答案 0 :(得分:10)
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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,.Calendar
和&amp; java.text.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。