261

I have a LocalDate variable called date, when I print it displays 1988-05-05 I need to convert this to be printed as 05.May 1988. How to do this?

AlexElin
  • 1,044
  • 14
  • 23
Jasko
  • 2,815
  • 2
  • 12
  • 9
  • 3
    Take a look at the [DateTimeFormatter](http://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html) class. It even has examples of how to convert to and from `String`s. – azurefrog Jan 27 '15 at 18:24
  • 2
    You should show some code, what you have tried so far and what's not working so people can help you. – El Bert Jan 27 '15 at 18:24
  • I tried to do that but because of this annoying "it does not meet our quality standards" thing I finally gave up,it took me 15 minutes just to post this because i had to correct "i" with "I". – Jasko Jan 27 '15 at 18:29

7 Answers7

454

SimpleDateFormat will not work if he is starting with LocalDate which is new in Java 8. From what I can see, you will have to use DateTimeFormatter, http://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html.

LocalDate localDate = LocalDate.now();//For reference
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd LLLL yyyy");
String formattedString = localDate.format(formatter);

That should print 05 May 1988. To get the period after the day and before the month, you might have to use "dd'.LLLL yyyy"

ProgrammersBlock
  • 5,974
  • 4
  • 17
  • 21
101

Could be short as:

LocalDate.now().format(DateTimeFormatter.ofPattern("dd/MM/yyyy"));
Zon
  • 18,610
  • 7
  • 91
  • 99
14

java.time

Unfortunately, all existing answers have missed a crucial thing, Locale.

A date-time parsing/formatting type (e.g. DateTimeFormatter of the modern API or SimpleDateFormat of the legacy API) is Locale-sensitive. The symbols used in its pattern print the text based on the Locale used with them. In absence of a Locale, it uses the default Locale of the JVM. Check this answer to learn more about it.

The text in the expected output, 05.May 1988 is in English and thus, the existing solutions will produce the expected result only as a result of mere coincidence (when the default Locale of the JVM an English Locale).

Solution using java.time, the modern date-time API*:

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        LocalDate date = LocalDate.of(1988, 5, 5);
        final DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd.MMMM uuuu", Locale.ENGLISH);
        String output = dtf.format(date);
        System.out.println(output);
    }
}

Output:

05.May 1988

Here, you can use yyyy instead of uuuu but I prefer u to y.

Learn more about the modern date-time API from Trail: Date Time.


* For any reason, if you have to stick to Java 6 or Java 7, you can use ThreeTen-Backport which backports most of the java.time functionality to Java 6 & 7. If you are working for an Android project and your Android API level is still not compliant with Java-8, check Java 8+ APIs available through desugaring and How to use ThreeTenABP in Android Project.

Arvind Kumar Avinash
  • 71,965
  • 6
  • 74
  • 110
8
System.out.println(LocalDate.now().format(DateTimeFormatter.ofPattern("dd.MMMM yyyy")));

The above answer shows it for today

Evgenij Reznik
  • 17,916
  • 39
  • 104
  • 181
karthik r
  • 989
  • 13
  • 11
0

With the help of ProgrammersBlock posts I came up with this. My needs were slightly different. I needed to take a string and return it as a LocalDate object. I was handed code that was using the older Calendar and SimpleDateFormat. I wanted to make it a little more current. This is what I came up with.

    import java.time.LocalDate;
    import java.time.format.DateTimeFormatter;


    void ExampleFormatDate() {

    LocalDate formattedDate = null;  //Declare LocalDate variable to receive the formatted date.
    DateTimeFormatter dateTimeFormatter;  //Declare date formatter
    String rawDate = "2000-01-01";  //Test string that holds a date to format and parse.

    dateTimeFormatter = DateTimeFormatter.ISO_LOCAL_DATE;

    //formattedDate.parse(String string) wraps the String.format(String string, DateTimeFormatter format) method.
    //First, the rawDate string is formatted according to DateTimeFormatter.  Second, that formatted string is parsed into
    //the LocalDate formattedDate object.
    formattedDate = formattedDate.parse(String.format(rawDate, dateTimeFormatter));

}

Hopefully this will help someone, if anyone sees a better way of doing this task please add your input.

pete
  • 79
  • 1
  • 4
  • I see a better way: just `LocalDate.parse(rawDate)` ! `String.format` is being used in a total wrong form here, actually just returning the first string; the `DateTimeFormatter` is not being used at all; `parse` is a `static` method of `LocalDate`; `formattedDate` is **not** a formatted date, not even a `String` (as requested in question) – user85421 Dec 21 '19 at 00:55
-6

There is a built-in way to format LocalDate in Joda library

import org.joda.time.LocalDate;

LocalDate localDate = LocalDate.now();
String dateFormat = "MM/dd/yyyy";
localDate.toString(dateFormat);

In case you don't have it already - add this to the build.gradle:

implementation 'joda-time:joda-time:2.9.5'

Happy coding! :)

Inoy
  • 1,065
  • 1
  • 17
  • 24
  • 1
    Not according to the javadoc. – Edward Sep 19 '19 at 04:58
  • @Edward, if it's not, please prove it and provide a solution you think is better. – Inoy Dec 19 '19 at 16:49
  • 1
    you want me to prove that LocalDate.toString(String pattern) does NOT exist? Please provide a reference to that method if it does exist - I haven't been able to find it in any javadocs. As for a solution, this question already has that. – Edward Dec 20 '19 at 22:25
  • @Edward, Looks like you are having a hard time finding it. Updated my answer. – Inoy Dec 21 '19 at 00:21
  • 1
    Joda Time is not "built-in". OP seems to be using java.time.LocalDate, not joda.time – Edward Dec 21 '19 at 05:54
  • We are using `org.joda.time.LocalDate` for ages, OP may be using it as well. – Inoy Jan 14 '20 at 17:08
-18

A pretty nice way to do this is to use SimpleDateFormat I'll show you how:

SimpleDateFormat sdf = new SimpleDateFormat("d MMMM YYYY");
Date d = new Date();
sdf.format(d);

I see that you have the date in a variable:

sdf.format(variable_name);

Cheers.

nom
  • 256
  • 3
  • 16
  • 5
    OP wants to print the content of a `LocalDate` instance in a specific format. How could `SimpleDateFormat` help him here? – Tom Jan 27 '15 at 18:34