2017-05-19 36 views
1

我试图解析解析StringData,我创建了DataParser,在根据日期格式,我写的代码是这样的:Java的日期从字符串

String date_s = "04-May-2017 17:28:27"; 
    DateFormat formatter = new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss"); 
    Date date; 
    try { 
     date = formatter.parse(date_s); 
     System.out.println(date); 
    } catch (ParseException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

当我执行此,我总是有个例外

java.text.ParseException: Unparseable date: "04-May-2017 17:28:27" 

我不明白为什么数据没有被解析,有人可以帮我吗?

+2

目前您正在使用您的系统区域设置(和时区)。如果系统区域设置没有“May”作为缩写的月份名称,则会导致问题。构建'SimpleDateFormat'时,您应该指定'Locale.ENGLISH'。 –

回答

2

如果没有现代的解决方案,这个答案的线索将不会完整。这些天来,你应该不再使用DateSimpleDateFormat,但切换到新的日期和时间类:

DateTimeFormatter formatter 
      = DateTimeFormatter.ofPattern("dd-MMM-yyyy HH:mm:ss", Locale.ENGLISH); 
    LocalDateTime dateTime; 
    try { 
     dateTime = LocalDateTime.parse(date_s, formatter); 
     System.out.println(dateTime); 
    } catch (DateTimeParseException e) { 
     System.err.println(e); 
    } 

这将打印

2017-05-04T17:28:27 

LocalDateTime.toString()回报ISO 8601格式),如果离开了Locale.ENGLISH,在我的电脑上我得到

Text '04-May-2017 17:28:27' could not be parsed at index 3 

索引3是它说的地方May,所以邮件i有点帮助。

LocalDateTimeDateTimeFormatter是用Java 8中引入的,但也被移植到Java 6和7

0

要解析字符串是依赖于本地(字是英文),所以JVM不能推断,可能是5月的英语

使用构造函数定义格式的月份与地区相关。

DateFormat formatter = new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss",Locale.ENGLISH); 
0

您需要使用支持MMM一个Locale另一个构造(

DateFormat formatter = new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss",Locale.US) 

或使用带月份数字的标准格式dd-MM-yyyy。 (对不起,同时答案已经发布)