LocalDate和DateTimeFormatter的Java 6替代品

时间:2018-05-15 14:45:14

标签: java java-8 java-time java-6 date-parsing

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

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

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

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

4 个答案:

答案 0 :(得分:7)

有三个主要选择:

  • 使用Java 6 DateSimpleDateFormat
    优点:适用于所有未来的Java版本。没有第三方图书馆。
    缺点:API存在缺陷,这就是创建Java 8 Time API(JSR-310)的原因。

    import java.text.SimpleDateFormat;
    
    new SimpleDateFormat(outputFormat).format(
        new SimpleDateFormat(inputFormat).parse(input));
    
  • 使用Joda-Time
    优点:适用于任何Java版本。
    缺点:不推荐使用,支持Java 8 Time API(JSR-310)。

    import org.joda.time.LocalDate;
    import org.joda.time.format.DateTimeFormat;
    
    LocalDate.parse(input, DateTimeFormat.forPattern(inputFormat))
             .toString(DateTimeFormat.forPattern(outputFormat));
    
  • 使用ThreeTen-Backport (推荐)
    优点:与Java 8 Time 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));
    

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

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

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

答案 1 :(得分:4)

java.time - API有一个backport操作Java 6或7.所以我认为这是最简单的方法,尽可能少的更改。

其他答案也提倡Joda-Time,但主要的缺点是更改格式模式语法,因此不仅仅需要更改import语句或者更换构造函数与工厂方法。

最后(为了完整性),还有我的lib Time4J(v3.x for Java 6),其中包含基于类ChronoFormatter的替代解析/格式引擎(以及等效的{ {1}}代替PlainDate)。

答案 2 :(得分:1)

我想使用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 :(得分:-3)

在vanilla Java 6中,您可以使用日期类型和 SimpleDateFormat 类来解析表示日期的字符串/格式字符串。

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

正如其他答案中所提到的,这两个类都存在问题,因此自Java 8以来它们已被日期/时间API取代。更喜欢其中一个选项或者赌博,但避免在数据库中存储字符串格式的日期。