2015-02-11 44 views
0

请考虑此格式化当前日期的程序,并尝试再次解析它。它用法语成功,但英语失败,我不明白为什么。日期解析成功使用法语但英语失败

import java.util.Locale; 
import java.text.DateFormat; 
import java.time.Instant; 
import java.util.Date; 
import java.text.SimpleDateFormat; 

public class HelloWorld{ 

    public static void main(String []args){ 

     try{ 
      SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy HH:mm:ss", Locale.ENGLISH); 
      DateFormat.getDateTimeInstance(DateFormat.DEFAULT,DateFormat.DEFAULT, Locale.ENGLISH).parse(formatter.format(new Date())); 

      System.out.println("English - success"); 
     }catch(Exception ex){ 
      System.out.println(ex); 
     } 

     try{ 
      SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy HH:mm:ss", Locale.FRENCH); 

      DateFormat.getDateTimeInstance(DateFormat.DEFAULT,DateFormat.DEFAULT, Locale.FRENCH).parse(formatter.format(new Date())); 
      System.out.println("French - success"); 

     }catch(Exception ex){ 
      System.out.println(ex); 
     } 
     System.out.println(Locale.getDefault()); 
    } 
} 

输出:

java.text.ParseException: Unparseable date: "11 Feb 2015 11:09:26"                               
French -success                                            
en_US 

请看http://docs.oracle.com/javase/7/docs/api/java/text/DateFormat.html#parse%28java.lang.String,%20java.text.ParsePosition%29告诉我,我应该使用模式或其他任何东西了。这种方法是为了解析没有模式的String

+0

如果您尝试先用'DateFormat.getDateTimeInstance(DateFormat.DEFAULT,DateFormat.DEFAULT,Locale.ENGLISH).format'格式化'Date',它是否具有相同样式,您尝试解析?也许你会以这种方式找到你的错误。 – Zhedar 2015-02-11 11:25:03

+0

你对这个例外感到惊讶吗?您正在格式化,然后使用不同的格式进行解析。你很幸运,法国默认格式符合该模式。 – xehpuk 2015-02-11 11:38:44

回答

3

我怀疑你的输入格式字符串是错误的。

根据documentationJun 30, 2009 7:03:47 AM对于Default设置中的en_US将是有效的格式。

您可以通过首先格式化给定的Date来始终检查格式是否正确。
例如 System.out.println(DateFormat.getDateTimeInstance(DateFormat.DEFAULT,DateFormat.DEFAULT, Locale.ENGLISH).format(new Date()));给出Feb 11, 2015 12:34:48 PM,其不适合11 Feb 2015 11:09:26

这应该是你正确的格式化字符串en_US解析:Feb 11, 2015 11:09:26 AM。请记住,这是上午/下午12小时的时间格式,这可能很烦人。

+0

输入格式可以是任何东西。这就是这种方法的目的。 但是我试着用“MMM,dd yyyy HH:mm:ss a”就像你所建议的那样,它也不起作用。 – Maxoudela 2015-02-11 11:36:05

+0

您只需要一个H来指定12小时格式。然后它会工作。但奇怪的是,这种方法不能用英文解析“dd MMM yyyy”,而是用法语来解析。 – mhlz 2015-02-11 11:37:42

+1

没有启发式来检测输入格式,所以它不能是任何东西。如果是这样的话,日期解析不会太痛苦;)你只需使用默认参数,这些参数在某处定义以反映标准。 – Zhedar 2015-02-11 11:40:26

0

英语的默认格式是这样的:

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

它在法国成功。所以这可能不是问题。 – Zhedar 2015-02-11 11:26:42

+0

对不起,我看到了。修改了答案。 – vikingsteve 2015-02-11 11:32:39

0

你确定DD MMM YYYY HH:mm:ss的是一个正确的英文格式不他们使用一个月像美国格式天前?

+0

我试图使用“MMM dd yyyy HH:mm:ss”,但它不起作用。但我认为这不是问题。 – Maxoudela 2015-02-11 11:33:54