解析奇怪的日期字符串?

时间:2015-06-02 09:51:02

标签: java date simpledateformat

我实际上在研究扫描PDF的项目。在这些PDF上有日期,但它似乎比平时更复杂,因为它是法国日期,格式可能会有所不同(月份为3/4字母),例如:

  

MERMAR17 - LUNJUIL14 ......

而且,我想要以下输出:

  

17/03 - 14/07 ......

我的代码示例:

String date = "MARJUIN2" 
DateFormat dateFormat = new SimpleDateFormat("EEE'MMM'dd", Locale.FRENCH);
        try {
            Date varDate = dateFormat.parse(date);         
            cellString = varDate.toString();
            SimpleDateFormat newDF = new SimpleDateFormat("dd/MM", Locale.FRENCH);
            cellString = newDF.format(varDate);
            }
            catch(Exception e) {
                    e.printStackTrace();
                }

有可能吗?或者n /?

1 个答案:

答案 0 :(得分:2)

好的,这里有一个没有Java-8或任何外部库的解决方案(虽然它会更容易)。该解决方案基于以下假设:您的输入始终以日期名称开头,其长度始终固定为3个字符(“MER”,“LUN”等)。该解决方案通过选择默认年份为2000来考虑2月29日可能的闰日。

你可能会问为什么这么大的努力。那么,原因是您的文本资源与JDK(或CLDR)中的文本资源不同。因此,您必须设置自己的专用文本资源。我在解决方案中使用的月份名称只是猜测工作。您应该根据需要调整这些名称。

static final String[] MONTHS =
    { "JAN", "FEV", "MAR", "AVR", "MAI", "JUIN", "JUIL", "AOÛ", "SEP", "OCT", "NOV", "DEC" };

public static void main(String[] args) throws ParseException {

    String s = "MERMAR17 - LUNJUIL14";
    String[] parts = s.split(" - ");

    SimpleDateFormat parser = new SimpleDateFormat("EEEMMMdd yyyy", Locale.FRENCH);
    System.out.println(parser.format(new GregorianCalendar(2015, 2, 18).getTime()));
    // shows deviation between your input and JDK-resources: mer.mars18 2015

    int m0 = parse(parts[0]);
    int m1 = parse(parts[1]);
    Date d0 =
        new GregorianCalendar(
            2000,
            m0,
            Integer.parseInt(parts[0].substring(3 + MONTHS[m0].length()))
        ).getTime();
    Date d1 =
        new GregorianCalendar(
            2000,
            m1,
            Integer.parseInt(parts[1].substring(3 + MONTHS[m1].length()))
        ).getTime();

    SimpleDateFormat format = new SimpleDateFormat("dd/MM");
    String result = format.format(d0) + " - " + format.format(d1);
    System.out.println(result); // 17/03 - 14/07

}

private static int parse(String input) throws ParseException {
    for (int i = 0; i < 12; i++) {
        if (input.substring(3).startsWith(MONTHS[i])) {
            return i;
        }
    }
    throw new ParseException("Cannot parse month abbreviation in: " + input, 3);
}