簡體   English   中英

Java 8設置全局時間格式器

[英]Java 8 Setting global time formatters

我想將自己的DateTimeFormatter設置為全局格式化程序。 當我執行以下行時:

ZonedDateTime.now();

我得到:

2016-03-30T08:58:54.180-06:00[America/Chicago]

如果我這樣做:

ZonedDateTime.now().format(DateTimeFormatter.RFC_1123_DATE_TIME)

我得到:

Wed, 30 Mar 2016 9:00:06 -0600

我想要上面打印的但帶有am / pm的內容,所以我制作了自定義格式器,並打印了以下時間:

DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss a Z");

ZonedDateTime.now().format(FORMATTER);

這給了我:

Wed, 30 Mar 2016 9:00:06 AM -0600

但是我在各處都使用此.now()方法進行記錄,並且我不想在代碼中的任何地方定義格式化程序。 有沒有一種方法可以將格式化程序配置為調用.now()方法時使用的默認格式? 我在想像spring bean配置方法之類的.....

您可以簡單地在類中聲明一個常量:

class UtilsOrWhatever {
  public static final DateTimeFormater RFC_1123_DATE_TIME_AM_PM = DateTimeFormatter.ofPattern("EEE, dd MMM yyyy hh:mm:ss a Z");
}

並簡單地在您的代碼中使用:

ZonedDateTime.now().format(RFC_1123_DATE_TIME_AM_PM); //needs a static import

另外,使用純Java EE 7,您可以使用@Produces創建DateTimeFormatter Producer ,然后簡單地@Inject

import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.inject.Produces;

@ApplicationScoped
public class RfcFormatterProducer {
  @Produces
  private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("EEE, dd MMM yyyy hh:mm:ss a Z");
}

在您的代碼中:

@Inject DateTimeFormatter rfc;

如果您有多個格式化程序,也可以在上面的鏈接中給它一個名稱。

首先讓我解釋一下為什么不調用格式時會得到什么。 的toString正在呼吁ZonedDateTime這反過來又調用了toString上DateTime和偏移,這LOCALDATE的和本地時間調用的toString。 這些toString不使用格式化程序,因此,即使您可以指定“默認”格式化程序,在將ZonedDateTime隱式轉換為字符串時也不會調用該格式化程序。

有許多方法可以使生成格式化的字符串更加容易。 一種方法是在所有日志語句中換出的實用程序類。 我不一定建議以下內容,但它最符合您的要求:

public class MyAwesomeUtility {
    private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss a Z");

    public static String getFormattedZonedDateTime() {
        return ZonedDateTime.now().format(FORMATTER);
    }
}

以下不是選項,因為ZonedDateTime指出ZonedDateTime是最終的。 無論如何都不要把它留在這里。

如果您確實想執行問題中的要求,即覆蓋now方法以返回一個對象,該對象將在調用toString時給出指定的格式,則您必須執行以下操作(注意:這是一個反義詞) (請不要這樣做):

public class DefaultFormattedZonedDateTime extends ZonedDateTime {
    private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss a Z");
    @Overwrite
    public String toString() {
        this.format(FORMATTER);
    }
}

然后,由於now ZonedDateTime是靜態的,並且仍然返回ZonedDateTime,因此您將不得不使用AspectJ(您不能僅使用spring圍繞AOP使用靜態方法)現在要返回此新對象。

暫無
暫無

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

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