当前位置: 首页 > 知识库问答 >
问题:

在Java8/jsr310中格式化持续时间

沈子昂
2023-03-14

我正在将一个项目从Joda Time过渡到java8的本机时间库,我遇到了一个障碍。

我一直找不到持续时间的格式化程序。我想有一个自定义的字符串格式,例如HHH MM,其中75小时15分钟的持续时间将格式化为“75 15”。

通过转换为句点并使用句点Formatter,Joda-Time很容易做到这一点,但是我无法在Java8中找到这种类型的类。我错过了什么吗?

共有3个答案

阎修杰
2023-03-14

没有内置方法,但您可以访问小时/分钟数,而无需手动计算。您的特定格式可能如下所示:

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);

如果持续时间保证在24小时以内,也可以用这个招数:

String hhPlusMm = LocalTime.MIDNIGHT.plus(d).format(DateTimeFormatter.ofPattern("HH+mm"));
陶瀚玥
2023-03-14

与JodaTime不同,jsr-310中没有period/duration-formatter。并不是JodaTime的每个特性都被移植到JSR-310上(例如也不是PeriodType)。反过来,JSR-310具有一些在JodaTime中不可用的功能(例如,本地化的工作日数字或带有调整器的策略模式方法)。

Java9可能会引入某种内置的句点格式(请阅读S.Colebourne的文章)。

结论:JSR-310和JodaTime彼此不完全兼容,因此可能需要做很多工作。我不会那么热衷于尽快移徙。您是否需要JSR-310的特殊功能,而JodaTime没有提供这些功能?

附加说明:您还应该注意到joda period(包括从年到秒的所有单位)与html" target="_blank">jsr310-period(仅年、月、日)或jsr310-duration(仅小时、分钟、秒和小数秒)不完全兼容。

侯池暝
2023-03-14

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

给定49小时30分20.123秒的持续时间…

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

请记住,这里的“天”表示24小时的大块,忽略日历上的日期。如果您关心日期,请改用周期类。

我不知道是否添加了任何额外的格式化程序功能。但至少您将能够更方便地从通过这些新的getter方法获得的数字中生成自己的字符串。

奇怪的是,java第一版中没有包含用于这些值的方便的getter方法。在Java 8中的时间。这是Java的优秀设计中少有的疏忽之一。时间框架

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

 类似资料:
  • 问题内容: 我想使用H:MM:SS之类的格式以秒为单位格式化持续时间。Java中的当前实用程序旨在格式化时间而不是持续时间。 问题答案: 如果你使用的Java版本早于8 …,则可以使用Joda Time和PeriodFormatter。如果你确实有持续时间(例如,经过的时间量,没有参考日历系统),那么你可能应该大部分时间都在使用-然后可以致电(指定要反映25小时是否变为25小时) 1天1小时与否,

  • 我正在寻找一种从“ISO 8601持续时间格式”(P0DT0H0M0S)转换为小时的便捷方法。 到目前为止,我想到了这个: 如您所见,我的方法是将数字拆分并乘以24、1、1/60、1/3600以得到小时。我可以减少代码量吗? 样本数据和所需结果 输入: 'P1DT2H3M44S' (1 天 2 小时 3 分 44 秒) 期望输出: 26.062222222222222 (这是小时)

  • 问题内容: 我有这个简单的代码: 然后我将得到以下异常: 如何解决这个问题? 问题答案: 是没有时区的日期时间。您以格式指定了时区偏移格式符号,但是没有此类信息。这就是为什么发生错误。 如果您需要时区信息,请使用。

  • 我需要一些解释为什么这个代码不编译: 错误: 类型Duration中的(TemporalAmount)方法不适用于参数(ChronoUnit) 正如本文所述: public static Duration from(TemporalAmount amount)从时间量中获取持续时间的实例。这将根据指定的金额获得持续时间。TemporalAmount表示一个时间量,可以是基于日期的,也可以是基于时间

  • 问题内容: jOOQ是否结合PostgreSQL提供对JSR310的支持?特别是,我尝试使用以下类: 我正在存储以下数据类型(根据http://www.postgresql.org/docs/9.1/static/datatype- datetime.html ): : : : : 这些数据类型正确吗? jOOQ是否支持,和之间以及上述四个类之间的转换(双向)? 问题答案: jOOQ路线图 直到j

  • jOOQ是否结合PostgreSQL为JSR310提供支持?特别是,我尝试使用以下类: