Java 8设置全局时间格式化程序

我想将自己的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 

我想要上面打印但是上午/下午所以我制作了自定义格式化程序并打印出时间如下:

 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的配置方法或者什么……

你可以简单地在一个类中声明一个常量:

 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生成器,然后只需@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; 

如果您有多个格式化程序,也可以在上面的链接中给它命名。

让我先解释为什么当你不打电话给格式时,你得到了什么。 在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是最终的,如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(你不能在AOP周围使用单独的Spring的静态方法)来让现在返回这个新对象。