Änderungen im Datumsformat von Java - schon wieder!

vorhergehende Artikel in: Java
25.02.2018

Ich habe bereits über einen Bug in Java9 berichtet, der mich ziemlich überrascht hat. Wer aber beschreibt meine Überraschung, dass der Bug, der mich beim Umstieg von Java7 auf Java8 bereits angespuckt hat, wieder Speichel gesammelt hat?

Zunächst: ja, ich hätte drauf gefasst sein müssen, schließlich ging es mir beim Umstieg auf Java8 genauso.

Ich erstelle ja die Inhalte meiner Heimatseite im Zwischennetz mittels eines von mir selbst entwickelten und gepflegten statischen CMS. Als ich begann, Java9 zu testen, stellte ich komplett um - damit lief das statische CMS dann auch damit. Ich fand einen Bug in Java9 und wollte eine neue Version der Webseite online stellen.

Wer beschreibt mein Erstaunen als mein CMS - wie beim Umstieg von Java7 auf Java8 - alle Seiten mit neuen Erzeugungsdaten versah obwohl deutlich das originale bereits drin stand. Das Programm konnte das alte Datumsformat nicht mehr parsen und schuld daran war die Umstellung auf Java9. Das Testprogramm, das ich beim Umstieg auf Java8 benutzte, demonstriert das:

public class DateBug extends java.lang.Object
{
	public static void main(java.lang.String[] args) throws java.text.ParseException
	{
		java.lang.String pattern="EEE, dd MMM yyyy H:m:s";
		java.text.DateFormat rssf = new java.text.SimpleDateFormat(
				pattern, java.util.Locale.GERMAN);
		System.out.println("Java Version "+System.getProperty("java.version"));
		System.out.println("SimpleDateFormat pattern; "+pattern);
		java.util.Calendar cal = java.util.Calendar.getInstance();
		cal.set(cal.MONTH, 2);
		System.out.println("Formatted Date: "+rssf.format(cal.getTime()));
	}
}

Dieses Programm mit unterschiedlichen Java-Versionen ausgeführt lieferte folgende Ergebnisse:

Java Version 1.7.0_25
SimpleDateFormat pattern; EEE, dd MMM yyyy H:m:s
Formatted Date: Di., 14 Mrz 2017 19:4:14

für Java7,

Java Version 1.8.0_144
SimpleDateFormat pattern; EEE, dd MMM yyyy H:m:s
Formatted Date: Di, 14 März 2017 19:13:14

für Java8 und

Java Version 9.0.4
SimpleDateFormat pattern; EEE, dd MMM yyyy H:m:s
Formatted Date: Do., 15 März 2018 19:37:33

für Java9.

Man bemerke den Unterschied im Monat. Der Punkt hinter dem abgekürzten Wochentag taucht bei den ungeraden Java-Versionen auf und in den geraden nicht (Bevor mich jemand auf die nicht ausreichende Größe meiner Stichprobe aufmerksam macht - ich verlinke hier gerne meinen liebsten Mathematikerwitz).

Außerdem interessant, dass der Monat in Java9 mit identischem Formatstring plötzlich ausgeschrieben wird. Als ob man in einer funktionierenden Anwendung die GUI ohne jede Notwendigkeit auf JavaFX umstellt - wie ein geschätzter Kollege sagen würde: "Weil ers kann!". Oder - gerade gestern auf GitHub gefunden: Meine neue liebste Commit-Meldung - "Broke the program, but will lead to improvements."

Hat man nun ein Datum mit Java7 erstellt, kann Java8 dieses nicht mehr parsen - erstellte man eines mit Java8, kann man es mit Java9 nicht parsen.

Ich bin mir durchaus bewusst, dass ich wahrscheinlich der einzige bin, der das deutsche Datumsformat benutzt, Daten formatiert und später wieder parst und dazu für die Formatierung des Monats "MMM" nimmt - trotzdem ist das für mich ein Bug und kein Feature!

Und nachdem das zweimal hintereinander passiert ist frage ich mich, ob mich hier jemand verscheißern will!

Diese Mal wollte ich das nicht auf sich beruhen lassen und habe einen Bug dafür eingestellt. Der ist momentan "under Review" - internal review ID: 9052724.

Aktualisierung vom 25. Februar 2018

Der Bug wurde unter JDK-8198491 in die Java Bug Database aufgenommen. Er wurde auch sofort als gelöst markiert - ich habe dadurch aber wieder etwas über Java gelernt - dadurch hat sich die ganze Aktion für mich definitiv gelohnt:

In JDK 9, the default locale data uses data derived from the Unicode Consortium's Common Locale Data Repository (CLDR). So there are changes with respect to some locales and hence this exception. To use the JRE locale with JDK 9 set java.locale.providers to a value with COMPAT ahead of CLDR. :

-Djava.locale.providers=COMPAT, CLDR

Artikel, die hierher verlinken

Java9 Umstellung

16.04.2018

Die Umstellung auf Java9 in meinen eigenen Projekten ist abgeschlossen

Batik und Java9 Modulsystem = ☠

25.02.2018

Nachdem ich bereits über den einen oder anderen Bug in Verbindung mit Java 9 berichtet habe, habe ich bereits wieder einen gefunden - und wieder verbunden mit der ach so tollen Erfindung des Java-Modulsystems

Alle Artikel rss Wochenübersicht Monatsübersicht Github Repositories Gitlab Repositories Mastodon Über mich home xmpp


Vor 5 Jahren hier im Blog

  • Brian May, Kerry Ellis & Vittorio Grigolo: Bohemian Rhapsody

    19.05.2019

    Eine andere Sicht auf den schönen Queen-Klassiker

    Weiterlesen...

Neueste Artikel

  • sQLshell, SQLite und Redis - oh my!

    Ich habe in letzter Zeit hin und wieder mit der sQLshell und SQLite herumgespielt - Neulich wurde ich gefragt, ob die sQLshell eigentlich auch Redis kann...

    Weiterlesen...
  • bad-certificates Version 3.0.0

    Das bereits vorgestellte Projekt zur automatisierten Erzeugung von Zertifikaten mit allen möglichen Fehlern wurde um eine weitere Kategorie von Zertifikaten erweitert

    Weiterlesen...
  • Erste Vor-Version eines Gis-Plugin für die sQLshell

    Wie bereits in einem früheren Artikel erwähnt plane ich, demnächst ein Plugin für die sQLshell anzubieten, das eine Visualisierung von Daten mit räumlichem Bezug im Stil eines Geoinformationssystems erlaubt.

    Weiterlesen...

Manche nennen es Blog, manche Web-Seite - ich schreibe hier hin und wieder über meine Erlebnisse, Rückschläge und Erleuchtungen bei meinen Hobbies.

Wer daran teilhaben und eventuell sogar davon profitieren möchte, muß damit leben, daß ich hin und wieder kleine Ausflüge in Bereiche mache, die nichts mit IT, Administration oder Softwareentwicklung zu tun haben.

Ich wünsche allen Lesern viel Spaß und hin und wieder einen kleinen AHA!-Effekt...

PS: Meine öffentlichen GitHub-Repositories findet man hier - meine öffentlichen GitLab-Repositories finden sich dagegen hier.