从字符串中提取日期

我有一个文件名列表大致如下:Gadget1-010912000000-020912235959.csv,即它们包含两个日期,表示其数据的时间跨度。

用户输入日期格式和文件格式:

  • 在这种情况下的文件格式:* GADGET * – * DATE_FROM * – * DATE_TO * .csv
  • 在这种情况下的日期格式:ddMMyyHHmmss

我想要做的是使用给定的文件和日期格式从文件名中提取三个值。

我的问题是:由于日期格式可能差别很大(小时,分钟和秒可以用冒号分隔,日期用点,…)我不太清楚如何创建一个合适的正则表达式。

您可以使用正则表达式删除非数字字符,然后解析值。

DateFormat dateFormat = new SimpleDateFormat("ddMMyyHHmmss"); String[] fileNameDetails = ("Gadget1-010912000000-020912235959").split("-"); /*Catch All non digit characters and removes it. If non exists maintains original string*/ String date = fileNameDetails[1].replaceAll("[^0-9]", ""); try{ dateFormat.parse(fileNameDetails[1]); }catch (ParseException e) { } 

希望能帮助到你。

SimpleDateFormat解决了您的问题。 您可以使用逗号,空格等来定义格式,只需根据格式进行解析:

http://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html

因此,您将格式(例如ddMMyyHHmmss)映射到相应的SimpleDateFormat。

 SimpleDateFormat format = new SimpleDateFormat("ddMMyyHHmmss"); Date x = format.parse("010912000000"); 

如果格式更改,您只需更改SimpleDateFormat

您可以使用一系列日期时间格式,尝试每种格式直到一个工作。

您可能需要订购格式以确定匹配的优先级。

例如,使用Joda时间,您可以对一系列模式中的每一个使用DateTimeFormat.forPattern()和DateTimeFormatter.getParser() 。 尝试DateTimeParser.parseInto()直到成功。

这种方法的一个好处是可以轻松添加和删除模式。

使用PatternMatcher类。

看看这个例子:

 String inputDate = "01.09.12.00:00:00"; Pattern pattern = Pattern.compile( "([0-9]{2})[\\.]{0,1}([0-9]{2})[\\.]{0,1}([0-9]{2})[\\.]{0,1}([0-9]{2})[:]{0,1}([0-9]{2})[:]{0,1}([0-9]{2})"); Matcher matcher = pattern.matcher(inputDate); matcher.find(); StringBuilder cleanStr = new StringBuilder(); for(int i = 1; i <= matcher.groupCount(); i++) { cleanStr.append(matcher.group(i)); } SimpleDateFormat format = new SimpleDateFormat("ddMMyyHHmmss"); Date x = format.parse(cleanStr.toString()); System.out.println(x.toString()); 

最重要的部分是线

 Pattern pattern = Pattern.compile( "([0-9]{2})[\\.]{0,1}([0-9]{2})[\\.]{0,1}([0-9]{2})[\\.]{0,1}([0-9]{2})[:]{0,1}([0-9]{2})[:]{0,1}([0-9] 

在这里,您可以在paranthesis中定义正则表达式和标记组,以便([0-9]{2})标记一个组。 然后表达可能的分界符[\\.]*在这种情况下为0或1点,但是你可以放置更多可能的分界符,例如[\\.|\]{0,1}

然后运行matcher.find() ,如果模式匹配则返回true。 然后使用matcher.group(int)您可以逐组获取。 请注意,第一组的索引是1。

然后我使用StringBuilder构造干净的日期String 。 然后解析日期。

干杯,米哈尔