Java Date解析“am”和“pm”

使用SimpleDateFormat,如何解析字符串: “2013-05-23T09:18:07 pm.380 + 0000”

我的所有SimpleDateFormat字符串都在“pm”部分绊倒。

提前致谢。

编辑:我们无法控制进入的格式。

我试过了:

"yyyy-MM-dd'T'HH:mm:ss aa.SSSZ" "yyyy-MM-dd'T'HH:mm:ss aaaa.SSSZ" "yyyy-MM-dd'T'HH:mm:ss a.'m'..SSSZ" "yyyy-MM-dd'T'HH:mm:ss a.'m.'.SSSZ" "yyyy-MM-dd'T'HH:mm:ss a.'m..'SSSZ" "yyyy-MM-dd'T'HH:mm:ss aa'm'..SSSZ" "yyyy-MM-dd'T'HH:mm:ss aa'm.'.SSSZ" "yyyy-MM-dd'T'HH:mm:ss aaa'..'SSSZ" "yyyy-MM-dd'T'HH:mm:ss aaa.'.'SSSZ" "yyyy-MM-dd'T'HH:mm:ss aaa'.'.SSSZ" 

目前尚不清楚“380 + 0000”部分是什么意思,但您可以通过为SimpleDateFormat设置DateFormatSymbols来修复AM / PM部分。 这是一个例子:

 import java.util.*; import java.text.*; public class Test { public static void main(String[] args) throws Exception { String text = "2013-05-23T09:18:07 pm.380+0000"; String pattern = "yyyy-MM-dd'T'hh:mm:ss aa'.380+0000'"; SimpleDateFormat format = new SimpleDateFormat(pattern, Locale.US); format.setTimeZone(TimeZone.getTimeZone("UTC")); DateFormatSymbols symbols = format.getDateFormatSymbols(); symbols = (DateFormatSymbols) symbols.clone(); symbols.setAmPmStrings(new String[] { "am", "pm"}); format.setDateFormatSymbols(symbols); Date date = format.parse(text); System.out.println(date); } } 

我不知道你是否必须在变异之前克隆DateFormatSymbols – 它不清楚,说实话…… 文档指出了两种方式:

DateFormatSymbols对象是可复制的。 获取DateFormatSymbols对象时,可以随意修改日期时格式化数据。 例如,您可以将本地化的日期时间格式模式字符替换为您容易记住的字符。 或者您可以将代表性城市更改为您喜欢的城市。

鉴于它提到了克隆,这表明你应该克隆 – 但随后的段落建议不要:(

这是使用Java 8的新java.time包的实现,因此您可以抛弃java.util.Datejava.text.SimpleDateFormat

 import java.time.OffsetDateTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatterBuilder; import java.time.temporal.ChronoField; import java.util.HashMap; import java.util.Map; public class Test { public static void main(String[] args) { String text = "2013-05-23T09:18:07 pm.380+0000"; Map map = new HashMap<>(); map.put(0L, "am"); map.put(1L, "pm"); DateTimeFormatter formatter = new DateTimeFormatterBuilder() .appendPattern("yyyy-MM-dd'T'hh:mm:ss ") .appendText(ChronoField.AMPM_OF_DAY, map) .appendPattern(".SSSZ").toFormatter(); OffsetDateTime dateTime = OffsetDateTime.parse(text, formatter); System.out.println(dateTime); } } 

运行它产生:

 2013-05-23T21:18:07.380Z 

像这样做

 String time="2013-05-23T09:18:07 pm.380+0000"; int index1=time.indexOf(""); int index2 = time.indexOf(".."); // or you can give pm as argument if you want it to stop before pm String result = time.substring(index1,index2); System.out.print(result); 

这具有以下结果

 2013-05-23T09:18:07 pm 

我希望这有帮助

只需通过字符串操作删除pm部分。 这是多余的。

比使用简单的SimpleDateFormat进行解析。

这些方面的东西:

 String whatever = "2013-05-23T09:18:07 pm.380+0000"; whatever = whatever.replaceAll(" pm.", ":").replaceAll(" am.", ":"); System.out.println(whatever); S String pattern = "yyyy-MM-dd'T'hh:mm:ss:SSS'Z'"; SimpleDateFormat format = new SimpleDateFormat(pattern, Locale.US); Date date; try { date = format.parse(whatever); System.out.println(date); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } 

更新

正如IAN指出的那样,我错过了时间不是24小时格式。 然而,我确实得到了毫秒部分的正确性,并将时区部分添加到Jon Skeet的答案中:

 String text = "2013-05-23T09:18:07 pm.380+0000"; String pattern = "yyyy-MM-dd'T'hh:mm:ss aa'.'SSSZ"; SimpleDateFormat format = new SimpleDateFormat(pattern); DateFormatSymbols symbols = format.getDateFormatSymbols(); symbols = (DateFormatSymbols) symbols.clone(); symbols.setAmPmStrings(new String[] { "am", "pm"}); format.setDateFormatSymbols(symbols); Date date = format.parse(text); System.out.println(date);