<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Zeit für Java &#187; Time4J</title>
	<atom:link href="http://www.menodata.de/blog/category/time4j/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.menodata.de/blog</link>
	<description>Meno Hochschilds Java-Blog</description>
	<lastBuildDate>Mon, 25 May 2015 13:30:43 +0000</lastBuildDate>
	<language>de-DE</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4.1</generator>
		<item>
		<title>Fortschritte in Time4J</title>
		<link>http://www.menodata.de/blog/2015/05/25/fortschritte-in-time4j/</link>
		<comments>http://www.menodata.de/blog/2015/05/25/fortschritte-in-time4j/#comments</comments>
		<pubDate>Mon, 25 May 2015 13:30:43 +0000</pubDate>
		<dc:creator>Meno Hochschild</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Time4J]]></category>

		<guid isPermaLink="false">http://www.menodata.de/blog/?p=245</guid>
		<description><![CDATA[Eine lange Zeit ist seit meinem letzten Blog-Artikel verstrichen, weil ich all meine freie Zeit in das Time4J-Projekt gesteckt habe. Viele Versionen sind veröffentlicht worden. Heute habe ich die Versionen 3.1 und 4.0 veröffentlicht. Die Versionslinien 1.x und 2.x sind &#8230; <a href="http://www.menodata.de/blog/2015/05/25/fortschritte-in-time4j/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Eine lange Zeit ist seit meinem letzten Blog-Artikel verstrichen, weil ich all meine freie Zeit in das <a href="https://github.com/MenoData/Time4J" target="_blank">Time4J-Projekt</a> gesteckt habe. Viele Versionen sind veröffentlicht worden. Heute habe ich die <a href="http://search.maven.org/#search|ga|1|time4j" target="_blank">Versionen 3.1 und 4.0</a> veröffentlicht.</p>
<p>Die Versionslinien 1.x und 2.x sind mittlerweile veraltet und als Experimentierphase zu werten, weil sich das Design der Version 1.0 aus guten Gründen doch inkompatibel ändern musste.</p>
<ul>
<li>Die Versionsline 1.x hatte keine saubere Trennung zwischen lokalen und globalen Typen.</li>
<li>Die Versionslinie 2.x war in ihrem Kern für Android einfach zu groß.</li>
</ul>
<p>Aber die Versionslinien 3.x für Java 6+7 (und in Zukunft Android) sowie die neue Versionsline 4.x für Java 8 sind jetzt ausgereift und stabil. <strong>Inkompatible Änderungen habe ich in Zukunft nicht mehr vor. </strong>Das ist nun in Stein gemeißelt.</p>
<p>Die neue Version v4.0, so kann man mit gutem Recht feststellen, hat nun endgültig die so vielgerühmte Joda-Time-Bibliothek und auch die in Java-8 eingebaute Zeitbibliothek (JSR-310) überholt, was die Anzahl und Qualität der unterstützten Features angeht. Lediglich einige Kalendersysteme fehlen im Vergleich.</p>
<p>Was fehlt noch? Gibt es ein Problem? Tja, Time4J ist noch so gut wie unbekannt, auch weil ich so gut wie nicht die Werbetrommel gerührt habe, sondern nur auf die Entwicklung fokussiert war. Und ein Marketing-Profi bin ich nicht, muß ich offenherzig bekennen. Trotzdem bekenne ich mich weiterhin zur Pflege und Weiterentwicklung dieser jetzt schon formidablen Bibliothek. Es gibt noch viel zu tun. Die Bibliothek ist bei weitem nicht fertig. Ich habe noch sehr viele Ideen. Allerdings werde ich jetzt die (extreme) Entwicklungsgeschwindigkeit verlangsamen, weil meine Gesundheit und meine Familie nicht weiter vernachlässigt werden dürfen.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.menodata.de/blog/2015/05/25/fortschritte-in-time4j/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Unterstützung für Apache Maven in Time4J</title>
		<link>http://www.menodata.de/blog/2014/08/14/unterstutzung-fur-apache-maven-in-time4j/</link>
		<comments>http://www.menodata.de/blog/2014/08/14/unterstutzung-fur-apache-maven-in-time4j/#comments</comments>
		<pubDate>Thu, 14 Aug 2014 03:58:10 +0000</pubDate>
		<dc:creator>Meno Hochschild</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Time4J]]></category>

		<guid isPermaLink="false">http://www.menodata.de/blog/?p=239</guid>
		<description><![CDATA[Die neue Version v1.1 von Time4J bietet nun direkte Unterstützung für Apache Maven dank der integrierten pom-Dateien, auch ist die neue Version endlich im Maven Central Repository verfügbar. Der Funktionsumfang ist im Vergleich zu v1.0 praktisch gleich geblieben. Für alle &#8230; <a href="http://www.menodata.de/blog/2014/08/14/unterstutzung-fur-apache-maven-in-time4j/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Die neue Version v1.1 von Time4J bietet nun direkte Unterstützung für Apache Maven dank der integrierten pom-Dateien, auch ist die neue Version endlich im Maven Central Repository verfügbar. Der Funktionsumfang ist im Vergleich zu v1.0 praktisch gleich geblieben.</p>
<p>Für alle Anwender, die NICHT Maven als build-Tool verwenden, gibt es den folgenden Link zum Download:</p>
<p><a href="https://github.com/MenoData/Time4J/releases/tag/v1.1">https://github.com/MenoData/Time4J/releases/tag/v1.1</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.menodata.de/blog/2014/08/14/unterstutzung-fur-apache-maven-in-time4j/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Time4J-Kern fertig</title>
		<link>http://www.menodata.de/blog/2014/07/04/time4j-kern-fertig/</link>
		<comments>http://www.menodata.de/blog/2014/07/04/time4j-kern-fertig/#comments</comments>
		<pubDate>Fri, 04 Jul 2014 04:10:05 +0000</pubDate>
		<dc:creator>Meno Hochschild</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Time4J]]></category>

		<guid isPermaLink="false">http://www.menodata.de/blog/?p=230</guid>
		<description><![CDATA[Gerade ist die neue Version v1.0 von Time4J in ihrem Kern fertig. Sie ist unter der Lizenz LGPLv2.1 erhältlich (die gleiche Lizenz wie sie Wildfly (früher JBoss) verwendet). Diese Version ist nunmehr produktionsreif erhältlich. Folgender Link kann für den Download &#8230; <a href="http://www.menodata.de/blog/2014/07/04/time4j-kern-fertig/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Gerade ist die neue Version v1.0 von Time4J in ihrem Kern fertig. Sie ist unter der Lizenz <strong>LGPLv2.1</strong> erhältlich (die gleiche Lizenz wie sie Wildfly (früher JBoss) verwendet). Diese Version ist nunmehr produktionsreif erhältlich. Folgender Link kann für den Download verwendet werden:</p>
<p><a href="https://github.com/MenoData/Time4J/releases/tag/v1.0" target="_blank">Release v1.0</a></p>
<p>Und die nächsten Aufgaben warten schon: Intervalle und Formatierung von Zeitdauern (<a href="https://github.com/MenoData/Time4J/issues/milestones" target="_blank">milestone M3</a>).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.menodata.de/blog/2014/07/04/time4j-kern-fertig/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Time4J endlich erschienen</title>
		<link>http://www.menodata.de/blog/2014/02/17/time4j-endlich-erschienen/</link>
		<comments>http://www.menodata.de/blog/2014/02/17/time4j-endlich-erschienen/#comments</comments>
		<pubDate>Mon, 17 Feb 2014 01:03:49 +0000</pubDate>
		<dc:creator>Meno Hochschild</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Time4J]]></category>

		<guid isPermaLink="false">http://www.menodata.de/blog/?p=216</guid>
		<description><![CDATA[Lange angekündigt, ist meine Java-Datums-und Zeitbibliothek Time4J in der Version v0.1-alpha veröffentlicht worden. Wo? Zu finden auf: http://github.com/MenoData/Time4J Zweieinhalb Jahre harter Arbeit liegen da hinter mir, und meine Familie hat schon einige Male ganz schön geseufzt. Aber ich denke, das &#8230; <a href="http://www.menodata.de/blog/2014/02/17/time4j-endlich-erschienen/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Lange angekündigt, ist meine Java-Datums-und Zeitbibliothek Time4J in der Version v0.1-alpha veröffentlicht worden. Wo? Zu finden auf:</p>
<p><a href="http://github.com/MenoData/Time4J">http://github.com/MenoData/Time4J</a></p>
<p>Zweieinhalb Jahre harter Arbeit liegen da hinter mir, und meine Familie hat schon einige Male ganz schön geseufzt. Aber ich denke, das Ergebnis kann sich sehen lassen, auch wenn natürlich dieser Erstversion noch einige Features fehlen. Und nach der Arbeit ist bekanntlich vor der Arbeit. Die Entwicklung bleibt nicht stehen, sondern geht selbstverständlich weiter. Schwerpunkt des nächsten Release v0.2-alpha werden die Umstellung der Dokumentation auf Englisch, extra Tutorials und mehr Zeitzonen-Features sein.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.menodata.de/blog/2014/02/17/time4j-endlich-erschienen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kleine Verzögerung</title>
		<link>http://www.menodata.de/blog/2013/09/18/kleine-verzogerung/</link>
		<comments>http://www.menodata.de/blog/2013/09/18/kleine-verzogerung/#comments</comments>
		<pubDate>Wed, 18 Sep 2013 05:36:10 +0000</pubDate>
		<dc:creator>Meno Hochschild</dc:creator>
				<category><![CDATA[Time4J]]></category>

		<guid isPermaLink="false">http://www.menodata.de/blog/?p=162</guid>
		<description><![CDATA[Seit einiger Zeit nichts mehr geschrieben, die Sommerpause war lang. Das heißt aber nicht, daß ich untätig war. Einige extreme private Umstände in meinem Umfeld (neues Baby, Krankenhausaufenthalte etc.) haben dazu geführt, daß ein Ein-Mann-Projekt wie Time4J nicht mit den &#8230; <a href="http://www.menodata.de/blog/2013/09/18/kleine-verzogerung/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Seit einiger Zeit nichts mehr geschrieben, die Sommerpause war lang. Das heißt aber nicht, daß ich untätig war. Einige extreme private Umstände in meinem Umfeld (neues Baby, Krankenhausaufenthalte etc.) haben dazu geführt, daß ein Ein-Mann-Projekt wie Time4J nicht mit den gleichen hohen Anstrengungen wie vorher weitergeführt werden konnte. Konkret bedeutet das erst mal nur, daß das erste Release nicht wie angekündigt im Spätsommer/Herbst erscheinen kann. Ich hoffe aber immer noch, daß es spätestens im Dezember klappt, wenn auch nur mit einem an Features reduzierten Release.</p>
<p>An der Tatsache, daß ich leider nur relativ wenig Zeit in das Projekt investieren kann, wird sich wegen meiner privaten Situation so schnell nichts ändern. Darum werde ich auch demnächst wenig bis gar nichts bloggen, sondern lieber meine wenige vorhandene Zeit in Time4J stecken so gut es geht. Eine Ausnahme werde ich aber machen, wenn der &#8220;Public Draft Review&#8221; (PDR) des JSR 310 erscheint. Die neue Zeitbibliothek des JDK von Oracle und Stephen Colebourne steht kurz vor dem Abschluß. Dazu werde ich eine ausführliche Stellungnahme im Blog abgeben, fest versprochen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.menodata.de/blog/2013/09/18/kleine-verzogerung/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Probleme mit Java-Generics</title>
		<link>http://www.menodata.de/blog/2013/02/03/probleme-mit-java-generics/</link>
		<comments>http://www.menodata.de/blog/2013/02/03/probleme-mit-java-generics/#comments</comments>
		<pubDate>Sat, 02 Feb 2013 22:11:43 +0000</pubDate>
		<dc:creator>Meno Hochschild</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Time4J]]></category>

		<guid isPermaLink="false">http://www.menodata.de/blog/?p=144</guid>
		<description><![CDATA[Eine recht interessante Kurz-Debatte zur Anwendung von Java-Generics findet sich im Issue-Tracker des JSR-310-Projekts. Folgende generische Methodendefinition liefert leider keine Compile-Time-Type-Safety, wie Stephen Colebourne richtig festgestellt hat: &#60;R extends Temporal&#62; long between(R dateTime1, R dateTime2); Zitat von S. Colebourne: I&#8217;ve &#8230; <a href="http://www.menodata.de/blog/2013/02/03/probleme-mit-java-generics/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Eine recht interessante <a href="https://github.com/ThreeTen/threeten/issues/163" target="_blank">Kurz-Debatte</a> zur Anwendung von Java-Generics findet sich im Issue-Tracker des JSR-310-Projekts. Folgende generische Methodendefinition liefert leider keine Compile-Time-Type-Safety, wie Stephen Colebourne richtig festgestellt hat:</p>
<p style="padding-left: 30px;"><code>&lt;R extends Temporal&gt; long between(R dateTime1, R dateTime2)</code>;</p>
<p><span id="more-144"></span>Zitat von S. Colebourne:</p>
<blockquote><p>I&#8217;ve examined the generics on the temporal classes twice now. It isn&#8217;t possible to enhance their generics without making a terrible mess. Because Java doesn&#8217;t have the Self-type generic, or the notional of parameter self-type generic where the class is final, and because LocalDate extends ChronoLocalDate, it is more or less impossible to go further than we have.</p></blockquote>
<p>Und das Fazit des JSR-Teams inklusive von R. Riggs von Oracle lautet dann, die Generics sang- und klanglos zu entfernen. Mehr oder weniger unmöglich. <strong>Wirklich?</strong></p>
<p>Nehmen wir noch einmal die Klasse Temporal unter die Lupe. Wir finden da nicht-generische Methoden wie:</p>
<table summary="Method Summary table, listing methods, and an explanation" border="0" cellspacing="0" cellpadding="3">
<tbody>
<tr id="i2">
<td><code>long</code></td>
<td><code><strong><a href="http://cr.openjdk.java.net/%7Erriggs/threeten/threeten-javadoc-b75/java/time/temporal/Temporal.html#periodUntil%28java.time.temporal.Temporal,%20java.time.temporal.TemporalUnit%29">periodUntil</a></strong>(<a title="interface in java.time.temporal" href="http://cr.openjdk.java.net/%7Erriggs/threeten/threeten-javadoc-b75/java/time/temporal/Temporal.html">Temporal</a> endTemporal, <a title="interface in java.time.temporal" href="http://cr.openjdk.java.net/%7Erriggs/threeten/threeten-javadoc-b75/java/time/temporal/TemporalUnit.html">TemporalUnit</a> unit)</code></p>
<div>Calculates the period between this temporal and another temporal in terms of the specified unit.</div>
</td>
</tr>
<tr id="i3">
<td><code><a title="interface in java.time.temporal" href="http://cr.openjdk.java.net/%7Erriggs/threeten/threeten-javadoc-b75/java/time/temporal/Temporal.html">Temporal</a></code></td>
<td><code><strong><a href="http://cr.openjdk.java.net/%7Erriggs/threeten/threeten-javadoc-b75/java/time/temporal/Temporal.html#plus%28long,%20java.time.temporal.TemporalUnit%29">plus</a></strong>(long amountToAdd, <a title="interface in java.time.temporal" href="http://cr.openjdk.java.net/%7Erriggs/threeten/threeten-javadoc-b75/java/time/temporal/TemporalUnit.html">TemporalUnit</a> unit)</code></p>
<div>Returns an object of the same type as this object with the specified period added.</div>
</td>
</tr>
</tbody>
</table>
<p>Sehr unbefriedigend daran ist natürlich, daß null Typsicherheit gegeben ist. Zu einem Temporal-Date könnte eine Implementierung in der plus()-Methode theoretisch eine Sekunde addieren und einen Zeitstempel als Kombination von Datum und Zeit zurückgeben. Es ist so wirklich beliebig. Der Compiler ist mit allem zufrieden. Nur in der Spezifikation der plus()-Methode steht dann, daß Implementierungen den gleichen Typ zurückgeben müssen. Sicherlich hat dieser offensichtliche Design-Mangel Stephen Colebourne dazu bewegt, noch mal einen Blick daraufzuwerfen &#8211; leider ohne Ergebnis. Und wenn doch, würde es auch nichts mehr nützen, weil zu einer konsequenten aber sehr zeit- und arbeitsintensiven Umstellung des JSR-Projekts auf Generics schon längst keine Zeit mehr vorhanden ist. Die Debatte, die Colebourne losgetreten hat, ist wenige Tage vor dem Java-8-Meilenstein M6!!!, also recht sinnfrei.</p>
<p>Ich habe mich im Gegensatz zum JSR-Team von Anfang an mit dem Problem der Generics in einer Datums- und Zeitbibliothek beschäftigt, nämlich in Vorstudien ab Oktober 2011. Und das Ergebnis meiner Überlegungen ist schon im Frühstadium in die Entwicklung von Time4J ab Herbst 2012 eingeflossen. So sieht das Ergebnis aus:</p>
<p>Ich habe eine abstrakte Klasse mit dem Namen <strong>TimePoint</strong>. Diese Klasse referenziert sich selbst über Generics. Konkrete Subklassen müssen final sein und die Generics auflösen, nämlich in einem ersten vereinfachten Schritt so:</p>
<p style="padding-left: 30px;">abstract class TimePoint&lt;T extends TimePoint&lt;T&gt;&gt; {&#8230;}</p>
<p style="padding-left: 30px;">final class IsoTime extends TimePoint&lt;IsoTime&gt; {}</p>
<p style="padding-left: 30px;">final class IsoDate extends TimePoint&lt;IsoDate&gt; {}</p>
<p>Und dann betrachten wir erneut die oben erwähnte between()-Methode, was bei der Eingabe verschiedener Argumenttypen für T passiert (z.B. IsoDate und IsoTime):</p>
<p style="padding-left: 30px;"><code>&lt;T extends TimePoint&gt; long between(<code>T start, T end</code>)</code>; // Compiler sagt: OK</p>
<p style="padding-left: 30px;"><code>&lt;T extends TimePoint<strong>&lt;T&gt;</strong>&gt; long between(T start, T end)</code>; // Compiler verweigert</p>
<p>Entscheidend für die Compile-Time-Type-Safety ist also das &#8220;self-referencing-generics&#8221;-Feature. Freilich ist dieses Feature nicht neu. Es wird schon seit Java 5 in der bekannten Klasse java.lang.Enum angewandt. Und auch für Stephen Colebourne ist es nicht unbekannt, wurde er mehrfach in seinem eigenen Blog darauf hingewiesen, zuletzt 2012. Aber offenbar WILL er das Feature nicht einbauen und erklärt es für &#8220;terrible mess&#8221;, zu deutsch etwa: &#8220;furchtbar umständlich&#8221;.</p>
<p>Ich bin hingegen der Meinung, daß Generics hier das Problem der Typsicherheit zur Kompilierzeit entscheidend lösen können, während gleichzeitig konkrete Anwendungen, die die finalen Subklassen IsoDate und IsoTime nutzen, davon quasi nichts mitbekommen, weil die selbstreferenzierenden Typparameter auf dieser Ebene gar nicht mehr vorkommen. Es sind somit auch keine störenden Typparameter oder gar Wildcards im Anwendungscode notwendig. Also wirklich nur Vorteile auf der ganzen Linie.</p>
<p>Verschweigen will ich allerdings nicht, daß zwar Anwendungen ungemein von Java-Generics in dieser Form profitieren, aber der Framework-Bau auf dieser Basis hoch anspruchsvoll ist. So ist meine tatsächliche Lösung in Time4J noch etwas komplizierter. Zum Beispiel ist die obige Signatur der Klasse TimePoint wie folgt erweitert worden:</p>
<p style="padding-left: 30px;">abstract class TimePoint&lt;U, T extends TimePoint&lt;U, T&gt;&gt; {&#8230;}</p>
<p>Hier steht der Typparameter U für das zugehörige System von Zeiteinheiten. Es hat sich nämlich gezeigt, daß es in einer gegebenen Chronologie ausgedrückt durch eine TimePoint-Klasse nicht sinnvoll ist, beliebige Zeiteinheiten zuzulassen. Ein Zeitpunkt ist inhärent über seine Koordinaten (als Zustandsattribute modelliert) auch mit einer Zeitachse verbunden, auf der der Zeitpunkt liegt. Die zulässigen Zeiteinheiten, die letztlich Längenabstände auf der Zeitachse messen, müssen zu den Koordinaten passen. Z.B. ist eine Zeitarithmetik basierend auf Sekunden in einer reinen Datumsklasse unsinnig. Also auch hier über den zweiten Typparameter U eine wichtige Maßnahme für mehr Typsicherheit. Die finalen Subklassen IsoDate und IsoTime lösen auch diesen U-Typparameter konkret auf.</p>
<p>Der Framework-Bau mit dann zwei Typparametern U und T ist natürlich nicht einfach und erfordert großen Aufwand. Tatsächlich ein Aufwand im Bereich des low-level-API, mit dem ich schon weit mehr als 1 Jahr beschäftigt (und jetzt praktisch fertig) bin. Wahrscheinlich hat das JSR-310-Team diesen Aufwand schon 2007 nicht leisten können und wollen. Jetzt ist es erst recht viel zu spät für den JSR, diesen Weg im Design einzuschlagen. Ich fürchte auch, sie haben noch nicht einmal wirklich den Weg gesehen. Schade!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.menodata.de/blog/2013/02/03/probleme-mit-java-generics/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Projekt Time4J-Mini veröffentlicht</title>
		<link>http://www.menodata.de/blog/2013/01/30/projekt-time4j-mini-veroffentlicht/</link>
		<comments>http://www.menodata.de/blog/2013/01/30/projekt-time4j-mini-veroffentlicht/#comments</comments>
		<pubDate>Tue, 29 Jan 2013 23:26:14 +0000</pubDate>
		<dc:creator>Meno Hochschild</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Time4J]]></category>

		<guid isPermaLink="false">http://www.menodata.de/blog/?p=140</guid>
		<description><![CDATA[Ein erstes Java-Projekt als Miniatur-Variante des noch kommenden Time4J-APIs ist ab sofort öffentlich und als Open Source unter der GPL-v3-Lizenz nutzbar. Weitere Einzelheiten und Links zum Herunterladen siehe den obigen Projektreiter.]]></description>
			<content:encoded><![CDATA[<p>Ein erstes Java-Projekt als Miniatur-Variante des noch kommenden Time4J-APIs ist ab sofort öffentlich und als Open Source unter der GPL-v3-Lizenz nutzbar. Weitere Einzelheiten und Links zum Herunterladen <a href="http://www.menodata.de/blog/time4j-mini/">siehe den obigen Projektreiter</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.menodata.de/blog/2013/01/30/projekt-time4j-mini-veroffentlicht/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Endet der Maya-Kalender? Nein, in Time4J wird er weiterleben!</title>
		<link>http://www.menodata.de/blog/2012/12/20/endet-der-maya-kalender-nein-in-time4j-wird-er-weiterleben/</link>
		<comments>http://www.menodata.de/blog/2012/12/20/endet-der-maya-kalender-nein-in-time4j-wird-er-weiterleben/#comments</comments>
		<pubDate>Thu, 20 Dec 2012 10:06:55 +0000</pubDate>
		<dc:creator>Meno Hochschild</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Time4J]]></category>

		<guid isPermaLink="false">http://www.menodata.de/blog/?p=133</guid>
		<description><![CDATA[Pünktlich zum von Esoterikern postulierten Weltuntergangstag am 21. Dezember 2012 endet die von den meisten Wissenschaftlern und Archäologen angewandte sogenannte Lange Zählung des Maya-Kalenders (englisch: long count). Ja, eventuell sehen das manche Esoteriker das sogar als &#8220;Beweis&#8221; für ihre Weltuntergangsphantasie &#8230; <a href="http://www.menodata.de/blog/2012/12/20/endet-der-maya-kalender-nein-in-time4j-wird-er-weiterleben/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Pünktlich zum von Esoterikern postulierten Weltuntergangstag am 21. Dezember 2012 endet die von den meisten Wissenschaftlern und Archäologen angewandte sogenannte Lange Zählung des Maya-Kalenders (englisch: long count). Ja, eventuell sehen das manche Esoteriker das sogar als &#8220;Beweis&#8221; für ihre Weltuntergangsphantasie an. Wie auch immer, die Maya haben nach neueren archäologischen Funden wohl schon darüber hinausgezählt. Interessant hierzu auch das <a href="http://www.dradio.de/dkultur/sendungen/thema/1952175/">Interview</a> mit dem deutschen Archäologen und Maya-Forscher Nikolai Grube. Also keine Angst vor dem Weltuntergang.</p>
<p>Ist damit der alte Maya-Kalender beendet? Im historischen Sinne nach dem Kriterium des alltäglichen Gebrauchs ist er es schon längst. Aber ich habe beschlossen, ihn ein winziges Stück weit für historisch Interessierte weiterleben zu lassen. In meinem Projekt Time4J &#8211; eine neue Datums- und Zeitbibliothek geschrieben in der Programmiersprache Java &#8211; wird es auch eine <strong>MayanDate</strong>-Klasse geben. Kalendarische Grundlage wird <a href="http://en.wikipedia.org/wiki/Maya_calendar">der englischsprachige Eintrag zum Maya-Kalender in Wikipedia</a> sein. Wie dort schön zu sehen ist, sind die kalendarischen Algorithmen des Kalenders erstaunlich einfach, deutlich einfacher jedenfalls als im modernen ISO-8601-Kalender. Um so mehr erstaunt es, daß z.B. eine so renommierte Bibliothek wie Joda Time so eine Komponente nicht hat. Nicht einmal eine externe Bibliothek mit dem Maya-Kalender basierend auf Joda Time scheint es da zu geben. Das einzige, was ich im Internet gefunden habe, ist ein kleines Applet zum Thema. Da bietet Perl mehr! Höchste Zeit, diesem Mangel von Java abzuhelfen.</p>
<p>Wann ist damit real zu rechnen? Insgeheim hatte ich gehofft, daß Time4J pünktlich zum Weltuntergangstag seine Geburt erleben sollte. Aber manchmal dauern Wunder ein wenig länger, gerade bei der Komplexität der anderen weit wichtigeren Kalendersysteme, die auch zu implementieren sind. Ich glaube eher an Spätsommer 2013. Also noch ein wenig Geduld bitte, verehrte Leser.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.menodata.de/blog/2012/12/20/endet-der-maya-kalender-nein-in-time4j-wird-er-weiterleben/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Name für eine Datumsklasse</title>
		<link>http://www.menodata.de/blog/2012/12/16/name-fur-eine-datumsklasse/</link>
		<comments>http://www.menodata.de/blog/2012/12/16/name-fur-eine-datumsklasse/#comments</comments>
		<pubDate>Sun, 16 Dec 2012 04:46:42 +0000</pubDate>
		<dc:creator>Meno Hochschild</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Time4J]]></category>

		<guid isPermaLink="false">http://www.menodata.de/blog/?p=127</guid>
		<description><![CDATA[Der am natürlichsten wirkende Name &#8220;Date&#8221; ist bereits seit Java 1.0 durch die Klasse java.util.Date besetzt. Damit in Java-Programmen keine Namenskonflikte entstehen, die nur durch umständliche Zusatzangaben von Paket-Qualifizierern aufgelöst werden können, besteht die Notwendigkeit, wenigstens für die elementarsten und &#8230; <a href="http://www.menodata.de/blog/2012/12/16/name-fur-eine-datumsklasse/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Der am natürlichsten wirkende Name &#8220;Date&#8221; ist bereits seit Java 1.0 durch die Klasse java.util.Date besetzt. Damit in Java-Programmen keine Namenskonflikte entstehen, die nur durch umständliche Zusatzangaben von Paket-Qualifizierern aufgelöst werden können, besteht die Notwendigkeit, wenigstens für die elementarsten und häufig verwendeten Klassen einer JDK-Erweiterung oder externen Bibliothek Namen zu wählen, die noch nicht vergeben sind.<span id="more-127"></span></p>
<p>Die Frage steht also im Raum, wie ein alternativer Name eines neuen Datumstyps aussehen kann. Der JSR 310 (<a href="http://threeten.github.com/threeten/dev/javadoc/" target="_blank">Threeten</a>) hat sich schon vor langer Zeit auf den Namen &#8220;LocalDate&#8221; festgelegt. Das hat eine unglaublich lebhafte <a href="http://sourceforge.net/mailarchive/forum.php?forum_name=threeten-develop&amp;max_rows=25&amp;style=ultimate&amp;viewmonth=201212" target="_blank">Debatte</a> mit sage und schreibe schon 169 Beiträgen alleine in der ersten Hälfte des Dezember 2012 ausgelöst, in der viele Teilnehmer sich geradezu vehement gegen den vorgesehenen Namen &#8220;LocalDate&#8221; wehren. Meiner Meinung nach mit dem berechtigten Argument, daß der Name suggeriert, daß ein lokaler Zeitzonenbezug vorliegt. Tatsächlich liegt überhaupt kein Zeitzonenbezug vor. Aber Stephen Colebourne, der Projektleiter von Threeten/JSR 310 <a href="http://sourceforge.net/mailarchive/forum.php?thread_name=CACzrW9A8KR2FvDNKO6Y3koTZt7T1wG1v0W825KLZGm4zK7eoeA%40mail.gmail.com&amp;forum_name=threeten-develop" target="_blank">hat unmißverständlich klar gemacht</a>, an seiner Namensgebung nicht rütteln zu wollen.</p>
<p>Interessant finde ich in dem Zusammenhang, daß offensichtlich viele zwar abstrakt den JSR 310 immer gut fanden, jedoch, wenn es konkret wird und die Einführung von Threeten in das JDK vor der Tür steht, erst dann sich etwas näher mit dem Thema und möglichen Schwächen beschäftigen. So mancher erschrickt dann beim Blick auf die Details, aber für größere Änderungen an Threeten ist es schon seit geraumer Zeit viel zu spät!</p>
<p>Wie wird sich mein Projekt Time4J hierzu verhalten? Nun, als externe Bibliothek ist Time4J grundsätzlich nicht in der Position, unabhängig von Threeten einen Namen zu wählen. Also kommt (beim derzeitigen Stand) &#8220;LocalDate&#8221; für Time4J nicht in Frage. Davon abgesehen halte ich den Namen wie auch die anderen Kritiker mit dem gleichen Argument für zumindest unglücklich gewählt, weil der Name doch Raum für Verwirrung läßt.</p>
<p>In der Debatte wie auch schon etliche Jahre früher (ich glaube 2009/2010), wurden u.a. auch die Namen &#8220;IsoDate&#8221; und &#8220;PlainDate&#8221; vorgeschlagen. Ich denke, das sind die beiden besten Alternativen zum bereits vergebenen Namen &#8220;Date&#8221;. Eventuell ist auch noch &#8220;StdDate&#8221; eine Wahl. Im Moment optiere ich für &#8220;IsoDate&#8221; aus folgenden Gründen: Erstens ist der Name immer noch relativ kurz. Zweitens erinnert das Präfix &#8220;Iso&#8221; an die strikte Konformität mit dem ISO-8601-Standard. Drittens sorgt es für eine gute Abgrenzung zu alternativen Datumstypen wie MayanDate, PersianDate, HebrewDate etc. Viertens läßt das &#8220;Iso&#8221;-Präfix keine Assoziationen zu Zeitzonen aufkommen.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.menodata.de/blog/2012/12/16/name-fur-eine-datumsklasse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hat ein ISO-8601-Datum eine (gregorianische) Ära?</title>
		<link>http://www.menodata.de/blog/2012/11/09/hat-ein-iso-8601-datum-eine-gregorianische-ara/</link>
		<comments>http://www.menodata.de/blog/2012/11/09/hat-ein-iso-8601-datum-eine-gregorianische-ara/#comments</comments>
		<pubDate>Fri, 09 Nov 2012 12:33:50 +0000</pubDate>
		<dc:creator>Meno Hochschild</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Time4J]]></category>

		<guid isPermaLink="false">http://www.menodata.de/blog/?p=117</guid>
		<description><![CDATA[Streng genommen lautet die Antwort kurz und bündig: NEIN! Der christliche gregorianische Kalender und der daraus abgeleitete ISO-Kalender sind im Hinblick auf Äras und Jahreszahlen nicht gleich. Was sind die Folgen für Java-Datumsbibliotheken? Im entsprechenden ISO-Dokument findet sich nirgends ein &#8230; <a href="http://www.menodata.de/blog/2012/11/09/hat-ein-iso-8601-datum-eine-gregorianische-ara/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><strong>Streng genommen lautet die Antwort kurz und bündig: NEIN!</strong></p>
<p>Der christliche gregorianische Kalender und der daraus abgeleitete ISO-Kalender sind im Hinblick auf Äras und Jahreszahlen nicht gleich. Was sind die Folgen für Java-Datumsbibliotheken?<span id="more-117"></span></p>
<p>Im entsprechenden ISO-Dokument findet sich nirgends ein Hinweis auf eine Ära wie AD = Anno Domini (auf Deutsch: nach Christi Geburt). Im Gegenteil werden ein Jahr 0 und auch negative Jahre ausdrücklich zugelassen, unter der Maßgabe, daß sich die Partner im Datenaustausch darauf geeinigt haben, die Schalttagsregeln des gregorianischen Kalenders proleptisch, also auch rückwirkend vor der Einführung des Kalenders 1582 anzuwenden. Ein Jahr 0 oder gar negative Jahre gibt es im christlichen Kalender nicht. Stattdessen gibt es nur positive Jahreszahlen UND eine Ära-Angabe wie v.Chr. oder n.Chr. Das ISO-Jahr 0 entspricht dann 1 v.Chr., das ISO-Jahr -1 dem historischen Jahr 2 v.Chr. und so weiter. Soweit, so klar.</p>
<p>Hieraus könnte der Schluß gezogen werden, daß eine Java-Implementierung eines ISO-konformen Datums keine Ära-Angaben unterstützen sollte. Das würde dem nicht-religiösen weltlichen Charakter der ISO-Definition am besten entsprechen. Für den christlichen Kalender könnte dann ein separater Datumstyp mit Ära-Unterstützung implementiert werden. Leider sieht die Verwendungspraxis anders aus. Erstens gibt es diejenigen Menschen, die aus religiösen Motiven noch das Ära-Konzept verwenden möchten (ausdrücklicher Bezug auf den postulierten Zeitpunkt von Jesu Geburt). Zweitens und noch wichtiger läßt sich die Tatsache nicht leugnen, daß der christliche Kalender vor Einführung des ISO-Standards in der Praxis die Norm war und daher viele historische Zeitangaben herumschwirren, die mindestens beim Formatieren und Parsen eine Unterstützung des Ära-Konzepts brauchen.</p>
<p>Im Zusammenhang mit historischen Datumsangaben gibt es noch eine Besonderheit: Je nach Land wurde der gregorianische Kalender zu verschiedenen Zeitpunkten eingeführt, oft als Ablösung des julianischen Kalenders (mit durch 4 teilbaren Schaltjahren von Cäsar eingeführt). Zum jeweiligen Umstellungszeitpunkt wurde zwar die Wochentagsregelung beibehalten, aber es verschwanden mehrere Tage. In Italien folgte bekanntlich auf Donnerstag, den 4.Oktober 1582 (julianisch) der Freitag mit dem gregorianischen Datum 15. Oktober 1582. In England erfolgte die Umstellung 1752 (da sogar mit einem 11-Tage-Sprung). Und so weiter&#8230; Zuletzt erfolgte 1949 in China die Umstellung auf den gregorianischen Kalender. Es ist unschwer zu sehen, daß ein ISO-Datum wie &#8220;1582-10-09&#8243; im historischen Kontext nicht als &#8220;9. Oktober 1582 n.Chr.&#8221; formatiert werden darf, sondern vielmehr als &#8220;30. September 1582 n.Chr.&#8221; formatiert werden muß. Mit anderen Worten: Sobald in der Darstellung eine Ära auftaucht, muß das historisch korrekte Datum verwendet werden, nicht das ISO-Datum, wenn es sich um ein Datum vor der Einführung des gregorianischen Kalenders handelt.</p>
<p><strong>Wie löst Java das Dilemma zwischen der weltlichen ISO-Definition und dem tatsächlichen religiösen oder historischen Gebrauch?</strong></p>
<p title="class in java.util">Das JDK mit der Klasse <a href="http://www.docjar.com/docs/api/java/util/GregorianCalendar.html" target="_blank">GregorianCalendar</a> definiert überhaupt keinen ISO-Typ. Somit ist das beschriebene Dilemma nicht vorhanden (aber zu einem hohen Preis). Diese Klasse ist ein Hybrid aus julianischem und gregorianischem Kalender und bietet über die Methode &#8220;public void <strong>setGregorianChange</strong>(Date date)&#8221; die Möglichkeit an, den Umstellungszeitpunkt individuell zu setzen. Allerdings gibt es keine Möglichkeit, das auch länderspezifisch zu tun. Ähnlich verhalten sich das Unicode-Konsortium und die IBM-Bibliothek ICU4J. In den Unicode-Ressourcen fehlt ein echter ISO-Bezug. Stattdessen wird so getan, als ob ISO auch eine gregorianische Ära kennen würde. Eine Differenzierung zwischen ISO und christlichem oder historischem Kalender fehlt. Entsprechend ist auf den ersten Blick nicht von vornherein klar, ob eine Datumsangabe julianisch oder per ISO-Norm gemeint ist. Sehr verwirrend für Anwender!</p>
<p title="class in java.util">Joda-Time definiert anders als das JDK einen eigenen Typ namens <a href="http://joda-time.sourceforge.net/api-release/src-html/org/joda/time/chrono/GJChronology.html#line.74" target="_blank">GJChronology</a>. Das ist schon viel besser, da hier im Verwendungskontext klar ist, was Datumsangaben bedeuten. Einen kleinen Wermutstropfen gibt es aber noch: Die Joda-Klasse ISOChronology kennt trotzdem eine Ära. Dies mag zwar auf den ersten Blick diejenigen freuen, die eine Ära in der Darstellung sehen möchten, aber das geschieht zum Preis von historisch evtl. falschen Datumsangaben. Gefährlich, auch wenn die Joda-Dokumentation diesen Mangel klar darstellt und von der Verwendung im historischen Kontext abrät. Auch ist eine länderspezifische Konfiguration des Umstellungszeitpunkts nicht möglich.</p>
<p title="class in java.util">Was macht Threeten (JSR 310)? Noch gibt es kein HistoricDate. Aber ein solcher Datumstyp ist angedacht und wird nach den neuesten Meldungen (Issue-Tracker auf GitHub) wohl erst für Java 9 realisiert werden. Im Prinzip ist es das gleiche Verfahren wie in Joda&#8230; Und auch die LocalDate-Klasse von Threeten, die als ISO-Datum deklariert wird, kennt eine Ära (Nachteile siehe Joda).</p>
<p title="class in java.util"><strong>Welchen Weg wird  mein ProjektTime4J einschlagen? Einen dritten Weg. </strong></p>
<p title="class in java.util">1. Es wird keinen separaten historischen Datumstyp geben (=&gt; einfacheres API).</p>
<p title="class in java.util">2. Die Klasse IsoDate wird an und für sich keine Ära kennen. Sie wird auch keinen gregorianischen Umstellungszeitpunkt verwalten, sondern nur von Jahr, Monat und Tag im proleptischen gregorianischen Kalender (ISO-Kontext) abhängig sein.</p>
<p title="class in java.util">3. IsoDate wird eine lokale Erweiterung definieren, über die ein Anwender separat neben dem eigentlichen ISO-Datum ein historisches Datumsmodell abhängig vom Land erzeugen kann. Anschließend kann mit Hilfe des historischen Datumsmodells eine beliebige historisch korrekte Ausgabe des ISO-Datums erfolgen.</p>
<p title="class in java.util">Dieses Verfahren bietet folgende Vorteile:</p>
<ul>
<li>Die meisten Verwender eines ISO-Datums brauchen sich nicht um Äras zu kümmern (und tun es auch nicht). Die IsoDate-Klasse hat einen klar weltlichen Charakter passend zum modernen Gebrauch.</li>
<li>Christlich-religiös motivierte Menschen und Historiker werden trotzdem bedient, denn sobald sie in der Formatierung eines IsoDate-Objekts nach einer Ära fragen, erfolgt automatisch im Hintergrund die Erzeugung des passenden historischen Datumsmodells und die Umstellung auf eine historisch korrekte Ausgabe.</li>
<li>Auch kann in der Formatierung für den gregorianischen Umstellungszeitpunkt eine Ländereinstellung berücksichtigt werden, die für die Sprachausgabe der Textelemente sowieso notwendig ist.</li>
<li>Und zu guter Letzt kann die natürliche Ordnung von IsoDate rein zeitlich UND konsistent mit equals() bleiben, so daß einer Verwendung von IsoDate als Schlüssel in einer java.util.SortedMap oder in einem java.util.SortedSet nichts entgegensteht. Denn der gregorianische Umstellungszeitpunkt (englisch: cut-over) wird als Zustand nicht in IsoDate, sondern in einem separaten Objekt verwaltet. Die JDK-Klasse GregorianCalendar oder die Joda-GJChronology haben notwendig diesen Zustand intern und können deshalb entweder nicht mit einer java.util.TreeMap kooperieren oder definieren eine Sortierung, die nicht nur zeitlich ist!</li>
</ul>
<p>Time4J beschreitet also gänzlich neue Pfade auch auf diesem Gebiet.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.menodata.de/blog/2012/11/09/hat-ein-iso-8601-datum-eine-gregorianische-ara/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
