[英]Define a few specific date formatters as members of an enum in Java
是的。
FormatDateOnly.DD_MM_YYYY.getFormatter()
是的,您可以轻松地将一些DateTimeFormatter
对象存储在枚举中。
Java 中的光滑枚举工具非常强大和灵活。
基本上,Java 中的枚举几乎是普通的 Java class。 你的枚举可以有成员变量来在内部存储对象。 你的枚举可以有一个构造函数,你可以将 arguments 传递给这些构造函数。 您可以在枚举上定义方法。
让我们将这 3 个功能放在此示例 class、 FormatDateOnly
枚举 class 中。
我们在这个枚举中定义了 3 个对象,分别命名为DD_MM_YYYY
、 YYYY_MM_DD
和MM_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.