在 Java 中将一些特定的日期格式化程序定义为枚举的成员

Define a few specific date formatters as members of an enum in Java

我需要跟踪一些格式(DateTimeFormatter 对象)以便在我的应用中重复使用。

➥ 如何使用 Java 枚举来表示这些格式化程序对象?

tl;博士

是的。

FormatDateOnly.DD_MM_YYYY.getFormatter()

详情

是的,您可以轻松地在枚举中存储一些 DateTimeFormatter 对象。

圆滑的 enum facility in Java 非常强大和灵活。

基本上,Java 中的枚举几乎是一个普通的 Java class。你的枚举可以有成员变量来在内部存储对象。您的枚举可以有一个构造函数,您可以将参数传递给这些构造函数。您可以在枚举上定义方法。

让我们在这个例子中将这 3 个特征放在一起 class,FormatDateOnly enum class.

我们在这个枚举中定义了 3 个对象,分别命名为 DD_MM_YYYYYYYY_MM_DDMM_DD_YYYY。在构造每个时,我们分配一个 DateTimeFormatter 对象保存在这个枚举中。因为 java.time classes (tutorial) are immutable and designed to be thread-safe,我们可以保存单个实例以供跨线程重用。枚举在 [=72= 中的工作方式] 是当我们的 class FormatDateOnly 第一次加载时,我们的三个构造函数中的每一个都被调用来为每个名称分配一个实例。

我们还传递了一个字符串用作每个枚举的显示名称。我们在 toString override 方法中看到它的使用。

package work.basil.example;

import java.time.format.DateTimeFormatter;

public enum FormatDateOnly
{
    DD_MM_YYYY( DateTimeFormatter.ofPattern( "dd.MM.uuuu" ) , "DD.MM.YYYY" ),
    YYYY_MM_DD( DateTimeFormatter.ofPattern( "uuuu.MM.dd" ) , "YYYY.MM.DD" ),
    MM_DD_YYYY( DateTimeFormatter.ofPattern( "MM.dd.uuuu" ) , "MM.DD.YYYY" );

    private DateTimeFormatter formatter;
    private String displayName;

    FormatDateOnly ( DateTimeFormatter formatter , String displayName )
    {
        this.formatter = formatter;
        this.displayName = displayName;
    }

    @Override
    public String toString ( )
    {
        return "LocalDateFormat{" +
                "displayName='" + this.displayName + '\'' +
                '}';
    }

    public DateTimeFormatter getFormatter ( )
    {
        return this.formatter;
    }

    public String getDisplayName ( )
    {
        return this.displayName;
    }
}

要使用这些枚举,我们引用所需的枚举对象,然后调用 getter 方法来检索存储在该枚举对象中的 DateTimeFormatter

LocalDate localDate = LocalDate.of( 2020 , Month.JANUARY , 23 );

String output1 = localDate.format( FormatDateOnly.DD_MM_YYYY.getFormatter() );
String output2 = localDate.format( FormatDateOnly.MM_DD_YYYY.getFormatter() );
String output3 = localDate.format( FormatDateOnly.YYYY_MM_DD.getFormatter() );
  • 第一部分FormatDateOnly.DD_MM_YYYY指的是三个预先存在的对象之一(在class加载时实例化)。
  • 第二部分,.getFormatter() 调用特定枚举对象的 getter 方法,以检索传递给枚举构造函数的现有 DateTimeFormatter 对象。

转储到控制台。 运行 在 Java 13.

System.out.println( "localDate.toString() = " + localDate );
System.out.println( "output1 = " + output1 );
System.out.println( "output2 = " + output2 );
System.out.println( "output3 = " + output3 );

localDate.toString() = 2020-01-23

output1 = 23.01.2020

output2 = 01.23.2020

output3 = 2020.01.23


顺便说一句,我不一定推荐这种安排。通常,最好让 java.time automatically localize when generating text representing a date-time object. Specify a FormatStyle 表示您想要结果字符串的长度或缩写。指定一个 Locale 以确定本地化所需的人类语言和文化规范。

Locale locale = Locale.CANADA_FRENCH ;
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDate( FormatStyle.SHORT ).withLocale( locale ) ;
String output = localDate.format( formatter ) ;

20-01-23

除了格式化之外,同样的方法可以用于解析

import java.text.SimpleDateFormat;

public enum StandardDateParser {
    YYYY_MM_DD(new SimpleDateFormat("yyyy-MM-dd"), "yyyy-MM-dd"),
    YYYYMMDD(new SimpleDateFormat("yyyyMMdd"), "yyyyMMdd"),
    YYYY_MM_DD_HH_MM_SS(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"), "yyyy-MM-dd HH:mm:ss"),
    YYYY_MM_DDTHH_MM_SSZ(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"), "yyyy-MM-dd'T'HH:mm:ssZ");

    SimpleDateFormat parser;
    private String displayName;

    StandardDateParser(SimpleDateFormat parser, String displayName) {
        this.parser = parser;
        this.displayName = displayName;
    }

    @Override
    public String toString() {
        return displayName;
    }

    public SimpleDateFormat getParser() {
        return this.parser;
    }

    public String getDisplayName() {
        return this.displayName;
    }
}

使用:

SimpleDateFormat parser = StandardDateParser.YYYY_MM_DDTHH_MM_SSZ.getParser();
Date date;
try {
    date = parser.parse(INPUT_STRING)
} catch (ParseException e) {
    // your fall back code
}