2013-01-03 48 views
2

我有一个字符串,看起来是这样的:“N年N个月ñWEEKS N天”(注意,常数可能会或可能不会使用复数)转换普通语言持续时间乔达期或ISO 8601

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

没有人有任何的代码,也可以点我到库做到这一点?

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

UPDATE2:修正错误在评论中指出。

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; 
+1

您需要解析字符串并提取值,然后从它们创建Joda持续时间应该相当简单。看一看java的一些词法分析器实现,例如http://www.giocc.com/writing-a-lexer-in-java-1-7-using-regex-named-capturing-groups.html。 –

+0

如果没有'YEAR'值,那么格式化程序会在月份值前加一个额外的空格,这会在解析'4 MONTHS'时导致失败。 – SpaceTrucker

回答

5

可以使用约达时间的API PeriodFormatterBuilder构建一个实例,它分析你的格式。还有处理常量的plurals

+0

虽然有一个问题(我原本应该明确的,而javadoc并不是很清楚)。构建PeriodFormatter时,任何“部分”(即“n MONTHS”)是否可选? – Jason

+0

@Jason我也不确定。你也许可以写一些涵盖这些情况的单元测试。这样你也可以为你的同事记录这个功能。 – SpaceTrucker

相关问题