无法使用AM / PM标记分析DateTime-string

我想格式化的string看起来像这样:String datetime =“9/1/10 11:34:35 AM”

SimpleDateFormat的以下模式工作:

SimpleDateFormat sdf = SimpleDateFormat("M/d/yy h:mm:ss"); Date d = sdf.parse(datetime); System.out.println(d); Output> [Wed Sep 01 11:34:35 CEST 2010] 

不过,我需要parsingAM / PM标记,当我添加到该模式,我收到一个exception。

模式不起作用:

 SimpleDateFormat sdf = SimpleDateFormat("M/d/yy h:mm:ss a"); 

我也尝试过这个例外:

 SimpleDateFormat sdf = SimpleDateFormat("M/d/yy h:mm:ss aa"); 

例外:

 java.text.ParseException: Unparseable date: "9/1/10 11:34:35 AM" 

我查看了http://download.oracle.com/javase/1.4.2/docs/api/java/text/SimpleDateFormat.html#text的API,但似乎无法find我做错的地方。

有什么build议么?

一种可能是您的默认Locale对于AM / PM具有不同的符号。 在构builddate格式时,除非确实要使用系统的默认Locale ,否则应始终提供Locale Locale ,例如:

 SimpleDateFormat sdf = new SimpleDateFormat("M/d/yy h:mm:ss a", Locale.US) 

我以下面的date为例,如果符合您的要求,则将格式化的date打印成24小时格式。

  String inputdate="9/1/10 11:34:35 AM"; SimpleDateFormat simpleDateFormat=new SimpleDateFormat("dd/MM/yy hh:mm:ss aa",Locale.getDefault()); try { System.out.println(""+new SimpleDateFormat("dd/MM/yy HH:mm:ss",Locale.getDefault()).format(simpleDateFormat.parse(inputdate))); } catch (ParseException e) { e.printStackTrace(); } 

如果您还有任何疑问,请回复。 谢谢。

如果您正在使用FreeMarker for Java并在此问题上使用以下代码。 我有这个问题,我的区域设置AM / PM为DE。 不知道为什么… <#setting locale="en_US">

现代答案:

  String datetime = "9/1/10 11:34:35 AM"; LocalDateTime dt = LocalDateTime.parse(datetime, DateTimeFormatter.ofPattern("M/d/yy h:mm:ss a", Locale.ENGLISH)); 

这会产生一个2010-09-01T11:34:35的LocalDateTime 。 小心两位数年,但; DateTimeFormatter将假设2000年到2099年。对于我的生日,这将是不正确的。

我们仍然需要提供语言环境。 由于AM / PM标记在英语以外的其他语言环境中很less使用,所以我认为Locale.ENGLISH是一个相当安全的select。 请replace你自己的。

其他答案在2010年和2011年是好的答案。2014年已经是上述的有效,我会更喜欢它。