When displaying dates to users or parsing date strings from input, you need flexible formatting. DateTimeFormatter supports both standard ISO formats and custom patterns for any locale or display requirement.

DateTime formatting converts date/time objects to human-readable strings using patterns. Java uses DateTimeFormatter for flexible formatting.

ISO Formatters

Iso.java
// ISO format

import java.time.LocalDateTime;
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.ZonedDateTime;
import java.time.Instant;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;

public class Iso {

    public static void main(String[] args) {
        LocalDateTime dt = LocalDateTime.of(2025, 1, 29, 14, 30, 45);
        LocalDate date = dt.toLocalDate();
        LocalTime time = dt.toLocalTime();
        
        // ISO date
        System.out.println("ISO Date formats:");
        System.out.println("ISO_LOCAL_DATE: " + date.format(DateTimeFormatter.ISO_LOCAL_DATE));
        System.out.println("ISO_DATE: " + date.format(DateTimeFormatter.ISO_DATE));
        System.out.println("BASIC_ISO_DATE: " + date.format(DateTimeFormatter.BASIC_ISO_DATE));

        // ISO time
        System.out.println("\nISO Time formats:");
        System.out.println("ISO_LOCAL_TIME: " + time.format(DateTimeFormatter.ISO_LOCAL_TIME));
        System.out.println("ISO_TIME: " + time.format(DateTimeFormatter.ISO_TIME));

        // ISO datetime
        System.out.println("\nISO DateTime formats:");
        System.out.println("ISO_LOCAL_DATE_TIME: " + dt.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
        System.out.println("ISO_DATE_TIME: " + dt.format(DateTimeFormatter.ISO_DATE_TIME));

        // Zoned datetime
        ZonedDateTime zdt = ZonedDateTime.of(dt, ZoneId.of("UTC"));
        System.out.println("\nZoned DateTime:");
        System.out.println("ISO_ZONED_DATE_TIME: " + zdt.format(DateTimeFormatter.ISO_ZONED_DATE_TIME));
        System.out.println("ISO_OFFSET_DATE_TIME: " + zdt.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));

        // Instant
        Instant instant = Instant.parse("2025-01-29T14:30:45Z");
        System.out.println("\nInstant:");
        System.out.println("ISO_INSTANT: " + instant.toString());

        // Parse ISO formats
        System.out.println("\nParse ISO formats:");
        
        String isoDate = "2025-01-29";
        LocalDate parsedDate = LocalDate.parse(isoDate, DateTimeFormatter.ISO_LOCAL_DATE);
        System.out.println("Parsed date: " + parsedDate);
        
        String isoTime = "14:30:45";
        LocalTime parsedTime = LocalTime.parse(isoTime, DateTimeFormatter.ISO_LOCAL_TIME);
        System.out.println("Parsed time: " + parsedTime);
        
        String isoDateTime = "2025-01-29T14:30:45";
        LocalDateTime parsedDt = LocalDateTime.parse(isoDateTime, DateTimeFormatter.ISO_LOCAL_DATE_TIME);
        System.out.println("Parsed datetime: " + parsedDt);

        // Compact formats
        System.out.println("\nCompact formats:");
        System.out.println("BASIC_ISO_DATE: " + date.format(DateTimeFormatter.BASIC_ISO_DATE));  // 20250129
        
        // Custom ISO-like
        DateTimeFormatter customIso = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss");
        System.out.println("Custom ISO: " + dt.format(customIso));

        // RFC 1123 (for HTTP headers)
        System.out.println("\nRFC 1123:");
        System.out.println(zdt.format(DateTimeFormatter.RFC_1123_DATE_TIME));
    }

}
DateTimeFormatter A formatter for printing and parsing date-time objects using predefined or custom patterns.

Custom Patterns

Patterns.java
// Custom patterns

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

public class Patterns {

    public static void main(String[] args) {
        LocalDateTime dt = ;
        
        System.out.println("DateTime: " + dt);
        System.out.println();

        // Year patterns
        System.out.println("Year patterns:");
        System.out.println("yyyy: " + dt.format(DateTimeFormatter.ofPattern("yyyy")));
        System.out.println("yy: " + dt.format(DateTimeFormatter.ofPattern("yy")));

        // Month patterns
        System.out.println("\nMonth patterns:");
        System.out.println("MM: " + dt.format(DateTimeFormatter.ofPattern("MM")));
        System.out.println("M: " + dt.format(DateTimeFormatter.ofPattern("M")));
        System.out.println("MMM: " + dt.format(DateTimeFormatter.ofPattern("MMM", Locale.US)));
        System.out.println("MMMM: " + dt.format(DateTimeFormatter.ofPattern("MMMM", Locale.US)));

        // Day patterns
        System.out.println("\nDay patterns:");
        System.out.println("dd: " + dt.format(DateTimeFormatter.ofPattern("dd")));
        System.out.println("d: " + dt.format(DateTimeFormatter.ofPattern("d")));
        System.out.println("DDD: " + dt.format(DateTimeFormatter.ofPattern("DDD")));  // day of year

        // Day of week
        System.out.println("\nDay of week:");
        System.out.println("E: " + dt.format(DateTimeFormatter.ofPattern("E", Locale.US)));
        System.out.println("EEEE: " + dt.format(DateTimeFormatter.ofPattern("EEEE", Locale.US)));

        // Hour patterns
        System.out.println("\nHour patterns:");
        System.out.println("HH: " + dt.format(DateTimeFormatter.ofPattern("HH")));  // 24-hour
        System.out.println("H: " + dt.format(DateTimeFormatter.ofPattern("H")));
        System.out.println("hh: " + dt.format(DateTimeFormatter.ofPattern("hh")));  // 12-hour
        System.out.println("h: " + dt.format(DateTimeFormatter.ofPattern("h")));

        // AM/PM
        System.out.println("\nAM/PM:");
        System.out.println("a: " + dt.format(DateTimeFormatter.ofPattern("a", Locale.US)));
        System.out.println("hh:mm a: " + dt.format(DateTimeFormatter.ofPattern("hh:mm a", Locale.US)));

        // Minute and second
        System.out.println("\nMinute and second:");
        System.out.println("mm: " + dt.format(DateTimeFormatter.ofPattern("mm")));
        System.out.println("ss: " + dt.format(DateTimeFormatter.ofPattern("ss")));

        // Combined patterns
        System.out.println("\nCombined patterns:");
        System.out.println("yyyy-MM-dd: " + dt.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
        System.out.println("dd/MM/yyyy: " + dt.format(DateTimeFormatter.ofPattern("dd/MM/yyyy")));
        System.out.println("MMM dd, yyyy: " + dt.format(DateTimeFormatter.ofPattern("MMM dd, yyyy", Locale.US)));
        System.out.println("EEEE, MMMM dd, yyyy: " + dt.format(DateTimeFormatter.ofPattern("EEEE, MMMM dd, yyyy", Locale.US)));
        System.out.println("yyyy-MM-dd HH:mm:ss: " + dt.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        System.out.println("dd/MM/yyyy hh:mm a: " + dt.format(DateTimeFormatter.ofPattern("dd/MM/yyyy hh:mm a", Locale.US)));

        // Literal text in pattern
        System.out.println("\nLiteral text:");
        System.out.println("'Date:' yyyy-MM-dd: " + dt.format(DateTimeFormatter.ofPattern("'Date:' yyyy-MM-dd")));
        System.out.println("'at' HH:mm: " + dt.format(DateTimeFormatter.ofPattern("'at' HH:mm")));

        // Reusable formatter
        DateTimeFormatter customFormatter = DateTimeFormatter.ofPattern("EEEE, MMM dd, yyyy 'at' hh:mm a", Locale.US);
        System.out.println("\nCustom formatter:");
        System.out.println(dt.format(customFormatter));

        // Different locales
        System.out.println("\nLocale patterns:");
        DateTimeFormatter usFormat = DateTimeFormatter.ofPattern("MMM dd, yyyy", Locale.US);
        DateTimeFormatter frFormat = DateTimeFormatter.ofPattern("dd MMM yyyy", Locale.FRENCH);
        System.out.println("US: " + dt.format(usFormat));
        System.out.println("French: " + dt.format(frFormat));
    }

}
// Custom patterns

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

public class Patterns {

    public static void main(String[] args) {
        LocalDateTime dt = ;
        
        System.out.println("DateTime: " + dt);
        System.out.println();

        // Year patterns
        System.out.println("Year patterns:");
        System.out.println("yyyy: " + dt.format(DateTimeFormatter.ofPattern("yyyy")));
        System.out.println("yy: " + dt.format(DateTimeFormatter.ofPattern("yy")));

        // Month patterns
        System.out.println("\nMonth patterns:");
        System.out.println("MM: " + dt.format(DateTimeFormatter.ofPattern("MM")));
        System.out.println("M: " + dt.format(DateTimeFormatter.ofPattern("M")));
        System.out.println("MMM: " + dt.format(DateTimeFormatter.ofPattern("MMM", Locale.US)));
        System.out.println("MMMM: " + dt.format(DateTimeFormatter.ofPattern("MMMM", Locale.US)));

        // Day patterns
        System.out.println("\nDay patterns:");
        System.out.println("dd: " + dt.format(DateTimeFormatter.ofPattern("dd")));
        System.out.println("d: " + dt.format(DateTimeFormatter.ofPattern("d")));
        System.out.println("DDD: " + dt.format(DateTimeFormatter.ofPattern("DDD")));  // day of year

        // Day of week
        System.out.println("\nDay of week:");
        System.out.println("E: " + dt.format(DateTimeFormatter.ofPattern("E", Locale.US)));
        System.out.println("EEEE: " + dt.format(DateTimeFormatter.ofPattern("EEEE", Locale.US)));

        // Hour patterns
        System.out.println("\nHour patterns:");
        System.out.println("HH: " + dt.format(DateTimeFormatter.ofPattern("HH")));  // 24-hour
        System.out.println("H: " + dt.format(DateTimeFormatter.ofPattern("H")));
        System.out.println("hh: " + dt.format(DateTimeFormatter.ofPattern("hh")));  // 12-hour
        System.out.println("h: " + dt.format(DateTimeFormatter.ofPattern("h")));

        // AM/PM
        System.out.println("\nAM/PM:");
        System.out.println("a: " + dt.format(DateTimeFormatter.ofPattern("a", Locale.US)));
        System.out.println("hh:mm a: " + dt.format(DateTimeFormatter.ofPattern("hh:mm a", Locale.US)));

        // Minute and second
        System.out.println("\nMinute and second:");
        System.out.println("mm: " + dt.format(DateTimeFormatter.ofPattern("mm")));
        System.out.println("ss: " + dt.format(DateTimeFormatter.ofPattern("ss")));

        // Combined patterns
        System.out.println("\nCombined patterns:");
        System.out.println("yyyy-MM-dd: " + dt.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
        System.out.println("dd/MM/yyyy: " + dt.format(DateTimeFormatter.ofPattern("dd/MM/yyyy")));
        System.out.println("MMM dd, yyyy: " + dt.format(DateTimeFormatter.ofPattern("MMM dd, yyyy", Locale.US)));
        System.out.println("EEEE, MMMM dd, yyyy: " + dt.format(DateTimeFormatter.ofPattern("EEEE, MMMM dd, yyyy", Locale.US)));
        System.out.println("yyyy-MM-dd HH:mm:ss: " + dt.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        System.out.println("dd/MM/yyyy hh:mm a: " + dt.format(DateTimeFormatter.ofPattern("dd/MM/yyyy hh:mm a", Locale.US)));

        // Literal text in pattern
        System.out.println("\nLiteral text:");
        System.out.println("'Date:' yyyy-MM-dd: " + dt.format(DateTimeFormatter.ofPattern("'Date:' yyyy-MM-dd")));
        System.out.println("'at' HH:mm: " + dt.format(DateTimeFormatter.ofPattern("'at' HH:mm")));

        // Reusable formatter
        DateTimeFormatter customFormatter = DateTimeFormatter.ofPattern("EEEE, MMM dd, yyyy 'at' hh:mm a", Locale.US);
        System.out.println("\nCustom formatter:");
        System.out.println(dt.format(customFormatter));

        // Different locales
        System.out.println("\nLocale patterns:");
        DateTimeFormatter usFormat = DateTimeFormatter.ofPattern("MMM dd, yyyy", Locale.US);
        DateTimeFormatter frFormat = DateTimeFormatter.ofPattern("dd MMM yyyy", Locale.FRENCH);
        System.out.println("US: " + dt.format(usFormat));
        System.out.println("French: " + dt.format(frFormat));
    }

}
format_pattern A string of letters representing date/time fields like `yyyy` for year, `MM` for month, `dd` for day.

Formatting Output

Format.java
// Format to string

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

public class Format {

    public static void main(String[] args) {
        LocalDateTime dt = ;
        
        System.out.println("DateTime: " + dt);
        System.out.println();

        // ISO formatters
        System.out.println("ISO formats:");
        System.out.println("ISO_LOCAL_DATE_TIME: " + dt.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
        System.out.println("ISO_LOCAL_DATE: " + dt.format(DateTimeFormatter.ISO_LOCAL_DATE));
        System.out.println("ISO_LOCAL_TIME: " + dt.format(DateTimeFormatter.ISO_LOCAL_TIME));

        // Custom patterns
        System.out.println("\nCustom patterns:");
        
        DateTimeFormatter fmt1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        System.out.println("yyyy-MM-dd HH:mm:ss: " + dt.format(fmt1));
        
        DateTimeFormatter fmt2 = DateTimeFormatter.ofPattern("MM/dd/yyyy");
        System.out.println("MM/dd/yyyy: " + dt.format(fmt2));
        
        DateTimeFormatter fmt3 = DateTimeFormatter.ofPattern("dd-MMM-yyyy", Locale.US);
        System.out.println("dd-MMM-yyyy: " + dt.format(fmt3));
        
        DateTimeFormatter fmt4 = DateTimeFormatter.ofPattern("EEEE, MMMM dd, yyyy", Locale.US);
        System.out.println("Full date: " + dt.format(fmt4));

        // Time formats
        System.out.println("\nTime formats:");
        
        DateTimeFormatter fmt5 = DateTimeFormatter.ofPattern("HH:mm:ss");
        System.out.println("24-hour: " + dt.format(fmt5));
        
        DateTimeFormatter fmt6 = DateTimeFormatter.ofPattern("hh:mm a", Locale.US);
        System.out.println("12-hour: " + dt.format(fmt6));

        // Date only
        LocalDate date = LocalDate.of(2025, 1, 29);
        System.out.println("\nDate only:");
        System.out.println("ISO: " + date.format(DateTimeFormatter.ISO_LOCAL_DATE));
        System.out.println("US: " + date.format(DateTimeFormatter.ofPattern("MM/dd/yyyy")));
        System.out.println("EU: " + date.format(DateTimeFormatter.ofPattern("dd/MM/yyyy")));

        // Time only
        LocalTime time = LocalTime.of(14, 30, 45);
        System.out.println("\nTime only:");
        System.out.println("ISO: " + time.format(DateTimeFormatter.ISO_LOCAL_TIME));
        System.out.println("Simple: " + time.format(DateTimeFormatter.ofPattern("HH:mm")));

        // toString() for default format
        System.out.println("\nDefault toString():");
        System.out.println("Date: " + date);
        System.out.println("Time: " + time);
        System.out.println("DateTime: " + dt);
    }

}
// Format to string

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

public class Format {

    public static void main(String[] args) {
        LocalDateTime dt = ;
        
        System.out.println("DateTime: " + dt);
        System.out.println();

        // ISO formatters
        System.out.println("ISO formats:");
        System.out.println("ISO_LOCAL_DATE_TIME: " + dt.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
        System.out.println("ISO_LOCAL_DATE: " + dt.format(DateTimeFormatter.ISO_LOCAL_DATE));
        System.out.println("ISO_LOCAL_TIME: " + dt.format(DateTimeFormatter.ISO_LOCAL_TIME));

        // Custom patterns
        System.out.println("\nCustom patterns:");
        
        DateTimeFormatter fmt1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        System.out.println("yyyy-MM-dd HH:mm:ss: " + dt.format(fmt1));
        
        DateTimeFormatter fmt2 = DateTimeFormatter.ofPattern("MM/dd/yyyy");
        System.out.println("MM/dd/yyyy: " + dt.format(fmt2));
        
        DateTimeFormatter fmt3 = DateTimeFormatter.ofPattern("dd-MMM-yyyy", Locale.US);
        System.out.println("dd-MMM-yyyy: " + dt.format(fmt3));
        
        DateTimeFormatter fmt4 = DateTimeFormatter.ofPattern("EEEE, MMMM dd, yyyy", Locale.US);
        System.out.println("Full date: " + dt.format(fmt4));

        // Time formats
        System.out.println("\nTime formats:");
        
        DateTimeFormatter fmt5 = DateTimeFormatter.ofPattern("HH:mm:ss");
        System.out.println("24-hour: " + dt.format(fmt5));
        
        DateTimeFormatter fmt6 = DateTimeFormatter.ofPattern("hh:mm a", Locale.US);
        System.out.println("12-hour: " + dt.format(fmt6));

        // Date only
        LocalDate date = LocalDate.of(2025, 1, 29);
        System.out.println("\nDate only:");
        System.out.println("ISO: " + date.format(DateTimeFormatter.ISO_LOCAL_DATE));
        System.out.println("US: " + date.format(DateTimeFormatter.ofPattern("MM/dd/yyyy")));
        System.out.println("EU: " + date.format(DateTimeFormatter.ofPattern("dd/MM/yyyy")));

        // Time only
        LocalTime time = LocalTime.of(14, 30, 45);
        System.out.println("\nTime only:");
        System.out.println("ISO: " + time.format(DateTimeFormatter.ISO_LOCAL_TIME));
        System.out.println("Simple: " + time.format(DateTimeFormatter.ofPattern("HH:mm")));

        // toString() for default format
        System.out.println("\nDefault toString():");
        System.out.println("Date: " + date);
        System.out.println("Time: " + time);
        System.out.println("DateTime: " + dt);
    }

}

Parsing Input

Parse.java
// Parse from string

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

public class Parse {

    public static void main(String[] args) {
        // Parse ISO format
        String iso = ;
        LocalDateTime dt1 = LocalDateTime.parse(iso);
        System.out.println("Parsed ISO: " + dt1);

        // Parse with custom pattern
        String custom1 = "29/01/2025 14:30";
        DateTimeFormatter fmt1 = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm");
        LocalDateTime dt2 = LocalDateTime.parse(custom1, fmt1);
        System.out.println("Parsed " + custom1 + ": " + dt2);

        // Parse various formats
        System.out.println("\nParse various formats:");
        
        String[] dateTimeStrings = {
            "2025-01-29 14:30:45",
            "01/29/2025 02:30 PM",
            "29-Jan-2025 14:30"
        };
        
        DateTimeFormatter[] formatters = {
            DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"),
            DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm a", Locale.US),
            DateTimeFormatter.ofPattern("dd-MMM-yyyy HH:mm", Locale.US)
        };
        
        for (int i = 0; i < dateTimeStrings.length; i++) {
            LocalDateTime dt = LocalDateTime.parse(dateTimeStrings[i], formatters[i]);
            System.out.println(dateTimeStrings[i] + " -> " + dt);
        }

        // Parse dates
        System.out.println("\nParse dates:");
        LocalDate date1 = LocalDate.parse("2025-01-29");
        System.out.println("ISO date: " + date1);
        
        LocalDate date2 = LocalDate.parse("01/29/2025", DateTimeFormatter.ofPattern("MM/dd/yyyy"));
        System.out.println("US date: " + date2);

        // Parse times
        System.out.println("\nParse times:");
        LocalTime time1 = LocalTime.parse("14:30:45");
        System.out.println("ISO time: " + time1);
        
        LocalTime time2 = LocalTime.parse("02:30 PM", DateTimeFormatter.ofPattern("hh:mm a", Locale.US));
        System.out.println("12-hour time: " + time2);

        // Handle parse errors
        System.out.println("\nHandle parse errors:");
        String[] testStrings = {
            "2025-01-29T14:30:45",
            "2025-13-01T14:30:45",  // invalid month
            "not-a-datetime"
        };
        
        for (String str : testStrings) {
            try {
                LocalDateTime dt = LocalDateTime.parse(str);
                System.out.println(str + " -> " + dt);
            } catch (DateTimeParseException e) {
                System.out.println(str + " -> ERROR: Invalid format");
            }
        }

        // Safe parse helper
        System.out.println("\nSafe parse:");
        System.out.println(safeParseDateTime("2025-01-29T14:30:45"));
        System.out.println(safeParseDateTime("invalid"));
    }

    public static LocalDateTime safeParseDateTime(String str) {
        try {
            return LocalDateTime.parse(str);
        } catch (DateTimeParseException e) {
            System.out.println("Invalid datetime: " + str);
            return null;
        }
    }

}
// Parse from string

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

public class Parse {

    public static void main(String[] args) {
        // Parse ISO format
        String iso = ;
        LocalDateTime dt1 = LocalDateTime.parse(iso);
        System.out.println("Parsed ISO: " + dt1);

        // Parse with custom pattern
        String custom1 = "29/01/2025 14:30";
        DateTimeFormatter fmt1 = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm");
        LocalDateTime dt2 = LocalDateTime.parse(custom1, fmt1);
        System.out.println("Parsed " + custom1 + ": " + dt2);

        // Parse various formats
        System.out.println("\nParse various formats:");
        
        String[] dateTimeStrings = {
            "2025-01-29 14:30:45",
            "01/29/2025 02:30 PM",
            "29-Jan-2025 14:30"
        };
        
        DateTimeFormatter[] formatters = {
            DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"),
            DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm a", Locale.US),
            DateTimeFormatter.ofPattern("dd-MMM-yyyy HH:mm", Locale.US)
        };
        
        for (int i = 0; i < dateTimeStrings.length; i++) {
            LocalDateTime dt = LocalDateTime.parse(dateTimeStrings[i], formatters[i]);
            System.out.println(dateTimeStrings[i] + " -> " + dt);
        }

        // Parse dates
        System.out.println("\nParse dates:");
        LocalDate date1 = LocalDate.parse("2025-01-29");
        System.out.println("ISO date: " + date1);
        
        LocalDate date2 = LocalDate.parse("01/29/2025", DateTimeFormatter.ofPattern("MM/dd/yyyy"));
        System.out.println("US date: " + date2);

        // Parse times
        System.out.println("\nParse times:");
        LocalTime time1 = LocalTime.parse("14:30:45");
        System.out.println("ISO time: " + time1);
        
        LocalTime time2 = LocalTime.parse("02:30 PM", DateTimeFormatter.ofPattern("hh:mm a", Locale.US));
        System.out.println("12-hour time: " + time2);

        // Handle parse errors
        System.out.println("\nHandle parse errors:");
        String[] testStrings = {
            "2025-01-29T14:30:45",
            "2025-13-01T14:30:45",  // invalid month
            "not-a-datetime"
        };
        
        for (String str : testStrings) {
            try {
                LocalDateTime dt = LocalDateTime.parse(str);
                System.out.println(str + " -> " + dt);
            } catch (DateTimeParseException e) {
                System.out.println(str + " -> ERROR: Invalid format");
            }
        }

        // Safe parse helper
        System.out.println("\nSafe parse:");
        System.out.println(safeParseDateTime("2025-01-29T14:30:45"));
        System.out.println(safeParseDateTime("invalid"));
    }

    public static LocalDateTime safeParseDateTime(String str) {
        try {
            return LocalDateTime.parse(str);
        } catch (DateTimeParseException e) {
            System.out.println("Invalid datetime: " + str);
            return null;
        }
    }

}
parsing Converting a string representation back into a date/time object using a matching format pattern.

Locale-Specific Formatting

LocaleFormat.java
// Locale-specific formatting

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.util.Locale;

public class LocaleFormat {

    public static void main(String[] args) {
        LocalDateTime dt = LocalDateTime.of(2025, 1, 29, 14, 30, 45);
        
        System.out.println("DateTime: " + dt);
        System.out.println();

        // Different locales
        Locale[] locales = {
            Locale.US,
            Locale.UK,
            Locale.FRANCE,
            Locale.GERMANY,
            Locale.JAPAN
        };

        System.out.println("Locale-specific dates:");
        for (Locale locale : locales) {
            DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL).withLocale(locale);
            System.out.println(locale.getDisplayName(Locale.US) + ": " + dt.format(formatter));
        }

        // Different styles
        System.out.println("\nDifferent styles (US locale):");
        FormatStyle[] styles = {FormatStyle.FULL, FormatStyle.LONG, FormatStyle.MEDIUM, FormatStyle.SHORT};
        
        for (FormatStyle style : styles) {
            DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDate(style).withLocale(Locale.US);
            System.out.println(style + ": " + dt.format(formatter));
        }

        // Date and time together
        System.out.println("\nDate and time (US):");
        DateTimeFormatter dtFormatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM).withLocale(Locale.US);
        System.out.println(dt.format(dtFormatter));

        // Custom pattern with locale
        System.out.println("\nCustom with locale:");
        DateTimeFormatter custom = DateTimeFormatter.ofPattern("EEEE, MMMM dd, yyyy", Locale.US);
        System.out.println("US: " + dt.format(custom));
        
        DateTimeFormatter customFr = DateTimeFormatter.ofPattern("EEEE dd MMMM yyyy", Locale.FRANCE);
        System.out.println("French: " + dt.format(customFr));

        // Month names in different locales
        System.out.println("\nMonth names:");
        DateTimeFormatter monthFormatter = DateTimeFormatter.ofPattern("MMMM");
        for (Locale locale : new Locale[]{Locale.US, Locale.FRANCE, Locale.GERMANY}) {
            String month = dt.format(monthFormatter.withLocale(locale));
            System.out.println(locale.getDisplayLanguage(Locale.US) + ": " + month);
        }

        // Day names in different locales
        System.out.println("\nDay names:");
        DateTimeFormatter dayFormatter = DateTimeFormatter.ofPattern("EEEE");
        for (Locale locale : new Locale[]{Locale.US, Locale.FRANCE, Locale.GERMANY}) {
            String day = dt.format(dayFormatter.withLocale(locale));
            System.out.println(locale.getDisplayLanguage(Locale.US) + ": " + day);
        }

        // AM/PM in different locales
        System.out.println("\nAM/PM:");
        DateTimeFormatter ampmFormatter = DateTimeFormatter.ofPattern("hh:mm a");
        for (Locale locale : new Locale[]{Locale.US, Locale.UK, Locale.FRANCE}) {
            String time = dt.format(ampmFormatter.withLocale(locale));
            System.out.println(locale.getDisplayCountry(Locale.US) + ": " + time);
        }
    }

}
locale A geographical/cultural region that affects how dates are displayed, like month names and date order.

Pattern Symbols

  • yyyy: 4-digit year
  • MM: 2-digit month
  • dd: 2-digit day
  • HH: 24-hour (00-23)
  • hh: 12-hour (01-12)
  • mm: minute
  • ss: second
  • a: AM/PM marker

Common Formatters

  • ISO_LOCAL_DATE: 2025-01-29
  • ISO_LOCAL_TIME: 14:30:45
  • ISO_LOCAL_DATE_TIME: 2025-01-29T14:30:45

Exercise: Practical.java

Parse a date from user input in multiple formats (MM/dd/yyyy, yyyy-MM-dd, dd-MMM-yyyy) and output in a standardized format