我的日期为APR-JUN10
或APR-JUN 2010
,我需要输出为2010-06-30
我需要在java
中解析上述日期的最佳方式,并且应该灵活添加更多这样的日期格式。注意:APR-JUN10
不会被任何java api解析,我们必须打破APR& JUN 10并将日期设为2010-06-30
。
答案 0 :(得分:3)
你需要确定你的要求。
目前,您告诉我们的是APR-JUN 2010
应该转换为6月的最后一天。
但是FEB-JUN 2010
呢?这还应该转化为六月的最后一天吗?或者它应该因为不是一个完整的季度而抛出一个解析异常? JUL-JUN 2010
怎么样,第二个月在第一个月之前?怎么样MAY-JUL 2010
- 三个月,但也许你的定义是"季度"需要1月,4月,7月,10月的开始。
一旦您有自己的要求,您就可以开始转换。
现有的DateFormat
实施不太可能为您完成这项任务。您可能需要在自己的代码中解析字符串。
如果唯一的合法选项是JAN-MAR
,APR-JUN
,JUL-SEP
,OCT-DEC
,那么您只需要一个五向切换语句来设置月份和日期一个Calendar
对象(第五种方式是抛出异常的default:
个案例。
如果您的要求更复杂,那么您的代码将需要更复杂。使用正则表达式将字符串分成几部分将是一个很好的第一步。
Pattern patt = Pattern.compile("(.{3})-(.{3}) (\d+)");
Matcher matcher = patt.matcher(qaurterString);
if(! matcher.find() || m.groupCount() != 3) {
throw new ParseException(...)
}
String fromMonth = matcher.group(1);
String toMonth = matcher.group(2);
int year = Integer.parseInt(matcher.group(3));
我认为无论你做什么,你都必须从头开始编写解析代码。最新的最终结果是您创建一个实现DateFormat
的类。
答案 1 :(得分:2)
String s = "APR-JUN10";
// validation of quarter part
String quarter = s.substring(0, 7);
if (
!quarter.equals("JAN-MAR") && !quarter.equals("APR-JUN")
&& !quarter.equals("JUL-SEP") && !quarter.equals("OCT-DEC")
) {
throw new IllegalArgumentException("Input is not a quarter date: " + s);
}
// text processing with preprocessing hack (substring(4))
SimpleDateFormat inputFormat = new SimpleDateFormat("MMMyy", Locale.ENGLISH);
inputFormat.setLenient(false);
Date date = inputFormat.parse(s.substring(4));
System.out.println(date);
// Output: Tue Jun 01 00:00:00 CEST 2010 [format chooses 1 as default day-of-month]
// Go to end of month/quarter
GregorianCalendar gcal = new GregorianCalendar();
gcal.clear();
gcal.setTime(date);
gcal.set(Calendar.DAY_OF_MONTH, gcal.getActualMaximum(Calendar.DAY_OF_MONTH));
// format as ISO-date
SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd");
String output = outputFormat.format(gcal.getTime());
System.out.println(output); // 2010-06-30
输入" APR-JUN 2010"你需要输入格式模式" MMM yyyy",否则解决方案是相同的。当然,建议的解决方案假设每个输入都以JAN-MAR,APR-JUN,JUL-SEP或OCT-DEC开始(你写了大约四分之一)。如果您愿意,可以在处理阶段之前通过s.substring(0,7)等来验证它。
更新:我现在添加了验证功能,请参阅代码。