Formatting and Parsing

DateTimeFormatter

PatternMeaningExample
ddday of month, 2 digits05
MM / MMM / MMMMmonth number / short / full name08 / Aug / August
yyyyyear2024
EEE / EEEEday name short / fullThu / Thursday
HH / hhhour 0-23 / 1-1214 / 02
mm, ssminutes, seconds30, 05
aAM/PMPM

Tip: MM is month and mm is minutes. Mixing them up is a very common bug.

Note: By default, parsing quietly adjusts impossible days (31 Feb becomes 29 Feb). To validate user input such as a date of birth, use ResolverStyle.STRICT with the year pattern uuuu.

Format and Parse

Example

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.time.format.ResolverStyle;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        LocalDateTime dt = LocalDateTime.of(2024, 8, 15, 14, 30);

        DateTimeFormatter indian = DateTimeFormatter.ofPattern("dd/MM/yyyy");
        DateTimeFormatter pretty = DateTimeFormatter.ofPattern("EEE, d MMM yyyy, hh:mm a", Locale.ENGLISH);
        System.out.println(dt.format(indian));
        System.out.println(dt.format(pretty));
        System.out.println(dt.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));

        LocalDate dob = LocalDate.parse("26/01/2000", indian);
        System.out.println("Parsed DOB: " + dob);
        System.out.println("ISO parse : " + LocalDate.parse("2024-12-25"));

        // the default (SMART) resolver quietly adjusts 31 Feb to the last valid day
        System.out.println("31/02/2024 -> " + LocalDate.parse("31/02/2024", indian));

        DateTimeFormatter strict = DateTimeFormatter.ofPattern("dd/MM/uuuu").withResolverStyle(ResolverStyle.STRICT);
        for (String input : new String[] { "31/02/2024", "32/01/2024" }) {
            try {
                LocalDate.parse(input, strict);
            } catch (DateTimeParseException e) {
                System.out.println("Strict parser rejected " + input);
            }
        }
    }
}

Output

15/08/2024
Thu, 15 Aug 2024, 02:30 PM
2024-08-15T14:30:00
Parsed DOB: 2000-01-26
ISO parse : 2024-12-25
31/02/2024 -> 2024-02-29
Strict parser rejected 31/02/2024
Strict parser rejected 32/01/2024