使用DateTimeFormatter解析日期时间字符串

本文将探讨如何使用 java.time.format.DateTimeFormatter 类,将符合特定格式的日期时间字符串解析为 java.time.LocalDateTime 对象。 具体来说,我们将关注 RFC_1123_DATE_TIME 格式,这是一种常见的日期时间表示方式。

在Java 8及更高版本中,java.time 包提供了强大的日期和时间处理功能。DateTimeFormatter 类是该包中的一个关键组件,它允许我们定义日期和时间的格式,并根据这些格式解析和格式化日期时间对象。

对于符合 "EEE, dd MMM yyyy HH:mm:ss Z" (例如 "Mon, 07 Nov 2025 21:00:00 +0100") 格式的日期时间字符串,DateTimeFormatter 提供了一个预定义的常量 RFC_1123_DATE_TIME,可以直接使用它进行解析,而无需手动构建格式化模式。

使用预定义格式化器解析日期时间字符串

以下代码演示了如何使用 DateTimeFormatter.RFC_1123_DATE_TIME 解析日期时间字符串:

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

public class DateTimeParsingExample {

    public static void main(String[] args) {
        String fecha = "Mon, 07 Nov 2025 21:00:00 +0100";
        DateTimeFormatter formato = DateTimeFormatter.RFC_1123_DATE_TIME;
        LocalDateTime fechaHora = LocalDateTime.parse(fecha, formato);

        System.out.println("解析后的日期时间: " + fechaHora);
    }
}

这段代码首先定义了一个日期时间字符串 fecha,然后获取了 DateTimeFormatter.RFC_1123_DATE_TIME 格式化器。 最后,使用 LocalDateTime.parse() 方法将字符串解析为 LocalDateTime 对象。 运行这段代码将输出:

解析后的日期时间: 2025-11-07T21:00

自定义日期时间格式化模式

虽然预定义的格式化器很方便,但在某些情况下,我们需要使用自定义的格式化模式。 例如,如果日期时间字符串的格式与 RFC_1123_DATE_TIME 格式略有不同,则需要自定义模式。

以下是一些常用的日期时间格式化模式字符:

  • E: 星期几 (例如 "Mon", "Tue")
  • d: 月份中的日期 (例如 "01", "02")
  • M: 月份 (例如 "Jan", "Feb")
  • y: 年份 (例如 "2025")
  • H: 小时 (24小时制) (例如 "00", "21")
  • m: 分钟 (例如 "00", "30")
  • s: 秒 (例如 "00", "59")
  • X: 时区偏移量 (例如 "+0100", "-0800")
  • Z: 时区偏移量 (例如 "+0100", "-0800")

注意事项

  • 确保日期时间字符串的格式与 DateTimeFormatter 使用的格式化模式匹配。 如果格式不匹配,LocalDateTime.parse() 方法将抛出 java.time.format.DateTimeParseException 异常。
  • 在使用自定义格式化模式时,请仔细检查模式字符的大小写和数量。 例如,MM 表示两位数的月份,而 M 表示一位或两位数的月份。
  • RFC_1123_DATE_TIME 格式期望时区偏移量使用 XXXX 格式 (例如 "+0100")。 如果你的日期时间字符串使用不同的时区偏移量格式,则需要使用自定义格式化模式。

总结

DateTimeFormatter 类是 Java 中处理日期和时间字符串的强大工具。 通过使用预定义的格式化器或自定义格式化模式,我们可以轻松地将日期时间字符串解析为 LocalDateTime 对象,并进行进一步的处理。 在使用 DateTimeFormatter 时,请务必确保日期时间字符串的格式与格式化模式匹配,以避免解析错误。