Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to parse month full form string using DateFormat in Java?

I tried this:

DateFormat fmt = new SimpleDateFormat("MMMM dd, yyyy"); Date d = fmt.parse("June 27, 2007"); 

error:

Exception in thread "main" java.text.ParseException: Unparseable date: "June 27, 2007"

The java docs say I should use four characters to match the full form. I'm only able to use MMM successfully with abbreviated months like "Jun" but i need to match full form.

Text: For formatting, if the number of pattern letters is 4 or more, the full form is used; otherwise a short or abbreviated form is used if available. For parsing, both forms are accepted, independent of the number of pattern letters.

https://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html

like image 603
tommy chheng Avatar asked Feb 08 '10 01:02

tommy chheng


People also ask

How parse DD MMM YYYY in Java?

How to parse a date? String input = "Thu Jun 18 20:56:02 EDT 2009"; SimpleDateFormat parser = new SimpleDateFormat("EEE MMM d HH:mm:ss zzz yyyy"); Date date = parser. parse(input); SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); String formattedDate = formatter.


2 Answers

You are probably using a locale where the month names are not "January", "February", etc. but some other words in your local language.

Try specifying the locale you wish to use, for example Locale.US:

DateFormat fmt = new SimpleDateFormat("MMMM dd, yyyy", Locale.US); Date d = fmt.parse("June 27,  2007"); 

Also, you have an extra space in the date string, but actually this has no effect on the result. It works either way.

like image 81
Mark Byers Avatar answered Sep 25 '22 23:09

Mark Byers


Just to top this up to the new Java 8 API:

DateTimeFormatter formatter = new DateTimeFormatterBuilder().appendPattern("MMMM dd, yyyy").toFormatter(); TemporalAccessor ta = formatter.parse("June 27, 2007"); Instant instant = LocalDate.from(ta).atStartOfDay().atZone(ZoneId.systemDefault()).toInstant(); Date d = Date.from(instant); assertThat(d.getYear(), is(107)); assertThat(d.getMonth(), is(5)); 

A bit more verbose but you also see that the methods of Date used are deprecated ;-) Time to move on.

like image 28
gkephorus Avatar answered Sep 26 '22 23:09

gkephorus