148 java duration date-formatting
我想用H:MM:SS这样的模式格式化持续时间(以秒为单位).java中的当前实用程序旨在格式化时间而不是持续时间.
bob*_*nce 185
如果你不想在库中拖动,那么使用Formatter或相关的快捷方式就足够了.给定整数秒数s:
String.format("%d:%02d:%02d", s / 3600, (s % 3600) / 60, (s % 60));
Run Code Online (Sandbox Code Playgroud)
Gil*_*hum 103
我使用Apache common的DurationFormatUtils,如下所示:
DurationFormatUtils.formatDuration(millis, "**H:mm:ss**", true);
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 76
如果您使用的是8之前的Java版本...您可以使用Joda Time和PeriodFormatter.如果你真的有一个持续时间(即经过了一段时间,没有参考日历系统),那么你应该Duration大部分时间都在使用- 然后你可以打电话toPeriod(指明PeriodType你想要反映的是否25小时变成1天和1小时或不等,以获得Period您可以格式化的.
如果您使用的是Java 8或更高版本:我通常会建议使用它java.time.Duration来表示持续时间.然后,getSeconds()如果需要,您可以根据bobince的答案调用或类似获取标准字符串格式的整数 - 尽管您应该注意持续时间为负的情况,因为您可能希望输出字符串中有一个负号.所以类似于:
public static String formatDuration(Duration duration) {
long seconds = duration.getSeconds();
long absSeconds = Math.abs(seconds);
String positive = String.format(
"%d:%02d:%02d",
absSeconds / 3600,
(absSeconds % 3600) / 60,
absSeconds % 60);
return seconds < 0 ? "-" + positive : positive;
}
Run Code Online (Sandbox Code Playgroud)
如果手动烦人,格式化这种方式相当简单.对于解析它一般来说变得更难了......当然,如果你愿意,你仍然可以使用Joda Time甚至Java 8.
小智 25
long duration = 4 * 60 * 60 * 1000;
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss.SSS", Locale.getDefault());
log.info("Duration: " + sdf.format(new Date(duration - TimeZone.getDefault().getRawOffset())));
Run Code Online (Sandbox Code Playgroud)
Ole*_*.V. 19
使用Java 9会更容易.Duration但仍然不是可格式化的(我所知道的),但是添加了获取小时,分钟和秒的方法,这使得任务变得更加简单:
Duration diff = // ...;
String hms = String.format("%d:%02d:%02d",
diff.toHoursPart(),
diff.toMinutesPart(),
diff.toSecondsPart());
Run Code Online (Sandbox Code Playgroud)
ctg*_*ctg 10
有一种相当简单且(IMO)优雅的方法,至少在少于 24 小时的持续时间内:
DateTimeFormatter.ISO_LOCAL_TIME.format(value.addTo(LocalTime.of(0, 0)))
格式化程序需要一个时间对象来格式化,因此您可以通过将持续时间添加到 00:00(即午夜)的 LocalTime 来创建一个。这将为您提供一个 LocalTime,表示从午夜到该时间的持续时间,然后可以轻松地以标准 HH:mm:ss 表示法进行格式化。这样做的好处是不需要外部库,使用java.time库来做计算,而不是手动计算小时、分钟和秒。
这可能是一种hacky,但如果一个人倾向于使用Java 8来实现这一点,这是一个很好的解决方案java.time:
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.temporal.ChronoField;
import java.time.temporal.Temporal;
import java.time.temporal.TemporalAccessor;
import java.time.temporal.TemporalField;
import java.time.temporal.UnsupportedTemporalTypeException;
public class TemporalDuration implements TemporalAccessor {
private static final Temporal BASE_TEMPORAL = LocalDateTime.of(0, 1, 1, 0, 0);
private final Duration duration;
private final Temporal temporal;
public TemporalDuration(Duration duration) {
this.duration = duration;
this.temporal = duration.addTo(BASE_TEMPORAL);
}
@Override
public boolean isSupported(TemporalField field) {
if(!temporal.isSupported(field)) return false;
long value = temporal.getLong(field)-BASE_TEMPORAL.getLong(field);
return value!=0L;
}
@Override
public long getLong(TemporalField field) {
if(!isSupported(field)) throw new UnsupportedTemporalTypeException(new StringBuilder().append(field.toString()).toString());
return temporal.getLong(field)-BASE_TEMPORAL.getLong(field);
}
public Duration getDuration() {
return duration;
}
@Override
public String toString() {
return dtf.format(this);
}
private static final DateTimeFormatter dtf = new DateTimeFormatterBuilder()
.optionalStart()//second
.optionalStart()//minute
.optionalStart()//hour
.optionalStart()//day
.optionalStart()//month
.optionalStart()//year
.appendValue(ChronoField.YEAR).appendLiteral(" Years ").optionalEnd()
.appendValue(ChronoField.MONTH_OF_YEAR).appendLiteral(" Months ").optionalEnd()
.appendValue(ChronoField.DAY_OF_MONTH).appendLiteral(" Days ").optionalEnd()
.appendValue(ChronoField.HOUR_OF_DAY).appendLiteral(" Hours ").optionalEnd()
.appendValue(ChronoField.MINUTE_OF_HOUR).appendLiteral(" Minutes ").optionalEnd()
.appendValue(ChronoField.SECOND_OF_MINUTE).appendLiteral(" Seconds").optionalEnd()
.toFormatter();
}
Run Code Online (Sandbox Code Playgroud)
还有另一种方法可以为 java8 制作它。但如果持续时间不超过 24 小时,则有效
public String formatDuration(Duration duration) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("h:mm.SSS");
return LocalTime.ofNanoOfDay(duration.toNanos()).format(formatter);
}
Run Code Online (Sandbox Code Playgroud)
小智 6
这是另一个如何格式化持续时间的示例.请注意,此示例将正和负持续时间显示为正持续时间.
import static java.time.temporal.ChronoUnit.DAYS;
import static java.time.temporal.ChronoUnit.HOURS;
import static java.time.temporal.ChronoUnit.MINUTES;
import static java.time.temporal.ChronoUnit.SECONDS;
import java.time.Duration;
public class DurationSample {
public static void main(String[] args) {
//Let's say duration of 2days 3hours 12minutes and 46seconds
Duration d = Duration.ZERO.plus(2, DAYS).plus(3, HOURS).plus(12, MINUTES).plus(46, SECONDS);
//in case of negative duration
if(d.isNegative()) d = d.negated();
//format DAYS HOURS MINUTES SECONDS
System.out.printf("Total duration is %sdays %shrs %smin %ssec.\n", d.toDays(), d.toHours() % 24, d.toMinutes() % 60, d.getSeconds() % 60);
//or format HOURS MINUTES SECONDS
System.out.printf("Or total duration is %shrs %smin %sec.\n", d.toHours(), d.toMinutes() % 60, d.getSeconds() % 60);
//or format MINUTES SECONDS
System.out.printf("Or total duration is %smin %ssec.\n", d.toMinutes(), d.getSeconds() % 60);
//or format SECONDS only
System.out.printf("Or total duration is %ssec.\n", d.getSeconds());
}
}
Run Code Online (Sandbox Code Playgroud)
我不确定这是您想要的,但请查看此 Android 助手类
import android.text.format.DateUtils
Run Code Online (Sandbox Code Playgroud)
例如: DateUtils.formatElapsedTime()
您可以使用java.time.Duration它以ISO-8601 标准为模型,并作为JSR-310 实现的一部分随Java-8一起引入。Java-9引入了一些更方便的方法。
演示:
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.Month;
public class Main {
public static void main(String[] args) {
LocalDateTime startDateTime = LocalDateTime.of(2020, Month.DECEMBER, 10, 15, 20, 25);
LocalDateTime endDateTime = LocalDateTime.of(2020, Month.DECEMBER, 10, 18, 24, 30);
Duration duration = Duration.between(startDateTime, endDateTime);
// Default format
System.out.println(duration);
// Custom format
// ####################################Java-8####################################
String formattedElapsedTime = String.format("%02d:%02d:%02d", duration.toHours() % 24,
duration.toMinutes() % 60, duration.toSeconds() % 60);
System.out.println(formattedElapsedTime);
// ##############################################################################
// ####################################Java-9####################################
formattedElapsedTime = String.format("%02d:%02d:%02d", duration.toHoursPart(), duration.toMinutesPart(),
duration.toSecondsPart());
System.out.println(formattedElapsedTime);
// ##############################################################################
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
PT3H4M5S
03:04:05
03:04:05
Run Code Online (Sandbox Code Playgroud)
从Trail: Date Time了解现代日期时间 API 。
下面的函数如何返回 +H:MM:SS 或 +H:MM:SS.sss
public static String formatInterval(final long interval, boolean millisecs )
{
final long hr = TimeUnit.MILLISECONDS.toHours(interval);
final long min = TimeUnit.MILLISECONDS.toMinutes(interval) %60;
final long sec = TimeUnit.MILLISECONDS.toSeconds(interval) %60;
final long ms = TimeUnit.MILLISECONDS.toMillis(interval) %1000;
if( millisecs ) {
return String.format("%02d:%02d:%02d.%03d", hr, min, sec, ms);
} else {
return String.format("%02d:%02d:%02d", hr, min, sec );
}
}
Run Code Online (Sandbox Code Playgroud)
此答案仅使用Duration方法,并且可以在Java 8中使用:
public static String format(Duration d) {
long days = d.toDays();
d = d.minusDays(days);
long hours = d.toHours();
d = d.minusHours(hours);
long minutes = d.toMinutes();
d = d.minusMinutes(minutes);
long seconds = d.getSeconds() ;
return
(days == 0?"":days+" jours,")+
(hours == 0?"":hours+" heures,")+
(minutes == 0?"":minutes+" minutes,")+
(seconds == 0?"":seconds+" secondes,");
}
Run Code Online (Sandbox Code Playgroud)