2013-07-11 24 views
1

这是我使用正则表达式提取信息的字符串:的Java字符串到日期不可分析日期

2823893a2f91c7507831f140dd7aa75e420477b0 - #0023922: Fixed the message for defaulted bonds ; Thu Oct 25 12:08:25 2012 +0000

这是我用来提取字符串,然后将代码试图使它成为一个日期:

Pattern pattern3 = Pattern.compile(";\\s(.*)"); 
Matcher matcher3 = pattern3.matcher(s); 
matcher3.find(); 
String t = matcher3.group(1).toString(); 
     try { 
     Date time = new SimpleDateFormat("dd/MMM/yy hh:mm a").parse(t); 
     } catch (ParseException e) { 
       e.printStackTrace(); 
     } 

这应该是我的输入格式:

Thu Oct 25 12:08:25 2012 +0000 

而且我要的是使从一个日期上述字符串,它看起来像:

25/Oct/12 12:08 PM 

但我不断收到这些错误:

java.text.ParseException: Unparseable date: "Thu Oct 25 12:08:25 2012 +0000" 
Fixed the message for defaulted bonds0null 
    at java.text.DateFormat.parse(DateFormat.java:337) 
    at GitItem.cultivateGitItem(GitItem.java:42) 
    at main.main(main.java:9) 
java.text.ParseException: Unparseable date: "Thu Oct 25 11:52:39 2012 +0000" 
    at java.text.DateFormat.parse(DateFormat.java:337) 
    at GitItem.cultivateGitItem(GitItem.java:42) 
    at main.main(main.java:9) 
+0

这看起来像VCS的输出......如果'git',为什么不使用jgit? (编辑:应阅读更多;它是混帐) – fge

回答

1

我想简单地删除不需要的部分:

String dateAsString = s.replaceAll(".*;\\s+",""); 

然后,你需要的DateFormat:一个解析字符串,另一个输出正确的格式:

String s = "2823893a2f91c7507831f140dd7aa75e420477b0 - #0023922: Fixed the message for defaulted bonds ; Thu Oct 25 12:08:25 2012 +0000"; 
System.out.println("s = " + s); 
String dateAsString = s.replaceAll(".*;\\s+",""); 
System.out.println("dateAsString = " + dateAsString); 
DateFormat parser = new SimpleDateFormat("EEE MMM dd HH:mm:ss yyyy X", Locale.ENGLISH); 
Date date = parser.parse(dateAsString); 
System.out.println("date = " + date); 
DateFormat formatter = new SimpleDateFormat("dd/MMM/yyyy hh:mm a", Locale.ENGLISH); 
formatter.setTimeZone(TimeZone.getTimeZone("UTC")); 
System.out.println(formatter.format(date)); 

输出:

s = 2823893a2f91c7507831f140dd7aa75e420477b0 - #0023922: Fixed the message for defaulted bonds ; Thu Oct 25 12:08:25 2012 +0000 
dateAsString = Thu Oct 25 12:08:25 2012 +0000 
date = Thu Oct 25 14:08:25 CEST 2012 
25/Oct/2012 12:08 PM 

注意:您需要使用适当的语言环境来解析和打印月份/日期名称

+0

它给了我一个错误在这一行: 'DateFormat分析器=新SimpleDateFormat(“EEE MMM dd HH:mm:ss yyyy X”,Locale.getDefault()); ' 这是错误:在线程 “主” java.lang.IllegalArgumentException异常 '例外:非法图案字符 'X' \t在java.text.SimpleDateFormat.compile(SimpleDateFormat.java:768) \t在java的.text.SimpleDateFormat.initialize(SimpleDateFormat.java:575) \t at java.text.SimpleDateFormat。 (SimpleDateFormat.java:500) \t在GitItem.cultivateGitItem(GitItem.java:44) \t在main.main(main.java:9)' 很抱歉的坏格式。 – Schadenfreude

+0

@Schadenfreude'X'在Java 7+中可用。如果您使用较早的版本,则会得到该异常。 – assylias

+0

然而,它应该用'Z'而不是'X'来工作:''EEE MMM dd HH:mm:ss yyyy Z“'。 – assylias

2

你的模式必须匹配传入的数据,它没有现在的格局。

SimpleDataFormat无法读取您的想法,您输入的模式与您输入的格式不符.parse()

"dd/MMM/yy hh:mm a"永远不会匹配Thu Oct 25 12:08:25 2012 +0000,您必须指定传入数据的确切模式,这在JavaDocs中有很好的记录。

然后,您可以将模式更改为想要使用的模式.applyPattern()可以调用.format()以获得所需的格式化输出。