Java解析季度日期的最佳方法

时间:2014-05-08 11:39:18

标签: java date

我的日期为APR-JUN10APR-JUN 2010,我需要输出为2010-06-30我需要在java中解析上述日期的最佳方式,并且应该灵活添加更多这样的日期格式。注意:APR-JUN10不会被任何java api解析,我们必须打破APR& JUN 10并将日期设为2010-06-30

2 个答案:

答案 0 :(得分:3)

你需要确定你的要求。

目前,您告诉我们的是APR-JUN 2010应该转换为6月的最后一天。

但是FEB-JUN 2010呢?这还应该转化为六月的最后一天吗?或者它应该因为不是一个完整的季度而抛出一个解析异常? JUL-JUN 2010怎么样,第二个月在第一个月之前?怎么样MAY-JUL 2010 - 三个月,但也许你的定义是"季度"需要1月,4月,7月,10月的开始。

一旦您有自己的要求,您就可以开始转换。

现有的DateFormat实施不太可能为您完成这项任务。您可能需要在自己的代码中解析字符串。

如果唯一的合法选项是JAN-MARAPR-JUNJUL-SEPOCT-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)等来验证它。

更新:我现在添加了验证功能,请参阅代码。