【发布时间】: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时失败。