I want to display a date of birth based on the user locale. In my application, one of my fields is the date of birth, which is currently in the format dd/mm/yyyy
. So if the user changes his locale, the date format should also change accordingly. Any pointers or code samples would really help me to overcome the problem.
You can use the DateFormat class that formats a date according to the user locale.
Example:
String dateOfBirth = "26/02/1974"; SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); Date date = null; try { date = sdf.parse(dateOfBirth); } catch (ParseException e) { // handle exception here ! } java.text.DateFormat dateFormat = android.text.format.DateFormat.getDateFormat(context); String s = dateFormat.format(date);
You can use the different methods getLongDateFormat
, getMediumDateFormat
depending on the level of verbosity you would like to have.
While the accepted answer was correct when the question was asked, it has later become outdated. I am contributing the modern answer.
DateTimeFormatter dateFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT); LocalDate dateOfBirth = LocalDate.of(1991, Month.OCTOBER, 13); String formattedDob = dateOfBirth.format(dateFormatter); System.out.println("Born: " + formattedDob);
It gives different output depending on the locale setting of the JVM (usually taking from the device). For example:
Born: 91-10-13
Born: 1991/10/13
Born: 13.10.91
Born: 13/10/91
If you want a longer format, you may specify a different format style. Example outputs in US English locale:
FormatStyle.SHORT
: Born: 10/13/91
FormatStyle.MEDIUM
: Born: Oct 13, 1991
FormatStyle.LONG
: Born: October 13, 1991
FormatStyle.FULL
: Born: Thursday, October 13, 1991
DateTimeFormatter.ofLocalizedDate requires Api O minimum.
Yes, java.time works nicely on older and newer Android devices. No, it does not require API level 26 or Oreo even though a message in your Android Studio might have you think that. It just requires at least Java 6.
org.threeten.bp
with subpackages.Yes, you can. The formatter can also be used for parsing a string from the user into a LocalDate
:
LocalDate date = LocalDate.parse(userInputString, dateFormatter);
I suggest that you first format an example date and show it to the user so that s/he can see which format your program expects for his/her locale. As example date take a date with day of month greater than 12 and year greater than 31 so that the order of day, month and year can be seen from the example (for longer formats the year doesn’t matter since it will be four digits).
Parsing will throw a DateTimeParseException
if the user entered the date in an incorrect format or a non-valid date. Catch it and allow the user to try again.
Yes. For formatting a time of day according to a user’s locale, get a formatter from DateTimeFormatter.ofLocalizedTime
. For both date and time together use one of the overloaded versions of DateTimeFormatter.ofLocalizedDateTime
.
I recommend you don’t use DateFormat
, SimpleDateFormat
and Date
. Those classes are poorly designed and long outdated, the first two in particular notoriously troublesome. Instead use LocalDate
, DateTimeFormatter
and other classes from java.time, the modern Java date and time API.
java.time
was first described.java.time
to Java 6 and 7 (ThreeTen for JSR-310).As simple as
For date + time:
DateFormat format = DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.SHORT, Locale.getDefault());
For just date:
DateFormat format = DateFormat.getDateInstance(DateFormat.SHORT, Locale.getDefault());
To change the date format according to the locale, the following code worked to me:
String dateOfBirth = "26/02/1974";
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Date date = null;
try {
date = sdf.parse(dateOfBirth);
} catch (ParseException e) {
// handle exception here !
}
String myString = DateFormat.getDateInstance(DateFormat.SHORT).format(date);
Then when you change the locale, the date format will change based on it. For more information about the dates patterns: http://docs.oracle.com/javase/tutorial/i18n/format/dateFormat.html
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