Java LocalDate 和 DateTimeFormatter 的 6 个备选方案

Java 6 alternatives for LocalDate and DateTimeFormatter

在 Java 8 项目中,我可以这样解析日期:

LocalDate.parse(
    newDateString, 
    DateTimeFormatter.ofPattern(expectedDateFormat) 
)
.format(
    DateTimeFormatter.ofPattern(expectedDBDateFormat)
);

我的问题是我有一个 Java 6 项目,LocalDateDateTimeFormatter 没有为 Java 6 定义。

如何解析我的 Java 6 项目中的日期?

在 vanilla Java 6 中,您可以使用 Date 类型和 SimpleDateFormat class 来解析 string/format 代表日期的字符串。

SimpleDateFormat parser = new SimpleDateFormat(expectedDateFormat);
Date date = parser.parse(input);
SimpleDateFormat formatter = new SimpleDateFormat(expectedDBDateFormat);
String formattedDate = formatter.format(date);

如其他答案中所述,两个 classes 都有它们的问题,因此自 Java 以来它们已被 Date/Time API 取代 8. 更喜欢其中之一选项或更好但避免在数据库中存储字符串格式的日期。

我想使用 Joda time,您只需对代码进行一些更改,您的代码应该像这样:

LocalDate.parse(
     newDateString, DateTimeFormat.forPattern(expectedDateFormat)
).toString(DateTimeFormat.forPattern(expectedDBDateFormat));

进口

导入应该是:

import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormat;

而不是:

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

方法名称

如果您注意到有一些小的变化:

In Java 8 Time                            In Joda Time 
ofPattern(String pattern)           =>    forPattern(String pattern)   
format(DateTimeFormatter format)    =>    toString(DateTimeFormat format)

主要有3个选择:

  • 使用ThreeTen-Backport(推荐)
    优势:与 Java 8 次 API (JSR-310) 基本相同 API。迁移到 Java 8 非常容易。
    缺点:包名不同,不是JSR-310的完整实现。

    import org.threeten.bp.LocalDate;
    import org.threeten.bp.format.DateTimeFormatter;
    
    LocalDate.parse(input, DateTimeFormatter.ofPattern(inputFormat))
             .format(DateTimeFormatter.ofPattern(outputFormat));
    
  • 使用Joda-Time
    优势:适用于任何 Java 版本。
    缺点:已弃用,支持 Java 8 次 API (JSR-310).

    import org.joda.time.LocalDate;
    import org.joda.time.format.DateTimeFormat;
    
    LocalDate.parse(input, DateTimeFormat.forPattern(inputFormat))
             .toString(DateTimeFormat.forPattern(outputFormat));
    
  • 使用Java6Date and SimpleDateFormat
    优势:将适用于所有未来的 Java 版本。没有第 3 方库。
    缺点:API 有缺陷,这就是 Java 8 Time API (JSR-310) 创建的原因。

    import java.text.SimpleDateFormat;
    
    new SimpleDateFormat(outputFormat).format(
        new SimpleDateFormat(inputFormat).parse(input));
    

为了比较,您的 Java 8 代码是:

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

LocalDate.parse(input, DateTimeFormatter.ofPattern(inputFormat))
         .format(DateTimeFormatter.ofPattern(outputFormat));

java.time-API 有一个 backport 用于 Java 6 或 7。所以我认为这是最简单的方法,更改越少越好。

其他答案也提倡 Joda-Time,但主要缺点是格式模式语法的变化,因此不仅需要更改导入语句,还需要将构造函数替换为工厂方法。

最后(为了完整起见),还有我的库 Time4J(v3.x for Java 6),其中包含基于 [=27 的替代 parse/format-engine =] ChronoFormatter(和等效的 PlainDate 而不是 LocalDate)。