【问题标题】:Convert Plain Language Duration to Joda Period or ISO 8601将普通语言持续时间转换为 Joda Period 或 ISO 8601
【发布时间】:2013-01-03 23:09:32
【问题描述】:

我有一个看起来像这样的字符串:“n YEARS n MONTHS n WEEKS n DAYS”(请注意,常量可能是复数形式,也可能不是复数形式)

我需要将其转换为 Joda Period 对象或 ISO 8601 格式的字符串(又可以转换为 Period 对象)。

有没有人有任何代码,或者他们可以指点我一个库来做这个吗?

更新:如果有人需要这样做,这里是工作代码。不幸的是,我不得不动态构建 PeriodFormatterBuilder,因为这些字段是可选的。有点难看,但可以。

Update2:修复了 cmets 中指出的错误。

String text = expr1a.getText();
System.out.println(text);

PeriodFormatterBuilder pfb = new PeriodFormatterBuilder().printZeroAlways();

int yearIndex = text.indexOf("YEAR");
int monthIndex = text.indexOf("MONTH");
int weekIndex = text.indexOf("WEEK");
int dayIndex = text.indexOf("DAY");

if (yearIndex > -1) {
  pfb = pfb.appendYears().appendSuffix(" YEAR"," YEARS");
}

if (monthIndex > -1) {
  if (yearIndex > -1) {
    pfb = pfb.appendPrefix(" ").appendMonths().appendSuffix(" MONTH", " MONTHS");
  } else {
    pfb = pfb.appendMonths().appendSuffix(" MONTH", " MONTHS");
  }
} 

if (weekIndex > -1) {
  if (yearIndex > -1 || monthIndex > -1) {
    pfb = pfb.appendPrefix(" ").appendWeeks().appendSuffix(" WEEK", " WEEKS");
  } else {
    pfb = pfb.appendWeeks().appendSuffix(" WEEK", " WEEKS");
  }
}

if (dayIndex > -1) {
  if (yearIndex > -1 || monthIndex > -1 || weekIndex > -1) {
     pfb = pfb.appendPrefix(" ").appendDays().appendSuffix(" DAY"," DAYS");
  } else {
    pfb = pfb.appendDays().appendSuffix(" DAY"," DAYS");
  }
}

PeriodFormatter pf = pfb.toFormatter();

Period period = Period.parse(text, pf);
return period;

【问题讨论】:

  • 您需要解析字符串并提取值,然后从它们创建 Joda 持续时间应该相当简单。看看一些用于 java 的词法分析器实现,例如giocc.com/…
  • 如果没有YEAR的值,那么格式化程序会在月份值的前面有一个额外的空格,这将导致解析4 MONTHS时失败。

标签: java jodatime


【解决方案1】:

您可以使用 joda time API 的PeriodFormatterBuilder 来构造一个实例,该实例会解析您的格式。还有对plurals的常量处理。

【讨论】:

  • 虽然有一个问题(我本来应该说清楚的,而 javadoc 并不是很清楚)。构造 PeriodFormatter 时,任何“部分”(即“n MONTHS”)都可以是可选的吗?
  • @Jason 我也不确定。您可能会编写一些涵盖这些情况的单元测试。这样,您还可以为您的同事记录此功能。
猜你喜欢
  • 1970-01-01
  • 2013-10-05
  • 1970-01-01
  • 1970-01-01
  • 2015-01-25
  • 1970-01-01
  • 1970-01-01
  • 2013-02-02
  • 1970-01-01
相关资源
最近更新 更多