Java 将普通语言持续时间转换为Joda句点或ISO 8601

Java 将普通语言持续时间转换为Joda句点或ISO 8601,java,jodatime,Java,Jodatime,我有一个类似这样的字符串:“n年n月n周n天”(请注意,常数可能是复数,也可能不是复数) 我需要将其转换为Joda Period对象或ISO 8601格式的字符串(反过来可以转换为Period对象) 有没有人有任何代码,或者他们能给我指出一个库来做这件事 更新:如果有人需要这样做,下面是工作代码。不幸的是,我不得不动态构建PeriodFormatterBuilder,因为字段是可选的。有点难看,但它能用 更新2:修复了评论中指出的错误 String text = expr1a.getText()

我有一个类似这样的字符串:“n年n月n周n天”(请注意,常数可能是复数,也可能不是复数)

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

有没有人有任何代码,或者他们能给我指出一个库来做这件事

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

更新2:修复了评论中指出的错误

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 time API的函数来构造一个实例,该实例解析您的格式。还有对常量的处理。

您需要解析字符串并提取值,然后从中创建Joda duration应该相当简单。例如,看看java的一些lexer实现。如果没有
YEAR
值,那么格式化程序将有一个额外的空间作为月份值的前缀,这将导致解析
4个月
时失败。不过有一个问题(我本来应该说清楚的,但是javadoc不是很清楚。)你能说出任何一个“部分”(即“n个月”)吗在构造PeriodFormatter时是否可以选择?@Jason我也不确定。您可能可以编写一些单元测试来涵盖这些情况。这样,您也可以为您的同事记录此功能。