我实际上在研究扫描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 /?
答案 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);
}