ZetCode

Java DateTimeFormatter

最后修改日期:2024 年 7 月 10 日

在本文中,我们将展示如何使用 DateTimeFormatter 在 Java 中格式化和解析日期时间值。

DateTimeFormatter 类用于格式化和解析现代 Java API 日期时间值。

DateTimeFormatter 包含两个基本方法:formatparse

常用常量

DateTimeFormatter 包含几个常用的格式化常量,例如 BASIC_ISO_DATEISO_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));
}

该程序使用五个常用的格式化常量来格式化当前的日期时间。

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

DateTimeFormatter Instant

Instant 是时间线上的一个瞬时点。 我们使用 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));
}

该程序格式化当前的 Instant 值。

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

DateTimeFormatter FormatStyle

我们可以使用 FormatStyle.SHORTFormatStyle.MEDIUMFormatStyle.LONGFormatStyle.FULL 格式样式来格式化 LocalDate 值。

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

该程序使用四种格式样式来格式化当前的本地日期。

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

DateTimeFormatter.ofPattern

可以使用 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));
}

该程序使用三种自定义格式打印当前的本地日期时间。

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

DateTimeFormatter 本地化自定义格式

下一个示例使用 ofPatternLocale 创建本地化的日期时间格式。

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

该程序以中文、俄语和斯洛伐克语打印当前的本地日期时间。

$ 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

可以使用 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));
}

该程序使用 DateTimeFormatterBuilder 生成一个格式化器。

$ java Main.java
10. júla 2024

DateTimeFormatter parse

parse 方法完全解析文本,生成一个时间对象。

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

该程序解析一个字符串以生成一个 LocalDate 值。

来源

Java DateTimeFormatter - 语言参考

在本文中,我们使用 DateTimeFormatter 来格式化和解析日期时间值。

作者

我的名字是 Jan Bodnar,我是一位充满激情的程序员,拥有丰富的编程经验。 我自 2007 年以来一直在撰写编程文章。 迄今为止,我已经撰写了超过 1,400 篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有Java教程