Java 8 Einstellen globaler Zeitformatierer

8

Ich möchte meinen eigenen DateTimeFormatter als globalen Formatierer setzen. Wenn ich die folgende Zeile mache:

%Vor%

Ich bekomme:

%Vor%

Wenn ich das tue:

%Vor%

Ich bekomme:

%Vor%

Ich möchte, was oben gedruckt ist, aber mit am / pm, also habe ich meinen eigenen Formatierer gemacht und die Zeit wie folgt ausgedruckt:

%Vor%

Was gab mir:

%Vor%

Aber ich benutze diese Methode .now() überall für die Protokollierung und möchte den Formatierer nicht überall im Code definieren. Gibt es eine Möglichkeit, den Formatierer als Standardformat für den Aufruf der .now() -Methode zu konfigurieren? Ich denke da an die Frühlingsbohnen-Konfigurationsmethode oder sowas .....

    
Richard 30.03.2016, 14:06
quelle

2 Antworten

5

Sie könnten einfach eine Konstante in einer Klasse deklarieren:

%Vor%

und einfach in deinem Code verwenden:

%Vor%

Alternativ können Sie mit reinem Java EE 7 einen DateTimeFormatter-Producer mit @Produces und dann einfach mit @Inject it.

%Vor%

In Ihrem Code:

%Vor%

Sie können auch einen Namen wie oben im Link angeben, wenn Sie mehrere Formatierer haben.

    
assylias 30.03.2016, 14:21
quelle
0

Lassen Sie mich zuerst erklären, warum Sie bekommen, was Sie bekommen, wenn Sie nicht das Format nennen. Die toString wird in der Funktion "ZonedDateTime" aufgerufen, die wiederum toString bei DateTime und Offset aufruft, wodurch toString in LocalDate und LocalTime aufgerufen wird. Diese toStrings verwenden KEINE Formatter. Selbst wenn Sie einen "Standard" -Formatierer angeben könnten, würde er nicht aufgerufen werden, wenn Sie eine ZoneDateTime implizit in eine Zeichenkette konvertieren.

Es gibt viele Möglichkeiten, diese formatierte Zeichenfolge einfacher zu erstellen. Eine Möglichkeit wäre eine Dienstprogrammklasse, die Sie in allen Ihren Protokollanweisungen austauschen würden. Ich schlage nicht unbedingt Folgendes vor, aber es passt am besten zu dem, was Sie fragen:

%Vor%

Folgendes ist keine Option, da ZonedDateTime endgültig ist, wie von @assylias angegeben. Das hier auf jeden Fall lassen.

Wenn Sie wirklich das tun wollten, was Sie in der Frage gefragt haben, die die Methode now überschreibt, um ein Objekt zurückzugeben, das beim Aufruf von toString ein angegebenes Format hätte, müssten Sie Folgendes tun (HINWEIS: DIES IST EIN ANTIPATTERN. TUN SIE NICHT TATSÄCHLICH):

%Vor%

Dann, da now auf "ZonedDateTime" statisch ist und immer noch "ZonedDateTime" zurückgibt, müssten Sie AspectJ verwenden (Sie können nicht um AOP herum eine statische Methode mit Feder alleine), um stattdessen dieses neue Objekt zurückgeben zu lassen.

    
Daniel Moses 30.03.2016 15:00
quelle