ZetCode

Java DateTimeFormatter

last modified July 10, 2024

In this article we show how to formate and parse datetime values in Java with DateTimeFormatter.

DateTimeFormatter class is used to format and parse modern Java API datetime values.

The DateTimeFormatter contains two basics methods: format and parse.

Common constants

DateTimeFormatter contains several common formatter constants such as BASIC_ISO_DATE or ISO_DATE_TIME.

Main.java
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

void main() {

    var now = LocalDateTime.now();
    DateTimeFormatter dtf1 = DateTimeFormatter.BASIC_ISO_DATE;
    DateTimeFormatter dtf2 = DateTimeFormatter.ISO_DATE;
    DateTimeFormatter dtf3 = DateTimeFormatter.ISO_DATE_TIME;
    DateTimeFormatter dtf4 = DateTimeFormatter.ISO_WEEK_DATE;
    DateTimeFormatter dtf5 = DateTimeFormatter.ISO_ORDINAL_DATE;

    System.out.println(dtf1.format(now));
    System.out.println(dtf2.format(now));
    System.out.println(dtf3.format(now));
    System.out.println(dtf4.format(now));
    System.out.println(dtf5.format(now));
}

The program formats the current datetime with five common formatter constants.

$ java Main.java
20240710
2024-07-10
2024-07-10T15:14:42.4663991
2024-W28-3
2024-192

DateTimeFormatter Instant

The Instant is an instantaneous point on the time-line. We format it with DateTimeFormatter.ISO_INSTANT.

Main.java
import java.time.Instant;
import java.time.format.DateTimeFormatter;

void main() {

    var now = Instant.now();
    var dtf = DateTimeFormatter.ISO_INSTANT;

    System.out.println(dtf.format(now));
}

The program formats the current Instant value.

$ java Main.java
2024-07-10T13:09:28.177132200Z

DateTimeFormatter FormatStyle

We can format LocalDate values with FormatStyle.SHORT, FormatStyle.MEDIUM, FormatStyle.LONG, FormatStyle.FULL format styles.

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

void main() {

    Locale.setDefault(Locale.ENGLISH);

    var now = LocalDate.now();

    var dtf1 = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT);
    var dtf2 = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM);
    var dtf3 = DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG);
    var dtf4 = DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL);

    System.out.println(dtf1.format(now));
    System.out.println(dtf2.format(now));
    System.out.println(dtf3.format(now));
    System.out.println(dtf4.format(now));
}

The program formats the current local date with the four format styles.

$ java Main.java
7/10/24
Jul 10, 2024
July 10, 2024
Wednesday, July 10, 2024

DateTimeFormatter.ofPattern

Custom formats can be defined with DateTimeFormatter.ofPattern.

Main.java
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

void main() {

    Locale.setDefault(Locale.ENGLISH);

    var now = LocalDateTime.now();

    var dtf1 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    var dtf2 = DateTimeFormatter.ofPattern("E, MMM dd yyyy");
    var dtf3 = DateTimeFormatter.ofPattern("EEEE, MMM dd, yyyy HH:mm:ss a");

    System.out.println(dtf1.format(now));
    System.out.println(dtf2.format(now));
    System.out.println(dtf3.format(now));
}

The program prints the current local datetime with three custom formats.

$ java Main.java
2024-07-10
Wed, Jul 10 2024
Wednesday, Jul 10, 2024 15:11:31 PM

DateTimeFormatter localized custom formats

The next example creates localized datetime formats with ofPattern and Locale.

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

void main() {

    var now = LocalDateTime.now();

    String pattern = "EEEE, MMM dd, yyyy HH:mm:ss a";
    var dtf1 = DateTimeFormatter.ofPattern(pattern, Locale.CHINA);
    var dtf2 = DateTimeFormatter.ofPattern(pattern, Locale.of("RU", "ru"));
    var dtf3 = DateTimeFormatter.ofPattern(pattern, Locale.of("SK", "sk"));

    System.out.println(dtf1.format(now));
    System.out.println(dtf2.format(now));
    System.out.println(dtf3.format(now));
}

The program prints the current local datetime in Chinese, Russian, and Slovak.

$ java Main.java
星期三, 7月 10, 2024 15:12:21 下午
среда, июл. 10, 2024 15:12:21 PM
streda, júl 10, 2024 15:12:21 PM

DateTimeFormatterBuilder

Complex formatters can be generated with DateTimeFormatterBuilder.

Main.java
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.temporal.ChronoField;
import java.util.Locale;

void main() {

    var now = LocalDateTime.now();

    DateTimeFormatter dtf = new DateTimeFormatterBuilder()
            .appendText(ChronoField.DAY_OF_MONTH)
            .appendLiteral(". ")
            .appendText(ChronoField.MONTH_OF_YEAR)
            .appendLiteral(" ")
            .appendText(ChronoField.YEAR)
            .parseCaseInsensitive()
            .toFormatter(Locale.of("SK", "sk"));

    System.out.println(dtf.format(now));
}

The program generates a formatter with DateTimeFormatterBuilder.

$ java Main.java
10. júla 2024

DateTimeFormatter parse

The parse method fully parses the text producing a temporal object.

Main.java
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAccessor;

void main() {

    var d = "2023-10-26";

    DateTimeFormatter dtf = DateTimeFormatter.ISO_DATE;
    TemporalAccessor ta = dtf.parse(d);
    var ld = LocalDate.from(ta);
    System.out.println(ld);
}

The program parses a string to produce a LocalDate value.

Source

Java DateTimeFormatter - language reference

In this article we have used DateTimeFormatter to format and parse datetime values.

Author

My name is Jan Bodnar and I am a passionate programmer with many years of programming experience. I have been writing programming articles since 2007. So far, I have written over 1400 articles and 8 e-books. I have over eight years of experience in teaching programming.

List all Java tutorials.