【问题标题】:Parsing human readable intervals in Java在 Java 中解析人类可读的间隔
【发布时间】:2021-09-06 06:47:50
【问题描述】:

许多应用程序支持人类可读的间隔,如 20d、1y、2m1d 等。

是否存在解析这些内容的既定最佳实践?经验告诉我们,由于我们的日历很古怪,时间解析通常会给粗心的旅行者带来大量陷阱。

【问题讨论】:

  • 我想你在找java.time.Duration
  • 是的:这些不是间隔,而是持续时间。
  • @ElliottFrisch 虽然Duration 适合保存数据并且确实支持解析,但它只支持将自己描述为PnDTnHnMn.nS 的语法,这至少有点不那么人类可读 比给定的例子。
  • @Izruo 机械转换然后使用内置解析器是一种选择。与使用自定义代码解析一样。无论哪种方式,使用内置类型都可能比从头开始更容易。

标签: java date intervals


【解决方案1】:

java.time

使用 Java 8 及更高版本中内置的 java.time 类。这些取代了可怕的遗留日期时间类。

Period

在这些类中,Period 代表一个时间跨度,与您无关的时间线以年-月-日为尺度。

ISO 8601

该类在解析/生成文本时使用标准ISO 8601 formatPnYnMnDTnHnMnSP 是开头,T 将任何年-月-日与任何小时-分钟-秒分开。

String input = "P2M1D" ;
Period p = Period.parse( input ) ;

如果您有非标准输入,例如 20d,您可以进行一些简单的字符串操作以符合标准。

String input = "20d" ;
String modified = "P" + input.toUpperCase() ;
Period p = Period.parse( modified ) ;

ThreeTen-Extra

要表示附加到时间线的时间跨度,请将 ThreeTen-Extra 库添加到您的项目中。使用其LocalDateRange 类来表示一对LocalDate 对象,以及方便的比较方法,例如containsabuts 等。

【讨论】:

  • 您不需要致电toUpperCase()Period.parse() 不区分大小写。
猜你喜欢
  • 1970-01-01
  • 2010-11-30
  • 1970-01-01
  • 2012-07-16
  • 2010-11-21
  • 2012-10-30
  • 1970-01-01
  • 2013-04-05
  • 1970-01-01
相关资源
最近更新 更多