2016-03-30 56 views
8

我想將我自己的DateTimeFormatter設置爲全局格式化器。當我做了以下行:Java 8設置全球時間格式化器

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 

我想集團的印刷是什麼但上午/下午,所以我做了我的自定義格式化程序並打印出來像這樣的時候:

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()方法時要使用的默認格式?我想如春bean的配置方法什麼的.....

+2

爲什麼不製作FORMATTER靜態單例並在任何地方訪問? – Loc

+0

我不確定我是否理解。 'ZonedDateTime.now()'不依賴於任何格式化程序。如果你想在調用format之後進行格式化,爲什麼不在某個地方使用它呢? – Tunaki

+0

你得到的是toString結果:你在使用println嗎?記錄儀?一個序列化程序?如果你處於toString情況下,沒有太多事情要做。 – pdem

回答

5

你可以簡單地聲明一個常數類:

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創建a 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; 

你也可以給它一個名字像,如果你有幾個格式化上面的鏈接。

+0

但我將不得不在所有我想打印日期時間的類中注入?或沒有? – Richard

+1

是的,你會 - 沒有辦法「覆蓋」格式方法的行爲。定義一個常量'public static final DateTimeFormater RFC_1123_DATE_TIME_AM_PM = ...'也是一個選項。 – assylias

+0

將它定義在某個地方並使其變爲靜態是一個非常好的主意。這使代碼有點乾淨。這不是最理想的解決方案,但理想的解決方案實際上是不可能的,所以這是下一個最好的事情。謝謝! – Richard

0

讓我先解釋一下爲什麼當你不調用格式時你得到了什麼。在ZonedDateTime上調用toString,然後在DateTime和Offset上調用toString,它在LocalDate和LocalTime上調用toString。這些toStrings不使用格式化程序,所以即使您可以指定「默認」格式化程序,也不會在將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最終是由@assylias指出。無論如何,請留下此處。

如果你真的想要做你的問題,這是覆蓋now方法返回一個對象,將給予當toString被稱爲你會做類似下面指定的格式要求(注: :這是一個反模式實際上不做IT):

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的(你可以不在身邊AOP和春天有個靜態方法單獨)讓現在返回這個新對象。

+5

ZonedDateTime是最後的... – assylias

+0

好的。我甚至沒有注意到這一點。我更新了答案,以解釋這不是一個真正的選擇。 –