I cannot parse strings that contain dates, that include the short version of the month May in Greek (Μαϊ, which is in short for Μαΐου - note on the ϊ-ΐ difference).
For example:
25 Μαϊ 1989
24 Μαΐ 1967
won't parse, if I use the following formats:
"d MMM yyyy"
"dd MMM yyyy"
through the following code:
String dateString = "24 Μαΐ 1967"; // just an example of an input String
SimpleDateFormat format = new SimpleDateFormat(someFormat);
format.parse(dateString);
EDIT: The values I am trying to parse are strings stored in sqlite3 database in Android. In particular it's Contact Birthdays . Although Android dependant, I'll share the code for any insight:
Cursor cur = context.getContentResolver().query(ContactsContract.Data.CONTENT_URI,null,null,null,null);
while(cur.moveToNext()){
String birthdayString = cur.getString(INDEX_OF_BIRTHDAY);
}
This works on my machine (Java 8):
String dateString = "24 Μαϊ 1967"; // just an example of an input String
SimpleDateFormat format = new SimpleDateFormat("dd MMM yyyy", new Locale("el", "GR"));
format.parse(dateString);
You can print out the available short months like this:
Locale locale = new Locale("el", "GR");
DateFormatSymbols dfs = DateFormatSymbols.getInstance(locale);
for (String m : dfs.getShortMonths()) {
System.out.println(m);
}
The other answers are correct, such as the Answer by Franz Becker. But they use the old java.util.Date & java.text.SimpleDateFormat classes.
Here is similar code but using the new java.time and java.time.format packages in Java 8 and later.
The Question provided two example input strings. Notice the different diacritical signs. The first one works, but the second one fails. I have no explanation, as I don’t know that language… "It's all Greek to me". ;-)
String input1 = "25 Μαϊ 1989";
String input2 = "24 Μαΐ 1967"; // Different diacritical over the "i".
Fetch a Locale
instance using the static method Locale.forLanguageTag
, new in Java 7. Specify an ISO 639 language code (via IETF BCP 47) for Modern Greek language.
Locale locale = Locale.forLanguageTag("el");
Specify the exact pattern we expect.
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "dd MMM yyyy" ).withLocale( locale );
Parse using the recommended parse
method that takes a method reference (Tutorial), LocalDate :: from
, in the new Java 8 Lambda syntax.
LocalDate localDate1 = formatter.parse( input1, LocalDate :: from );
LocalDate localDate2 = formatter.parse( input2, LocalDate :: from ); // Fails… Exception in thread "main" java.time.format.DateTimeParseException: Text '24 Μαΐ 1967' could not be parsed at index 3.
Dump to console.
System.out.println( "localDate1 = " + localDate1 );
When run.
localDate1 = 1989-05-25
Going the other way, to generate a String representation of a LocalDate, let java.time do the work of determining a localized format. Using automated localization may be easier and more flexible that hard-coding a specific format.
DateTimeFormatter formatterOutput = DateTimeFormatter.ofLocalizedDate( FormatStyle.MEDIUM ).withLocale( locale );
String output = formatterOutput.format( localDate1 );
System.out.println( "output = " + output ); // output = 25 Μαϊ 1989
That second input string with a different diacritical seems to be an inappropriate abbreviation of the full month name Μαΐου
. Using that full month name with another formatter (four M
pattern characters) does successfully parse. Again, I do not know Modern Greek, so this explanation is just a guess on the part of me and the people commenting on this Answer.
This example code demonstrates the successful parsing of input3
.
String input1 = "25 Μαϊ 1989";
String input2 = "24 Μαΐ 1967"; // Different diacritical over the "i". Incorrect abbreviation of full month name?
String input3 = "23 Μαΐου 1978"; // Full month name with different diacritical.
Locale locale = Locale.forLanguageTag( "el" );
DateTimeFormatter formatterShort = DateTimeFormatter.ofPattern( "dd MMM yyyy" ).withLocale( locale );
DateTimeFormatter formatterFull = DateTimeFormatter.ofPattern( "dd MMMM yyyy" ).withLocale( locale );
LocalDate localDate1 = formatterShort.parse( input1, LocalDate :: from );
// LocalDate localDate2 = formatter.parse( input2, LocalDate :: from ); // Fails… Exception in thread "main" java.time.format.DateTimeParseException: Text '24 Μαΐ 1967' could not be parsed at index 3.
LocalDate localDate3 = formatterFull.parse( input3, LocalDate :: from );
System.out.println( "localDate1 = " + localDate1 );
System.out.println( "localDate3 = " + localDate3 );
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With