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
Replay: real traced execution (multi-file project)
// 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));
    }

}
  1. dt ← 2025-01-29T14:30:45, date ← 2025-01-29, time ← 14:30:45, zdt ← 2025-01-29T14:30:45Z[UTC]

    13public static void main(String[] args) {14    LocalDateTime dt→ 2025-01-29T14:30:45 = LocalDateTime.of(2025, 1, 29, 14, 30, 45);15    LocalDate date→ 2025-01-29 = dt.toLocalDate();16    LocalTime time→ 14:30:45 = dt.toLocalTime();17    18    // ISO date19    System.out.println("ISO Date formats:");20    System.out.println("ISO_LOCAL_DATE: " + date.format(DateTimeFormatter.ISO_LOCAL_DATE));21    System.out.println("ISO_DATE: " + date.format(DateTimeFormatter.ISO_DATE));22    System.out.println("BASIC_ISO_DATE: " + date.format(DateTimeFormatter.BASIC_ISO_DATE));2324    // ISO time25    System.out.println("\nISO Time formats:");26    System.out.println("ISO_LOCAL_TIME: " + time.format(DateTimeFormatter.ISO_LOCAL_TIME));27    System.out.println("ISO_TIME: " + time.format(DateTimeFormatter.ISO_TIME));2829    // ISO datetime30    System.out.println("\nISO DateTime formats:");31    System.out.println("ISO_LOCAL_DATE_TIME: " + dt.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));32    System.out.println("ISO_DATE_TIME: " + dt.format(DateTimeFormatter.ISO_DATE_TIME));3334    // Zoned datetime35    ZonedDateTime zdt→ 2025-01-29T14:30:45Z[UTC] = ZonedDateTime.of(dt2025-01-29T14:30:45, ZoneId.of("UTC"));36    System.out.println("\nZoned DateTime:");37    System.out.println("ISO_ZONED_DATE_TIME: " + zdt.format(DateTimeFormatter.ISO_ZONED_DATE_TIME));38    System.out.println("ISO_OFFSET_DATE_TIME: " + zdt.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));3940    // Instant41    Instant instant→ 2025-01-29T14:30:45Z = Instant.parse("2025-01-29T14:30:45Z");42    System.out.println("\nInstant:");43    System.out.println("ISO_INSTANT: " + instant.toString());4445    // Parse ISO formats46    System.out.println("\nParse ISO formats:");47    48    String isoDate→ 2025-01-29 = "2025-01-29";49    LocalDate parsedDate→ 2025-01-29 = LocalDate.parse(isoDate2025-01-29, DateTimeFormatter.ISO_LOCAL_DATE);50    System.out.println("Parsed date: " + parsedDate2025-01-29);51    52    String isoTime→ 14:30:45 = "14:30:45";53    LocalTime parsedTime→ 14:30:45 = LocalTime.parse(isoTime14:30:45, DateTimeFormatter.ISO_LOCAL_TIME);54    System.out.println("Parsed time: " + parsedTime14:30:45);55    56    String isoDateTime→ 2025-01-29T14:30:45 = "2025-01-29T14:30:45";57    LocalDateTime parsedDt→ 2025-01-29T14:30:45 = LocalDateTime.parse(isoDateTime2025-01-29T14:30:45, DateTimeFormatter.ISO_LOCAL_DATE_TIME);58    System.out.println("Parsed datetime: " + parsedDt2025-01-29T14:30:45);5960    // Compact formats61    System.out.println("\nCompact formats:");62    System.out.println("BASIC_ISO_DATE: " + date.format(DateTimeFormatter.BASIC_ISO_DATE));  // 2025012963    64    // Custom ISO-like65    DateTimeFormatter customIso→ Value(YearOfEra,4,19,EXCEEDS_PAD)'-'Value(MonthOfYear,2)'-'Value(DayOfMonth,2)'T'Value(HourOfDay,2)':'Value(MinuteOfHour,2)':'Value(SecondOfMinute,2) = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss");66    System.out.println("Custom ISO: " + dt.format(customIsoValue(YearOfEra,4,19,EXCEEDS_PAD)'-'Value(MonthOfYear,2)'-'Value(DayOfMonth,2)'T'Value(HourOfDay,2)':'Value(MinuteOfHour,2)':'Value(SecondOfMinute,2)));6768    // RFC 1123 (for HTTP headers)69    System.out.println("\nRFC 1123:");70    System.out.println(zdt.format(DateTimeFormatter.RFC_1123_DATE_TIME));71}
    outputISO Date formats:
    ISO_LOCAL_DATE: 2025-01-29
    ISO_DATE: 2025-01-29
    BASIC_ISO_DATE: 20250129
    
    ISO Time formats:
    ISO_LOCAL_TIME: 14:30:45
    ISO_TIME: 14:30:45
    
    ISO DateTime formats:
    ISO_LOCAL_DATE_TIME: 2025-01-29T14:30:45
    ISO_DATE_TIME: 2025-01-29T14:30:45
    
    Zoned DateTime:
    ISO_ZONED_DATE_TIME: 2025-01-29T14:30:45Z[UTC]
    ISO_OFFSET_DATE_TIME: 2025-01-29T14:30:45Z
    
    Instant:
    ISO_INSTANT: 2025-01-29T14:30:45Z
    
    Parse ISO formats:
    Parsed date: 2025-01-29
    Parsed time: 14:30:45
    Parsed datetime: 2025-01-29T14:30:45
    
    Compact formats:
    BASIC_ISO_DATE: 20250129
    Custom ISO: 2025-01-29T14:30:45
    
    RFC 1123:
    Wed, 29 Jan 2025 14:30:45 GMT
DateTimeFormatter A formatter for printing and parsing date-time objects using predefined or custom patterns.

Custom Patterns

dt
Patterns.java
Replay: real traced execution (multi-file project)
// 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 = LocalDateTime.of(2025, 1, 29, 14, 30, 45);

        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 = LocalDateTime.of(2024, 7, 4, 9, 5, 0);

        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));
    }

}
  1. dt ← 2025-01-29T14:30:45, customFormatter ← Text(DayOfWeek)','' 'Text(MonthOfYear,SHORT)' 'Value(DayOfMonth,2)','' 'Value(YearOfEra,4,19,EXCEEDS_PAD)' ''at'' 'Value(ClockHourOfAmPm,2)':'Value(MinuteOfHour,2)' 'Text(AmPmOfDay,SHORT)

    9public static void main(String[] args) {10    LocalDateTime dt→ 2025-01-29T14:30:45 = LocalDateTime.of(2025, 1, 29, 14, 30, 45); //@dt=LocalDateTime.of(2025, 1, 29, 14, 30, 45), LocalDateTime.of(2024, 7, 4, 9, 5, 0)11    12    System.out.println("DateTime: " + dt2025-01-29T14:30:45);13    System.out.println();1415    // Year patterns16    System.out.println("Year patterns:");17    System.out.println("yyyy: " + dt.format(DateTimeFormatter.ofPattern("yyyy")));18    System.out.println("yy: " + dt.format(DateTimeFormatter.ofPattern("yy")));1920    // Month patterns21    System.out.println("\nMonth patterns:");22    System.out.println("MM: " + dt.format(DateTimeFormatter.ofPattern("MM")));23    System.out.println("M: " + dt.format(DateTimeFormatter.ofPattern("M")));24    System.out.println("MMM: " + dt.format(DateTimeFormatter.ofPattern("MMM", Locale.US)));25    System.out.println("MMMM: " + dt.format(DateTimeFormatter.ofPattern("MMMM", Locale.US)));2627    // Day patterns28    System.out.println("\nDay patterns:");29    System.out.println("dd: " + dt.format(DateTimeFormatter.ofPattern("dd")));30    System.out.println("d: " + dt.format(DateTimeFormatter.ofPattern("d")));31    System.out.println("DDD: " + dt.format(DateTimeFormatter.ofPattern("DDD")));  // day of year3233    // Day of week34    System.out.println("\nDay of week:");35    System.out.println("E: " + dt.format(DateTimeFormatter.ofPattern("E", Locale.US)));36    System.out.println("EEEE: " + dt.format(DateTimeFormatter.ofPattern("EEEE", Locale.US)));3738    // Hour patterns39    System.out.println("\nHour patterns:");40    System.out.println("HH: " + dt.format(DateTimeFormatter.ofPattern("HH")));  // 24-hour41    System.out.println("H: " + dt.format(DateTimeFormatter.ofPattern("H")));42    System.out.println("hh: " + dt.format(DateTimeFormatter.ofPattern("hh")));  // 12-hour43    System.out.println("h: " + dt.format(DateTimeFormatter.ofPattern("h")));4445    // AM/PM46    System.out.println("\nAM/PM:");47    System.out.println("a: " + dt.format(DateTimeFormatter.ofPattern("a", Locale.US)));48    System.out.println("hh:mm a: " + dt.format(DateTimeFormatter.ofPattern("hh:mm a", Locale.US)));4950    // Minute and second51    System.out.println("\nMinute and second:");52    System.out.println("mm: " + dt.format(DateTimeFormatter.ofPattern("mm")));53    System.out.println("ss: " + dt.format(DateTimeFormatter.ofPattern("ss")));5455    // Combined patterns56    System.out.println("\nCombined patterns:");57    System.out.println("yyyy-MM-dd: " + dt.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));58    System.out.println("dd/MM/yyyy: " + dt.format(DateTimeFormatter.ofPattern("dd/MM/yyyy")));59    System.out.println("MMM dd, yyyy: " + dt.format(DateTimeFormatter.ofPattern("MMM dd, yyyy", Locale.US)));60    System.out.println("EEEE, MMMM dd, yyyy: " + dt.format(DateTimeFormatter.ofPattern("EEEE, MMMM dd, yyyy", Locale.US)));61    System.out.println("yyyy-MM-dd HH:mm:ss: " + dt.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));62    System.out.println("dd/MM/yyyy hh:mm a: " + dt.format(DateTimeFormatter.ofPattern("dd/MM/yyyy hh:mm a", Locale.US)));6364    // Literal text in pattern65    System.out.println("\nLiteral text:");66    System.out.println("'Date:' yyyy-MM-dd: " + dt.format(DateTimeFormatter.ofPattern("'Date:' yyyy-MM-dd")));67    System.out.println("'at' HH:mm: " + dt.format(DateTimeFormatter.ofPattern("'at' HH:mm")));6869    // Reusable formatter70    DateTimeFormatter customFormatter→ Text(DayOfWeek)','' 'Text(MonthOfYear,SHORT)' 'Value(DayOfMonth,2)','' 'Value(YearOfEra,4,19,EXCEEDS_PAD)' ''at'' 'Value(ClockHourOfAmPm,2)':'Value(MinuteOfHour,2)' 'Text(AmPmOfDay,SHORT) = DateTimeFormatter.ofPattern("EEEE, MMM dd, yyyy 'at' hh:mm a", Locale.US);71    System.out.println("\nCustom formatter:");72    System.out.println(dt.format(customFormatterText(DayOfWeek)','' 'Text(MonthOfYear,SHORT)' 'Value(DayOfMonth,2)','' 'Value(YearOfEra,4,19,EXCEEDS_PAD)' ''at'' 'Value(ClockHourOfAmPm,2)':'Value(MinuteOfHour,2)' 'Text(AmPmOfDay,SHORT)));7374    // Different locales75    System.out.println("\nLocale patterns:");76    DateTimeFormatter usFormat→ Text(MonthOfYear,SHORT)' 'Value(DayOfMonth,2)','' 'Value(YearOfEra,4,19,EXCEEDS_PAD) = DateTimeFormatter.ofPattern("MMM dd, yyyy", Locale.US);77    DateTimeFormatter frFormat→ Value(DayOfMonth,2)' 'Text(MonthOfYear,SHORT)' 'Value(YearOfEra,4,19,EXCEEDS_PAD) = DateTimeFormatter.ofPattern("dd MMM yyyy", Locale.FRENCH);78    System.out.println("US: " + dt.format(usFormatText(MonthOfYear,SHORT)' 'Value(DayOfMonth,2)','' 'Value(YearOfEra,4,19,EXCEEDS_PAD)));79    System.out.println("French: " + dt.format(frFormatValue(DayOfMonth,2)' 'Text(MonthOfYear,SHORT)' 'Value(YearOfEra,4,19,EXCEEDS_PAD)));80}
    outputDateTime: 2025-01-29T14:30:45
    Year patterns:
    yyyy: 2025
    yy: 25
    
    Month patterns:
    MM: 01
    M: 1
    MMM: Jan
    MMMM: January
    
    Day patterns:
    dd: 29
    d: 29
    DDD: 029
    
    Day of week:
    E: Wed
    EEEE: Wednesday
    
    Hour patterns:
    HH: 14
    H: 14
    hh: 02
    h: 2
    
    AM/PM:
    a: PM
    hh:mm a: 02:30 PM
    
    Minute and second:
    mm: 30
    ss: 45
    
    Combined patterns:
    yyyy-MM-dd: 2025-01-29
    dd/MM/yyyy: 29/01/2025
    MMM dd, yyyy: Jan 29, 2025
    EEEE, MMMM dd, yyyy: Wednesday, January 29, 2025
    yyyy-MM-dd HH:mm:ss: 2025-01-29 14:30:45
    dd/MM/yyyy hh:mm a: 29/01/2025 02:30 PM
    
    Literal text:
    'Date:' yyyy-MM-dd: Date: 2025-01-29
    'at' HH:mm: at 14:30
    
    Custom formatter:
    Wednesday, Jan 29, 2025 at 02:30 PM
    
    Locale patterns:
    US: Jan 29, 2025
    French: 29 janv. 2025
  1. dt ← 2024-07-04T09:05, customFormatter ← Text(DayOfWeek)','' 'Text(MonthOfYear,SHORT)' 'Value(DayOfMonth,2)','' 'Value(YearOfEra,4,19,EXCEEDS_PAD)' ''at'' 'Value(ClockHourOfAmPm,2)':'Value(MinuteOfHour,2)' 'Text(AmPmOfDay,SHORT)

    9public static void main(String[] args) {10    LocalDateTime dt→ 2024-07-04T09:05 = LocalDateTime.of(2024, 7, 4, 9, 5, 0);11    12    System.out.println("DateTime: " + dt2024-07-04T09:05);13    System.out.println();1415    // Year patterns16    System.out.println("Year patterns:");17    System.out.println("yyyy: " + dt.format(DateTimeFormatter.ofPattern("yyyy")));18    System.out.println("yy: " + dt.format(DateTimeFormatter.ofPattern("yy")));1920    // Month patterns21    System.out.println("\nMonth patterns:");22    System.out.println("MM: " + dt.format(DateTimeFormatter.ofPattern("MM")));23    System.out.println("M: " + dt.format(DateTimeFormatter.ofPattern("M")));24    System.out.println("MMM: " + dt.format(DateTimeFormatter.ofPattern("MMM", Locale.US)));25    System.out.println("MMMM: " + dt.format(DateTimeFormatter.ofPattern("MMMM", Locale.US)));2627    // Day patterns28    System.out.println("\nDay patterns:");29    System.out.println("dd: " + dt.format(DateTimeFormatter.ofPattern("dd")));30    System.out.println("d: " + dt.format(DateTimeFormatter.ofPattern("d")));31    System.out.println("DDD: " + dt.format(DateTimeFormatter.ofPattern("DDD")));  // day of year3233    // Day of week34    System.out.println("\nDay of week:");35    System.out.println("E: " + dt.format(DateTimeFormatter.ofPattern("E", Locale.US)));36    System.out.println("EEEE: " + dt.format(DateTimeFormatter.ofPattern("EEEE", Locale.US)));3738    // Hour patterns39    System.out.println("\nHour patterns:");40    System.out.println("HH: " + dt.format(DateTimeFormatter.ofPattern("HH")));  // 24-hour41    System.out.println("H: " + dt.format(DateTimeFormatter.ofPattern("H")));42    System.out.println("hh: " + dt.format(DateTimeFormatter.ofPattern("hh")));  // 12-hour43    System.out.println("h: " + dt.format(DateTimeFormatter.ofPattern("h")));4445    // AM/PM46    System.out.println("\nAM/PM:");47    System.out.println("a: " + dt.format(DateTimeFormatter.ofPattern("a", Locale.US)));48    System.out.println("hh:mm a: " + dt.format(DateTimeFormatter.ofPattern("hh:mm a", Locale.US)));4950    // Minute and second51    System.out.println("\nMinute and second:");52    System.out.println("mm: " + dt.format(DateTimeFormatter.ofPattern("mm")));53    System.out.println("ss: " + dt.format(DateTimeFormatter.ofPattern("ss")));5455    // Combined patterns56    System.out.println("\nCombined patterns:");57    System.out.println("yyyy-MM-dd: " + dt.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));58    System.out.println("dd/MM/yyyy: " + dt.format(DateTimeFormatter.ofPattern("dd/MM/yyyy")));59    System.out.println("MMM dd, yyyy: " + dt.format(DateTimeFormatter.ofPattern("MMM dd, yyyy", Locale.US)));60    System.out.println("EEEE, MMMM dd, yyyy: " + dt.format(DateTimeFormatter.ofPattern("EEEE, MMMM dd, yyyy", Locale.US)));61    System.out.println("yyyy-MM-dd HH:mm:ss: " + dt.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));62    System.out.println("dd/MM/yyyy hh:mm a: " + dt.format(DateTimeFormatter.ofPattern("dd/MM/yyyy hh:mm a", Locale.US)));6364    // Literal text in pattern65    System.out.println("\nLiteral text:");66    System.out.println("'Date:' yyyy-MM-dd: " + dt.format(DateTimeFormatter.ofPattern("'Date:' yyyy-MM-dd")));67    System.out.println("'at' HH:mm: " + dt.format(DateTimeFormatter.ofPattern("'at' HH:mm")));6869    // Reusable formatter70    DateTimeFormatter customFormatter→ Text(DayOfWeek)','' 'Text(MonthOfYear,SHORT)' 'Value(DayOfMonth,2)','' 'Value(YearOfEra,4,19,EXCEEDS_PAD)' ''at'' 'Value(ClockHourOfAmPm,2)':'Value(MinuteOfHour,2)' 'Text(AmPmOfDay,SHORT) = DateTimeFormatter.ofPattern("EEEE, MMM dd, yyyy 'at' hh:mm a", Locale.US);71    System.out.println("\nCustom formatter:");72    System.out.println(dt.format(customFormatterText(DayOfWeek)','' 'Text(MonthOfYear,SHORT)' 'Value(DayOfMonth,2)','' 'Value(YearOfEra,4,19,EXCEEDS_PAD)' ''at'' 'Value(ClockHourOfAmPm,2)':'Value(MinuteOfHour,2)' 'Text(AmPmOfDay,SHORT)));7374    // Different locales75    System.out.println("\nLocale patterns:");76    DateTimeFormatter usFormat→ Text(MonthOfYear,SHORT)' 'Value(DayOfMonth,2)','' 'Value(YearOfEra,4,19,EXCEEDS_PAD) = DateTimeFormatter.ofPattern("MMM dd, yyyy", Locale.US);77    DateTimeFormatter frFormat→ Value(DayOfMonth,2)' 'Text(MonthOfYear,SHORT)' 'Value(YearOfEra,4,19,EXCEEDS_PAD) = DateTimeFormatter.ofPattern("dd MMM yyyy", Locale.FRENCH);78    System.out.println("US: " + dt.format(usFormatText(MonthOfYear,SHORT)' 'Value(DayOfMonth,2)','' 'Value(YearOfEra,4,19,EXCEEDS_PAD)));79    System.out.println("French: " + dt.format(frFormatValue(DayOfMonth,2)' 'Text(MonthOfYear,SHORT)' 'Value(YearOfEra,4,19,EXCEEDS_PAD)));80}
    outputDateTime: 2024-07-04T09:05
    Year patterns:
    yyyy: 2024
    yy: 24
    
    Month patterns:
    MM: 07
    M: 7
    MMM: Jul
    MMMM: July
    
    Day patterns:
    dd: 04
    d: 4
    DDD: 186
    
    Day of week:
    E: Thu
    EEEE: Thursday
    
    Hour patterns:
    HH: 09
    H: 9
    hh: 09
    h: 9
    
    AM/PM:
    a: AM
    hh:mm a: 09:05 AM
    
    Minute and second:
    mm: 05
    ss: 00
    
    Combined patterns:
    yyyy-MM-dd: 2024-07-04
    dd/MM/yyyy: 04/07/2024
    MMM dd, yyyy: Jul 04, 2024
    EEEE, MMMM dd, yyyy: Thursday, July 04, 2024
    yyyy-MM-dd HH:mm:ss: 2024-07-04 09:05:00
    dd/MM/yyyy hh:mm a: 04/07/2024 09:05 AM
    
    Literal text:
    'Date:' yyyy-MM-dd: Date: 2024-07-04
    'at' HH:mm: at 09:05
    
    Custom formatter:
    Thursday, Jul 04, 2024 at 09:05 AM
    
    Locale patterns:
    US: Jul 04, 2024
    French: 04 juil. 2024
format_pattern A string of letters representing date/time fields like `yyyy` for year, `MM` for month, `dd` for day.

Formatting Output

dt
Format.java
Replay: real traced execution (multi-file project)
// 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 = LocalDateTime.of(2025, 1, 29, 14, 30, 45);

        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 = LocalDateTime.of(2024, 12, 5, 9, 15, 0);

        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);
    }

}
  1. dt ← 2025-01-29T14:30:45, fmt1 ← Value(YearOfEra,4,19,EXCEEDS_PAD)'-'Value(MonthOfYear,2)'-'Value(DayOfMonth,2)' 'Value(HourOfDay,2)':'Value(MinuteOfHour,2)':'Value(SecondOfMinute,2)

    11public static void main(String[] args) {12    LocalDateTime dt→ 2025-01-29T14:30:45 = LocalDateTime.of(2025, 1, 29, 14, 30, 45); //@dt=LocalDateTime.of(2025, 1, 29, 14, 30, 45), LocalDateTime.of(2024, 12, 5, 9, 15, 0)13    14    System.out.println("DateTime: " + dt2025-01-29T14:30:45);15    System.out.println();1617    // ISO formatters18    System.out.println("ISO formats:");19    System.out.println("ISO_LOCAL_DATE_TIME: " + dt.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));20    System.out.println("ISO_LOCAL_DATE: " + dt.format(DateTimeFormatter.ISO_LOCAL_DATE));21    System.out.println("ISO_LOCAL_TIME: " + dt.format(DateTimeFormatter.ISO_LOCAL_TIME));2223    // Custom patterns24    System.out.println("\nCustom patterns:");25    26    DateTimeFormatter fmt1→ Value(YearOfEra,4,19,EXCEEDS_PAD)'-'Value(MonthOfYear,2)'-'Value(DayOfMonth,2)' 'Value(HourOfDay,2)':'Value(MinuteOfHour,2)':'Value(SecondOfMinute,2) = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");27    System.out.println("yyyy-MM-dd HH:mm:ss: " + dt.format(fmt1Value(YearOfEra,4,19,EXCEEDS_PAD)'-'Value(MonthOfYear,2)'-'Value(DayOfMonth,2)' 'Value(HourOfDay,2)':'Value(MinuteOfHour,2)':'Value(SecondOfMinute,2)));28    29    DateTimeFormatter fmt2→ Value(MonthOfYear,2)'/'Value(DayOfMonth,2)'/'Value(YearOfEra,4,19,EXCEEDS_PAD) = DateTimeFormatter.ofPattern("MM/dd/yyyy");30    System.out.println("MM/dd/yyyy: " + dt.format(fmt2Value(MonthOfYear,2)'/'Value(DayOfMonth,2)'/'Value(YearOfEra,4,19,EXCEEDS_PAD)));31    32    DateTimeFormatter fmt3→ Value(DayOfMonth,2)'-'Text(MonthOfYear,SHORT)'-'Value(YearOfEra,4,19,EXCEEDS_PAD) = DateTimeFormatter.ofPattern("dd-MMM-yyyy", Locale.US);33    System.out.println("dd-MMM-yyyy: " + dt.format(fmt3Value(DayOfMonth,2)'-'Text(MonthOfYear,SHORT)'-'Value(YearOfEra,4,19,EXCEEDS_PAD)));34    35    DateTimeFormatter fmt4→ Text(DayOfWeek)','' 'Text(MonthOfYear)' 'Value(DayOfMonth,2)','' 'Value(YearOfEra,4,19,EXCEEDS_PAD) = DateTimeFormatter.ofPattern("EEEE, MMMM dd, yyyy", Locale.US);36    System.out.println("Full date: " + dt.format(fmt4Text(DayOfWeek)','' 'Text(MonthOfYear)' 'Value(DayOfMonth,2)','' 'Value(YearOfEra,4,19,EXCEEDS_PAD)));3738    // Time formats39    System.out.println("\nTime formats:");40    41    DateTimeFormatter fmt5→ Value(HourOfDay,2)':'Value(MinuteOfHour,2)':'Value(SecondOfMinute,2) = DateTimeFormatter.ofPattern("HH:mm:ss");42    System.out.println("24-hour: " + dt.format(fmt5Value(HourOfDay,2)':'Value(MinuteOfHour,2)':'Value(SecondOfMinute,2)));43    44    DateTimeFormatter fmt6→ Value(ClockHourOfAmPm,2)':'Value(MinuteOfHour,2)' 'Text(AmPmOfDay,SHORT) = DateTimeFormatter.ofPattern("hh:mm a", Locale.US);45    System.out.println("12-hour: " + dt.format(fmt6Value(ClockHourOfAmPm,2)':'Value(MinuteOfHour,2)' 'Text(AmPmOfDay,SHORT)));4647    // Date only48    LocalDate date→ 2025-01-29 = LocalDate.of(2025, 1, 29);49    System.out.println("\nDate only:");50    System.out.println("ISO: " + date.format(DateTimeFormatter.ISO_LOCAL_DATE));51    System.out.println("US: " + date.format(DateTimeFormatter.ofPattern("MM/dd/yyyy")));52    System.out.println("EU: " + date.format(DateTimeFormatter.ofPattern("dd/MM/yyyy")));5354    // Time only55    LocalTime time→ 14:30:45 = LocalTime.of(14, 30, 45);56    System.out.println("\nTime only:");57    System.out.println("ISO: " + time.format(DateTimeFormatter.ISO_LOCAL_TIME));58    System.out.println("Simple: " + time.format(DateTimeFormatter.ofPattern("HH:mm")));5960    // toString() for default format61    System.out.println("\nDefault toString():");62    System.out.println("Date: " + date2025-01-29);63    System.out.println("Time: " + time14:30:45);64    System.out.println("DateTime: " + dt2025-01-29T14:30:45);65}
    outputDateTime: 2025-01-29T14:30:45
    ISO formats:
    ISO_LOCAL_DATE_TIME: 2025-01-29T14:30:45
    ISO_LOCAL_DATE: 2025-01-29
    ISO_LOCAL_TIME: 14:30:45
    
    Custom patterns:
    yyyy-MM-dd HH:mm:ss: 2025-01-29 14:30:45
    MM/dd/yyyy: 01/29/2025
    dd-MMM-yyyy: 29-Jan-2025
    Full date: Wednesday, January 29, 2025
    
    Time formats:
    24-hour: 14:30:45
    12-hour: 02:30 PM
    
    Date only:
    ISO: 2025-01-29
    US: 01/29/2025
    EU: 29/01/2025
    
    Time only:
    ISO: 14:30:45
    Simple: 14:30
    
    Default toString():
    Date: 2025-01-29
    Time: 14:30:45
    DateTime: 2025-01-29T14:30:45
  1. dt ← 2024-12-05T09:15, fmt1 ← Value(YearOfEra,4,19,EXCEEDS_PAD)'-'Value(MonthOfYear,2)'-'Value(DayOfMonth,2)' 'Value(HourOfDay,2)':'Value(MinuteOfHour,2)':'Value(SecondOfMinute,2)

    11public static void main(String[] args) {12    LocalDateTime dt→ 2024-12-05T09:15 = LocalDateTime.of(2024, 12, 5, 9, 15, 0);13    14    System.out.println("DateTime: " + dt2024-12-05T09:15);15    System.out.println();1617    // ISO formatters18    System.out.println("ISO formats:");19    System.out.println("ISO_LOCAL_DATE_TIME: " + dt.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));20    System.out.println("ISO_LOCAL_DATE: " + dt.format(DateTimeFormatter.ISO_LOCAL_DATE));21    System.out.println("ISO_LOCAL_TIME: " + dt.format(DateTimeFormatter.ISO_LOCAL_TIME));2223    // Custom patterns24    System.out.println("\nCustom patterns:");25    26    DateTimeFormatter fmt1→ Value(YearOfEra,4,19,EXCEEDS_PAD)'-'Value(MonthOfYear,2)'-'Value(DayOfMonth,2)' 'Value(HourOfDay,2)':'Value(MinuteOfHour,2)':'Value(SecondOfMinute,2) = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");27    System.out.println("yyyy-MM-dd HH:mm:ss: " + dt.format(fmt1Value(YearOfEra,4,19,EXCEEDS_PAD)'-'Value(MonthOfYear,2)'-'Value(DayOfMonth,2)' 'Value(HourOfDay,2)':'Value(MinuteOfHour,2)':'Value(SecondOfMinute,2)));28    29    DateTimeFormatter fmt2→ Value(MonthOfYear,2)'/'Value(DayOfMonth,2)'/'Value(YearOfEra,4,19,EXCEEDS_PAD) = DateTimeFormatter.ofPattern("MM/dd/yyyy");30    System.out.println("MM/dd/yyyy: " + dt.format(fmt2Value(MonthOfYear,2)'/'Value(DayOfMonth,2)'/'Value(YearOfEra,4,19,EXCEEDS_PAD)));31    32    DateTimeFormatter fmt3→ Value(DayOfMonth,2)'-'Text(MonthOfYear,SHORT)'-'Value(YearOfEra,4,19,EXCEEDS_PAD) = DateTimeFormatter.ofPattern("dd-MMM-yyyy", Locale.US);33    System.out.println("dd-MMM-yyyy: " + dt.format(fmt3Value(DayOfMonth,2)'-'Text(MonthOfYear,SHORT)'-'Value(YearOfEra,4,19,EXCEEDS_PAD)));34    35    DateTimeFormatter fmt4→ Text(DayOfWeek)','' 'Text(MonthOfYear)' 'Value(DayOfMonth,2)','' 'Value(YearOfEra,4,19,EXCEEDS_PAD) = DateTimeFormatter.ofPattern("EEEE, MMMM dd, yyyy", Locale.US);36    System.out.println("Full date: " + dt.format(fmt4Text(DayOfWeek)','' 'Text(MonthOfYear)' 'Value(DayOfMonth,2)','' 'Value(YearOfEra,4,19,EXCEEDS_PAD)));3738    // Time formats39    System.out.println("\nTime formats:");40    41    DateTimeFormatter fmt5→ Value(HourOfDay,2)':'Value(MinuteOfHour,2)':'Value(SecondOfMinute,2) = DateTimeFormatter.ofPattern("HH:mm:ss");42    System.out.println("24-hour: " + dt.format(fmt5Value(HourOfDay,2)':'Value(MinuteOfHour,2)':'Value(SecondOfMinute,2)));43    44    DateTimeFormatter fmt6→ Value(ClockHourOfAmPm,2)':'Value(MinuteOfHour,2)' 'Text(AmPmOfDay,SHORT) = DateTimeFormatter.ofPattern("hh:mm a", Locale.US);45    System.out.println("12-hour: " + dt.format(fmt6Value(ClockHourOfAmPm,2)':'Value(MinuteOfHour,2)' 'Text(AmPmOfDay,SHORT)));4647    // Date only48    LocalDate date→ 2025-01-29 = LocalDate.of(2025, 1, 29);49    System.out.println("\nDate only:");50    System.out.println("ISO: " + date.format(DateTimeFormatter.ISO_LOCAL_DATE));51    System.out.println("US: " + date.format(DateTimeFormatter.ofPattern("MM/dd/yyyy")));52    System.out.println("EU: " + date.format(DateTimeFormatter.ofPattern("dd/MM/yyyy")));5354    // Time only55    LocalTime time→ 14:30:45 = LocalTime.of(14, 30, 45);56    System.out.println("\nTime only:");57    System.out.println("ISO: " + time.format(DateTimeFormatter.ISO_LOCAL_TIME));58    System.out.println("Simple: " + time.format(DateTimeFormatter.ofPattern("HH:mm")));5960    // toString() for default format61    System.out.println("\nDefault toString():");62    System.out.println("Date: " + date2025-01-29);63    System.out.println("Time: " + time14:30:45);64    System.out.println("DateTime: " + dt2024-12-05T09:15);65}
    outputDateTime: 2024-12-05T09:15
    ISO formats:
    ISO_LOCAL_DATE_TIME: 2024-12-05T09:15:00
    ISO_LOCAL_DATE: 2024-12-05
    ISO_LOCAL_TIME: 09:15:00
    
    Custom patterns:
    yyyy-MM-dd HH:mm:ss: 2024-12-05 09:15:00
    MM/dd/yyyy: 12/05/2024
    dd-MMM-yyyy: 05-Dec-2024
    Full date: Thursday, December 05, 2024
    
    Time formats:
    24-hour: 09:15:00
    12-hour: 09:15 AM
    
    Date only:
    ISO: 2025-01-29
    US: 01/29/2025
    EU: 29/01/2025
    
    Time only:
    ISO: 14:30:45
    Simple: 14:30
    
    Default toString():
    Date: 2025-01-29
    Time: 14:30:45
    DateTime: 2024-12-05T09:15

Parsing Input

iso
Parse.java
Replay: real traced execution (multi-file project)
// 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 = "2025-01-29T14:30:45";
        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 = "2024-12-05T09:15:00";
        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;
        }
    }

}
  1. iso ← 2025-01-29T14:30:45, dt1 ← 2025-01-29T14:30:45, custom1 ← 29/01/2025 14:30

    12public static void main(String[] args) {13    // Parse ISO format14    String iso→ 2025-01-29T14:30:45 = "2025-01-29T14:30:45"; //@iso="2025-01-29T14:30:45", "2024-12-05T09:15:00"15    LocalDateTime dt1→ 2025-01-29T14:30:45 = LocalDateTime.parse(iso2025-01-29T14:30:45);16    System.out.println("Parsed ISO: " + dt12025-01-29T14:30:45);1718    // Parse with custom pattern19    String custom1→ 29/01/2025 14:30 = "29/01/2025 14:30";20    DateTimeFormatter fmt1→ Value(DayOfMonth,2)'/'Value(MonthOfYear,2)'/'Value(YearOfEra,4,19,EXCEEDS_PAD)' 'Value(HourOfDay,2)':'Value(MinuteOfHour,2) = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm");21    LocalDateTime dt2→ 2025-01-29T14:30 = LocalDateTime.parse(custom129/01/2025 14:30, fmt1Value(DayOfMonth,2)'/'Value(MonthOfYear,2)'/'Value(YearOfEra,4,19,EXCEEDS_PAD)' 'Value(HourOfDay,2)':'Value(MinuteOfHour,2));22    System.out.println("Parsed " + custom129/01/2025 14:30 + ": " + dt22025-01-29T14:30);2324    // Parse various formats25    System.out.println("\nParse various formats:");26    27    String[] dateTimeStrings = {28        "2025-01-29 14:30:45",29        "01/29/2025 02:30 PM",30        "29-Jan-2025 14:30"31    };32    33    DateTimeFormatter[] formatters = {34        DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"),35        DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm a", Locale.US),36        DateTimeFormatter.ofPattern("dd-MMM-yyyy HH:mm", Locale.US)37    };
    outputParsed ISO: 2025-01-29T14:30:45
    Parsed 29/01/2025 14:30: 2025-01-29T14:30
    
    Parse various formats:
  2. dt ← 2025-01-29T14:30:45

    pass 1 of 3
    39for (int i0 = 0; i < dateTimeStrings.length3; i++) {40    LocalDateTime dt→ 2025-01-29T14:30:45 = LocalDateTime.parse(dateTimeStrings[i]2025-01-29 14:30:45, formatters[i]Value(YearOfEra,4,19,EXCEEDS_PAD)'-'Value(MonthOfYear,2)'-'Value(DayOfMonth,2)' 'Value(HourOfDay,2)':'Value(MinuteOfHour,2)':'Value(SecondOfMinute,2));41    System.out.println(dateTimeStrings[i]2025-01-29 14:30:45 + " -> " + dt2025-01-29T14:30:45);42}
    output2025-01-29 14:30:45 -> 2025-01-29T14:30:45
    All 3 passes — pass 1 is the card above
    passidateTimeStrings[i]formatters[i]dt
    102025-01-29 14:30:45Value(YearOfEra,4,19,EXCEEDS_PAD)'-'Value(MonthOfYear,2)'-'Value(DayOfMonth,2)' 'Value(HourOfDay,2)':'Value(MinuteOfHour,2)':'Value(SecondOfMinute,2)2025-01-29T14:30:45
    2101/29/2025 02:30 PMValue(MonthOfYear,2)'/'Value(DayOfMonth,2)'/'Value(YearOfEra,4,19,EXCEEDS_PAD)' 'Value(ClockHourOfAmPm,2)':'Value(MinuteOfHour,2)' 'Text(AmPmOfDay,SHORT)2025-01-29T14:30
    3229-Jan-2025 14:30Value(DayOfMonth,2)'-'Text(MonthOfYear,SHORT)'-'Value(YearOfEra,4,19,EXCEEDS_PAD)' 'Value(HourOfDay,2)':'Value(MinuteOfHour,2)2025-01-29T14:30
  3. date1 ← 2025-01-29, date2 ← 2025-01-29, time1 ← 14:30:45, time2 ← 14:30

    44// Parse dates45System.out.println("\nParse dates:");46LocalDate date1→ 2025-01-29 = LocalDate.parse("2025-01-29");47System.out.println("ISO date: " + date12025-01-29);4849LocalDate date2→ 2025-01-29 = LocalDate.parse("01/29/2025", DateTimeFormatter.ofPattern("MM/dd/yyyy"));50System.out.println("US date: " + date22025-01-29);5152// Parse times53System.out.println("\nParse times:");54LocalTime time1→ 14:30:45 = LocalTime.parse("14:30:45");55System.out.println("ISO time: " + time114:30:45);5657LocalTime time2→ 14:30 = LocalTime.parse("02:30 PM", DateTimeFormatter.ofPattern("hh:mm a", Locale.US));58System.out.println("12-hour time: " + time214:30);5960// Handle parse errors61System.out.println("\nHandle parse errors:");62String[] testStrings = {63    "2025-01-29T14:30:45",64    "2025-13-01T14:30:45",  // invalid month65    "not-a-datetime"66};
    output
    Parse dates:
    ISO date: 2025-01-29
    US date: 2025-01-29
    
    Parse times:
    ISO time: 14:30:45
    12-hour time: 14:30
    
    Handle parse errors:
  4. for (String str : testStrings)

    pass 1 of 3
    68for (String str2025-01-29T14:30:45 : testStrings) {69    try {
    All 3 passes — pass 1 is the card above
    passstre
    12025-01-29T14:30:45
    22025-13-01T14:30:45java.time.format.DateTimeParseException: Text '2025-13-01T14:30:45' could not be parsed: Invalid value for MonthOfYear (valid values 1 - 12): 13
    3not-a-datetimejava.time.format.DateTimeParseException: Text 'not-a-datetime' could not be parsed at index 0
  5. dt ← 2025-01-29T14:30:45

    pass 1 of 3
    68for (String str : testStrings) {69    try {70        LocalDateTime dt→ 2025-01-29T14:30:45 = LocalDateTime.parse(str2025-01-29T14:30:45);71        System.out.println(str2025-01-29T14:30:45 + " -> " + dt2025-01-29T14:30:45);72    } catch (DateTimeParseException e) {
    output2025-01-29T14:30:45 -> 2025-01-29T14:30:45
    All 3 passes — pass 1 is the card above
    passstredt
    12025-01-29T14:30:452025-01-29T14:30:45
    22025-13-01T14:30:45java.time.format.DateTimeParseException: Text '2025-13-01T14:30:45' could not be parsed: Invalid value for MonthOfYear (valid values 1 - 12): 13
    3not-a-datetimejava.time.format.DateTimeParseException: Text 'not-a-datetime' could not be parsed at index 0
  6. catch (DateTimeParseException e)

    pass 1 of 2
    71    System.out.println(str + " -> " + dt);72} catch (DateTimeParseException ejava.time.format.DateTimeParseException: Text '2025-13-01T14:30:45' could not be parsed: Invalid value for MonthOfYear (valid values 1 - 12): 13) {73    System.out.println(str2025-13-01T14:30:45 + " -> ERROR: Invalid format");74}
    output2025-13-01T14:30:45 -> ERROR: Invalid format
  7. catch (DateTimeParseException e)

    pass 2 of 2
    71    System.out.println(str + " -> " + dt);72} catch (DateTimeParseException ejava.time.format.DateTimeParseException: Text 'not-a-datetime' could not be parsed at index 0) {73    System.out.println(strnot-a-datetime + " -> ERROR: Invalid format");74}
    outputnot-a-datetime -> ERROR: Invalid format
  8. System.out.println(" Safe parse:");

    77// Safe parse helper78System.out.println("\nSafe parse:");79System.out.println(safeParseDateTime("2025-01-29T14:30:45"));80System.out.println(safeParseDateTime("invalid"));
    output
    Safe parse:
  9. public static LocalDateTime safeParseDateTime(String str)

    pass 1 of 2
    83public static LocalDateTime safeParseDateTime(String str2025-01-29T14:30:45) {84    try {
  10. try

    pass 1 of 2
    83public static LocalDateTime safeParseDateTime(String str) {84    try {85        return LocalDateTime.parse(str2025-01-29T14:30:45);86    } catch (DateTimeParseException e) {
  11. System.out.println(safeParseDateTime("2025-01-29T14:30:45"));

    78    System.out.println("\nSafe parse:");79    System.out.println(safeParseDateTime("2025-01-29T14:30:45"));80    System.out.println(safeParseDateTime("invalid"));81}
    output2025-01-29T14:30:45
  12. public static LocalDateTime safeParseDateTime(String str)

    pass 2 of 2
    83public static LocalDateTime safeParseDateTime(String strinvalid) {84    try {
  13. try

    pass 2 of 2
    83public static LocalDateTime safeParseDateTime(String str) {84    try {85        return LocalDateTime.parse(strinvalid);86    } catch (DateTimeParseException e) {
  14. catch (DateTimeParseException e)

    85    return LocalDateTime.parse(str);86} catch (DateTimeParseException ejava.time.format.DateTimeParseException: Text 'invalid' could not be parsed at index 0) {87    System.out.println("Invalid datetime: " + strinvalid);88    return null;89}
    outputInvalid datetime: invalid
  15. System.out.println(safeParseDateTime("invalid"));

    79    System.out.println(safeParseDateTime("2025-01-29T14:30:45"));80    System.out.println(safeParseDateTime("invalid"));81}
    outputnull
  1. iso ← 2024-12-05T09:15:00, dt1 ← 2024-12-05T09:15, custom1 ← 29/01/2025 14:30

    12public static void main(String[] args) {13    // Parse ISO format14    String iso→ 2024-12-05T09:15:00 = "2024-12-05T09:15:00";15    LocalDateTime dt1→ 2024-12-05T09:15 = LocalDateTime.parse(iso2024-12-05T09:15:00);16    System.out.println("Parsed ISO: " + dt12024-12-05T09:15);1718    // Parse with custom pattern19    String custom1→ 29/01/2025 14:30 = "29/01/2025 14:30";20    DateTimeFormatter fmt1→ Value(DayOfMonth,2)'/'Value(MonthOfYear,2)'/'Value(YearOfEra,4,19,EXCEEDS_PAD)' 'Value(HourOfDay,2)':'Value(MinuteOfHour,2) = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm");21    LocalDateTime dt2→ 2025-01-29T14:30 = LocalDateTime.parse(custom129/01/2025 14:30, fmt1Value(DayOfMonth,2)'/'Value(MonthOfYear,2)'/'Value(YearOfEra,4,19,EXCEEDS_PAD)' 'Value(HourOfDay,2)':'Value(MinuteOfHour,2));22    System.out.println("Parsed " + custom129/01/2025 14:30 + ": " + dt22025-01-29T14:30);2324    // Parse various formats25    System.out.println("\nParse various formats:");26    27    String[] dateTimeStrings = {28        "2025-01-29 14:30:45",29        "01/29/2025 02:30 PM",30        "29-Jan-2025 14:30"31    };32    33    DateTimeFormatter[] formatters = {34        DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"),35        DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm a", Locale.US),36        DateTimeFormatter.ofPattern("dd-MMM-yyyy HH:mm", Locale.US)37    };
    outputParsed ISO: 2024-12-05T09:15
    Parsed 29/01/2025 14:30: 2025-01-29T14:30
    
    Parse various formats:
  2. dt ← 2025-01-29T14:30:45

    pass 1 of 3
    39for (int i0 = 0; i < dateTimeStrings.length3; i++) {40    LocalDateTime dt→ 2025-01-29T14:30:45 = LocalDateTime.parse(dateTimeStrings[i]2025-01-29 14:30:45, formatters[i]Value(YearOfEra,4,19,EXCEEDS_PAD)'-'Value(MonthOfYear,2)'-'Value(DayOfMonth,2)' 'Value(HourOfDay,2)':'Value(MinuteOfHour,2)':'Value(SecondOfMinute,2));41    System.out.println(dateTimeStrings[i]2025-01-29 14:30:45 + " -> " + dt2025-01-29T14:30:45);42}
    output2025-01-29 14:30:45 -> 2025-01-29T14:30:45
    All 3 passes — pass 1 is the card above
    passidateTimeStrings[i]formatters[i]dt
    102025-01-29 14:30:45Value(YearOfEra,4,19,EXCEEDS_PAD)'-'Value(MonthOfYear,2)'-'Value(DayOfMonth,2)' 'Value(HourOfDay,2)':'Value(MinuteOfHour,2)':'Value(SecondOfMinute,2)2025-01-29T14:30:45
    2101/29/2025 02:30 PMValue(MonthOfYear,2)'/'Value(DayOfMonth,2)'/'Value(YearOfEra,4,19,EXCEEDS_PAD)' 'Value(ClockHourOfAmPm,2)':'Value(MinuteOfHour,2)' 'Text(AmPmOfDay,SHORT)2025-01-29T14:30
    3229-Jan-2025 14:30Value(DayOfMonth,2)'-'Text(MonthOfYear,SHORT)'-'Value(YearOfEra,4,19,EXCEEDS_PAD)' 'Value(HourOfDay,2)':'Value(MinuteOfHour,2)2025-01-29T14:30
  3. date1 ← 2025-01-29, date2 ← 2025-01-29, time1 ← 14:30:45, time2 ← 14:30

    44// Parse dates45System.out.println("\nParse dates:");46LocalDate date1→ 2025-01-29 = LocalDate.parse("2025-01-29");47System.out.println("ISO date: " + date12025-01-29);4849LocalDate date2→ 2025-01-29 = LocalDate.parse("01/29/2025", DateTimeFormatter.ofPattern("MM/dd/yyyy"));50System.out.println("US date: " + date22025-01-29);5152// Parse times53System.out.println("\nParse times:");54LocalTime time1→ 14:30:45 = LocalTime.parse("14:30:45");55System.out.println("ISO time: " + time114:30:45);5657LocalTime time2→ 14:30 = LocalTime.parse("02:30 PM", DateTimeFormatter.ofPattern("hh:mm a", Locale.US));58System.out.println("12-hour time: " + time214:30);5960// Handle parse errors61System.out.println("\nHandle parse errors:");62String[] testStrings = {63    "2025-01-29T14:30:45",64    "2025-13-01T14:30:45",  // invalid month65    "not-a-datetime"66};
    output
    Parse dates:
    ISO date: 2025-01-29
    US date: 2025-01-29
    
    Parse times:
    ISO time: 14:30:45
    12-hour time: 14:30
    
    Handle parse errors:
  4. for (String str : testStrings)

    pass 1 of 3
    68for (String str2025-01-29T14:30:45 : testStrings) {69    try {
    All 3 passes — pass 1 is the card above
    passstre
    12025-01-29T14:30:45
    22025-13-01T14:30:45java.time.format.DateTimeParseException: Text '2025-13-01T14:30:45' could not be parsed: Invalid value for MonthOfYear (valid values 1 - 12): 13
    3not-a-datetimejava.time.format.DateTimeParseException: Text 'not-a-datetime' could not be parsed at index 0
  5. dt ← 2025-01-29T14:30:45

    pass 1 of 3
    68for (String str : testStrings) {69    try {70        LocalDateTime dt→ 2025-01-29T14:30:45 = LocalDateTime.parse(str2025-01-29T14:30:45);71        System.out.println(str2025-01-29T14:30:45 + " -> " + dt2025-01-29T14:30:45);72    } catch (DateTimeParseException e) {
    output2025-01-29T14:30:45 -> 2025-01-29T14:30:45
    All 3 passes — pass 1 is the card above
    passstredt
    12025-01-29T14:30:452025-01-29T14:30:45
    22025-13-01T14:30:45java.time.format.DateTimeParseException: Text '2025-13-01T14:30:45' could not be parsed: Invalid value for MonthOfYear (valid values 1 - 12): 13
    3not-a-datetimejava.time.format.DateTimeParseException: Text 'not-a-datetime' could not be parsed at index 0
  6. catch (DateTimeParseException e)

    pass 1 of 2
    71    System.out.println(str + " -> " + dt);72} catch (DateTimeParseException ejava.time.format.DateTimeParseException: Text '2025-13-01T14:30:45' could not be parsed: Invalid value for MonthOfYear (valid values 1 - 12): 13) {73    System.out.println(str2025-13-01T14:30:45 + " -> ERROR: Invalid format");74}
    output2025-13-01T14:30:45 -> ERROR: Invalid format
  7. catch (DateTimeParseException e)

    pass 2 of 2
    71    System.out.println(str + " -> " + dt);72} catch (DateTimeParseException ejava.time.format.DateTimeParseException: Text 'not-a-datetime' could not be parsed at index 0) {73    System.out.println(strnot-a-datetime + " -> ERROR: Invalid format");74}
    outputnot-a-datetime -> ERROR: Invalid format
  8. System.out.println(" Safe parse:");

    77// Safe parse helper78System.out.println("\nSafe parse:");79System.out.println(safeParseDateTime("2025-01-29T14:30:45"));80System.out.println(safeParseDateTime("invalid"));
    output
    Safe parse:
  9. public static LocalDateTime safeParseDateTime(String str)

    pass 1 of 2
    83public static LocalDateTime safeParseDateTime(String str2025-01-29T14:30:45) {84    try {
  10. try

    pass 1 of 2
    83public static LocalDateTime safeParseDateTime(String str) {84    try {85        return LocalDateTime.parse(str2025-01-29T14:30:45);86    } catch (DateTimeParseException e) {
  11. System.out.println(safeParseDateTime("2025-01-29T14:30:45"));

    78    System.out.println("\nSafe parse:");79    System.out.println(safeParseDateTime("2025-01-29T14:30:45"));80    System.out.println(safeParseDateTime("invalid"));81}
    output2025-01-29T14:30:45
  12. public static LocalDateTime safeParseDateTime(String str)

    pass 2 of 2
    83public static LocalDateTime safeParseDateTime(String strinvalid) {84    try {
  13. try

    pass 2 of 2
    83public static LocalDateTime safeParseDateTime(String str) {84    try {85        return LocalDateTime.parse(strinvalid);86    } catch (DateTimeParseException e) {
  14. catch (DateTimeParseException e)

    85    return LocalDateTime.parse(str);86} catch (DateTimeParseException ejava.time.format.DateTimeParseException: Text 'invalid' could not be parsed at index 0) {87    System.out.println("Invalid datetime: " + strinvalid);88    return null;89}
    outputInvalid datetime: invalid
  15. System.out.println(safeParseDateTime("invalid"));

    79    System.out.println(safeParseDateTime("2025-01-29T14:30:45"));80    System.out.println(safeParseDateTime("invalid"));81}
    outputnull
parsing Converting a string representation back into a date/time object using a matching format pattern.

Locale-Specific Formatting

LocaleFormat.java
Replay: real traced execution (multi-file project)
// 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);
        }
    }

}
  1. dt ← 2025-01-29T14:30:45

    10public static void main(String[] args) {11    LocalDateTime dt→ 2025-01-29T14:30:45 = LocalDateTime.of(2025, 1, 29, 14, 30, 45);12    13    System.out.println("DateTime: " + dt2025-01-29T14:30:45);14    System.out.println();1516    // Different locales17    Locale[] locales = {18        Locale.US,19        Locale.UK,20        Locale.FRANCE,21        Locale.GERMANY,22        Locale.JAPAN23    };2425    System.out.println("Locale-specific dates:");26    for (Locale locale : locales) {
    outputDateTime: 2025-01-29T14:30:45
    Locale-specific dates:
  2. formatter ← Localized(FULL,)

    pass 1 of 5
    25System.out.println("Locale-specific dates:");26for (Locale localeen_US : locales) {27    DateTimeFormatter formatter→ Localized(FULL,) = DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL).withLocale(localeen_US);28    System.out.println(locale.getDisplayName(Locale.US) + ": " + dt.format(formatterLocalized(FULL,)));29}
    outputEnglish (United States): Wednesday, January 29, 2025
    All 5 passes — pass 1 is the card above
    passlocaleformatter
    1en_USLocalized(FULL,)
    2en_GBLocalized(FULL,)
    3fr_FRLocalized(FULL,)
    4de_DELocalized(FULL,)
    5ja_JPLocalized(FULL,)
  3. FormatStyle[] styles = {FormatStyle.FULL, FormatStyle.LONG, FormatStyl…

    31// Different styles32System.out.println("\nDifferent styles (US locale):");33FormatStyle[] styles = {FormatStyle.FULL, FormatStyle.LONG, FormatStyle.MEDIUM, FormatStyle.SHORT};
    output
    Different styles (US locale):
  4. formatter ← Localized(FULL,)

    pass 1 of 4
    35for (FormatStyle styleFULL : styles) {36    DateTimeFormatter formatter→ Localized(FULL,) = DateTimeFormatter.ofLocalizedDate(styleFULL).withLocale(Locale.US);37    System.out.println(styleFULL + ": " + dt.format(formatterLocalized(FULL,)));38}
    outputFULL: Wednesday, January 29, 2025
    All 4 passes — pass 1 is the card above
    passstyleformatter
    1FULLLocalized(FULL,)
    2LONGLocalized(LONG,)
    3MEDIUMLocalized(MEDIUM,)
    4SHORTLocalized(SHORT,)
  5. dtFormatter ← Localized(MEDIUM,MEDIUM), custom ← Text(DayOfWeek)','' 'Text(MonthOfYear)' 'Value(DayOfMonth,2)','' 'Value(YearOfEra,4,19,EXCEEDS_PAD)

    40// Date and time together41System.out.println("\nDate and time (US):");42DateTimeFormatter dtFormatter→ Localized(MEDIUM,MEDIUM) = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM).withLocale(Locale.US);43System.out.println(dt.format(dtFormatterLocalized(MEDIUM,MEDIUM)));4445// Custom pattern with locale46System.out.println("\nCustom with locale:");47DateTimeFormatter custom→ Text(DayOfWeek)','' 'Text(MonthOfYear)' 'Value(DayOfMonth,2)','' 'Value(YearOfEra,4,19,EXCEEDS_PAD) = DateTimeFormatter.ofPattern("EEEE, MMMM dd, yyyy", Locale.US);48System.out.println("US: " + dt.format(customText(DayOfWeek)','' 'Text(MonthOfYear)' 'Value(DayOfMonth,2)','' 'Value(YearOfEra,4,19,EXCEEDS_PAD)));4950DateTimeFormatter customFr→ Text(DayOfWeek)' 'Value(DayOfMonth,2)' 'Text(MonthOfYear)' 'Value(YearOfEra,4,19,EXCEEDS_PAD) = DateTimeFormatter.ofPattern("EEEE dd MMMM yyyy", Locale.FRANCE);51System.out.println("French: " + dt.format(customFrText(DayOfWeek)' 'Value(DayOfMonth,2)' 'Text(MonthOfYear)' 'Value(YearOfEra,4,19,EXCEEDS_PAD)));5253// Month names in different locales54System.out.println("\nMonth names:");55DateTimeFormatter monthFormatter→ Text(MonthOfYear) = DateTimeFormatter.ofPattern("MMMM");56for (Locale locale : new Locale[]{Locale.US, Locale.FRANCE, Locale.GERMANY}) {
    output
    Date and time (US):
    Jan 29, 2025, 2:30:45 PM
    
    Custom with locale:
    US: Wednesday, January 29, 2025
    French: mercredi 29 janvier 2025
    
    Month names:
  6. month ← January

    pass 1 of 3
    55DateTimeFormatter monthFormatter = DateTimeFormatter.ofPattern("MMMM");56for (Locale localeen_US : new Locale[]{Locale.US, Locale.FRANCE, Locale.GERMANY}) {57    String month→ January = dt.format(monthFormatter.withLocale(localeen_US));58    System.out.println(locale.getDisplayLanguage(Locale.US) + ": " + monthJanuary);59}
    outputEnglish: January
    All 3 passes — pass 1 is the card above
    passlocalemonth
    1en_USJanuary
    2fr_FRjanvier
    3de_DEJanuar
  7. dayFormatter ← Text(DayOfWeek)

    61// Day names in different locales62System.out.println("\nDay names:");63DateTimeFormatter dayFormatter→ Text(DayOfWeek) = DateTimeFormatter.ofPattern("EEEE");64for (Locale locale : new Locale[]{Locale.US, Locale.FRANCE, Locale.GERMANY}) {
    output
    Day names:
  8. day ← Wednesday

    pass 1 of 3
    63DateTimeFormatter dayFormatter = DateTimeFormatter.ofPattern("EEEE");64for (Locale localeen_US : new Locale[]{Locale.US, Locale.FRANCE, Locale.GERMANY}) {65    String day→ Wednesday = dt.format(dayFormatter.withLocale(localeen_US));66    System.out.println(locale.getDisplayLanguage(Locale.US) + ": " + dayWednesday);67}
    outputEnglish: Wednesday
    All 3 passes — pass 1 is the card above
    passlocaleday
    1en_USWednesday
    2fr_FRmercredi
    3de_DEMittwoch
  9. ampmFormatter ← Value(ClockHourOfAmPm,2)':'Value(MinuteOfHour,2)' 'Text(AmPmOfDay,SHORT)

    69// AM/PM in different locales70System.out.println("\nAM/PM:");71DateTimeFormatter ampmFormatter→ Value(ClockHourOfAmPm,2)':'Value(MinuteOfHour,2)' 'Text(AmPmOfDay,SHORT) = DateTimeFormatter.ofPattern("hh:mm a");72for (Locale locale : new Locale[]{Locale.US, Locale.UK, Locale.FRANCE}) {
    output
    AM/PM:
  10. time ← 02:30 PM

    pass 1 of 3
    71DateTimeFormatter ampmFormatter = DateTimeFormatter.ofPattern("hh:mm a");72for (Locale localeen_US : new Locale[]{Locale.US, Locale.UK, Locale.FRANCE}) {73    String time→ 02:30 PM = dt.format(ampmFormatter.withLocale(localeen_US));74    System.out.println(locale.getDisplayCountry(Locale.US) + ": " + time02:30 PM);75}
    outputUnited States: 02:30 PM
    All 3 passes — pass 1 is the card above
    passlocaletime
    1en_US02:30 PM
    2en_GB02:30 pm
    3fr_FR02:30 PM
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