我希望将秒转换为HH:mm:ss
时间格式,因此:
seconds = 3754
result = 10:25:40
我知道传统方法是将时间除以3600得到小时等,但我想知道是否可以通过Java API实现这一点?
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()));
calendar.set(Calendar.SECOND, 56099 + 30)
。 - david a.LocalTime
Java内置的java.time类可以实现此功能。LocalTime
类表示一天中的时间,不包括日期和时区。该类包含一天中的秒数,即从一天开始计算的秒数。
LocalTime lt = LocalTime.ofSecondOfDay( 3_754L );
但是结果与您在问题中展示的不太相似。
lt.toString():01:02:34
不要使用时间来表示经过的时间。这会导致混淆和歧义。不要使用时间类,也不要使用时间格式的字符串。
对于范围在天-小时-分钟-秒之间的经过时间,请使用Duration
类。
Duration d = Duration.ofSeconds( 3_754L );
d.toString(): PT1H2M34S
这个输出是一个字符串,采用标准的ISO 8601格式生成,格式为PnYnMnDTnHnMnS
,其中P
表示开始,T
将年月日部分与小时分钟秒钟部分分开。因此,上面看到的结果意味着“一小时,两分钟和三十四秒”。
java.time框架内置于Java 8及以上版本。这些类取代了老旧的遗留日期时间类,如java.util.Date
, .Calendar
和java.text.SimpleDateFormat
。
Joda-Time项目现在处于维护模式,建议迁移到java.time。
要了解更多,请参见Oracle教程。在Stack Overflow上搜索许多示例和解释。规范为JSR 310。Interval
, YearWeek
, YearQuarter
和更多。在我的自己的库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
PeriodFormatter f =
new PeriodFormatterBuilder().appendHours().appendLiteral(":").appendMinutes()
.appendLiteral(":").appendSeconds().toFormatter();
System.out.println("Joda-Time: " + f.print(new Period(37540 * 1000))); // 10:25:40
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