在Java 8/jsr310中格式化持续时间

Cha*_*owe 37 java duration jodatime java-8 java-time

我正在将项目从Joda-Time过渡到java8的本地时间库,我遇到了麻烦.我一直无法找到持续时间的格式化程序.我想有一个自定义字符串格式,例如,HHH + MM,其中75小时和15分钟的持续时间格式为"75 + 15".通过转换为句点并使用PeriodFormatter,使用Joda-Time很容易,但我无法在Java8中找到这种类型的类.我错过了什么吗?

Bas*_*que 29

Java 9及更高版本:Duration::to…Part方法

在Java 9中,Duration该类获得to…Part了返回天,小时,分钟,秒,毫秒/纳秒等各个部分的方法.请参阅此预发布的OpenJDK源代码.

鉴于持续时间为49H30M20.123S ......

  • toNanosPart() = 123000000
  • toMillisPart() = 123
  • toSecondsPart() = 20
  • toMinutesPart() = 30
  • toHoursPart() = 1
  • toDaysPart() = 2

请记住,这里的"天"意味着24小时的大块,忽略日历上的日期.如果您关心日期,请改用Periodclass.

我不知道是否添加了任何其他格式化程序功能.但至少你可以通过这些新的getter方法获得的数字更方便地生成自己的字符串.

Java 8

奇怪的是,Java 8中java.time的第一版发行版中没有包含这些值的方便的getter方法.在java.time框架的优秀设计中,很少有疏忽.

请参阅相关问题:为什么我不能在java.time中获得以分钟或小时为单位的持续时间?.


Men*_*ild 20

jsr-310中没有句点/持续时间格式化程序,与JodaTime不同.并非JodaTime的每个功能都移植到JSR-310(例如也不是PeriodType).反过来,JSR-310具有JodaTime中没有的一些功能(例如本地化的工作日数字或带有调整器的策略模式方法).

可能会发生Java 9将引入某种内置句点格式(从S. Colebourne读取一些内容).

结论:JSR-310和JodaTime彼此不完全兼容,因此可能需要做很多工作.我不会那么热衷于移民.您是否需要JUDTime不提供的JSR-310的特殊功能?

附加说明:您还应该了解joda期间(包括所有单位从几年到几秒)与jsr310期间(仅年,月,日)或jsr310持续时间(仅数小时,分钟,秒和分数秒).


ass*_*ias 19

没有内置方法,但您可以访问小时/分钟数而无需手动计算.您的具体格式如下:

Duration d = Duration.of(75, HOURS).plusMinutes(15);
long hours = d.toHours(); //75
long minutes = d.minusHours(hours).toMinutes(); //15
String HH_PLUS_MM = hours + "+" + minutes; //75+15
System.out.println(HH_PLUS_MM);
Run Code Online (Sandbox Code Playgroud)

如果保证持续时间少于24小时,您也可以使用此技巧:

String hhPlusMm = LocalTime.MIDNIGHT.plus(d).format(DateTimeFormatter.ofPattern("HH+mm"));
Run Code Online (Sandbox Code Playgroud)

  • @IgorGanapolsky`import static java.time.temporal.ChronoUnit.HOURS;` (4认同)

Gre*_*gor 8

你可以使用来自commons-lang3-time 的DurationFormatUtils(你必须使用"mm",因为格式与in相同SimpleDateFormat): DurationFormatUtils.formatDuration(interval.toMillis(), "HHH+mm")

可悲的是,我发现没有办法排除空白部分,就像在我的情况下,天或小时可能是0,所以我仍然不得不自己动手.

更新:我在Apache commons.lang.time.DurationFormatUtils JIRA上为此打开了一个问题.

  • [DurationFormatUtils.formatDurationWords](https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/time/DurationFormatUtils.html#formatDurationWords-long-boolean-boolean-)可以使用排除空字段。`DurationFormatUtils.formatDurationWords(interval.toMillis(), true, true)` (5认同)