簡體   English   中英

在 Java 中定義一些特定的日期格式化程序作為枚舉的成員

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

我需要跟蹤一些格式( DateTimeFormatter對象)以便在我的應用程序中重復使用。

➥ 如何使用 Java 枚舉來表示這些格式化程序對象?

tl;博士

是的。

FormatDateOnly.DD_MM_YYYY.getFormatter()

細節

是的,您可以輕松地將一些DateTimeFormatter對象存儲在枚舉中。

Java 中的光滑枚舉工具非常強大和靈活。

基本上,Java 中的枚舉幾乎是普通的 Java class。 你的枚舉可以有成員變量來在內部存儲對象。 你的枚舉可以有一個構造函數,你可以將 arguments 傳遞給這些構造函數。 您可以在枚舉上定義方法。

讓我們將這 3 個功能放在此示例 class、 FormatDateOnly枚舉 class 中。

我們在這個枚舉中定義了 3 個對象,分別命名為DD_MM_YYYYYYYY_MM_DDMM_DD_YYYY 在構造每個時,我們分配一個DateTimeFormatter object 保存在這個枚舉中。 因為java.time類(教程)是不可變的並且設計為線程安全的,所以我們可以保存單個實例以供跨線程重用。 枚舉在 Java 中的工作方式是,當我們的 class FormatDateOnly首次加載時,我們的三個構造函數中的每一個都被調用以分配給每個名稱的實例。

我們還傳遞一個字符串作為每個枚舉的顯示名稱。 我們在toString覆蓋方法中看到了這個。

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

要使用這些枚舉,我們參考所需的枚舉 object,然后調用 getter 方法來檢索存儲在該枚舉 object 中的存儲的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()調用特定枚舉 object 上的 getter 方法,以檢索傳遞給枚舉構造函數的現有DateTimeFormatter object。

轉儲到控制台。 在 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

輸出 1 = 23.01.2020

輸出 2 = 01.23.2020

輸出3 = 2020.01.23


順便說一句,我不一定推薦這種安排。 通常,在生成表示日期時間 object 的文本時,最好讓java.time 自動本地化 指定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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM