<?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; Allgemein</title>
	<atom:link href="http://www.menodata.de/blog/category/allgemein/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>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>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>
		<item>
		<title>Über Schalttage des gregorianischen Kalenders</title>
		<link>http://www.menodata.de/blog/2012/11/09/uber-schalttage-des-gregorianischen-kalenders/</link>
		<comments>http://www.menodata.de/blog/2012/11/09/uber-schalttage-des-gregorianischen-kalenders/#comments</comments>
		<pubDate>Fri, 09 Nov 2012 11:53:34 +0000</pubDate>
		<dc:creator>Meno Hochschild</dc:creator>
				<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://www.menodata.de/blog/?p=119</guid>
		<description><![CDATA[Hier ein paar interessante Links: Wikipedia Warum ist die gregorianische Schalttagsregel die beste? Der zweite interessante Link beleuchtet auch die mathematischen Probleme beim Definieren einer geeigneten Schalttagsregelung sehr gut. Die Regel wird zumindest bis in 3200 Jahren richtig sein. Danach &#8230; <a href="http://www.menodata.de/blog/2012/11/09/uber-schalttage-des-gregorianischen-kalenders/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Hier ein paar interessante Links:</p>
<p><a href="http://de.wikipedia.org/wiki/Gregorianischer_Kalender" target="_blank">Wikipedia</a></p>
<p><a href="http://www.brefeld.homepage.t-online.de/schaltjahre.html" target="_blank">Warum ist die gregorianische Schalttagsregel die beste?</a></p>
<p>Der zweite interessante Link beleuchtet auch die mathematischen Probleme beim Definieren einer geeigneten Schalttagsregelung sehr gut. Die Regel wird zumindest bis in 3200 Jahren richtig sein. Danach müßte eine neue Regel her, aber das Problem ist jetzt nicht aktuell.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.menodata.de/blog/2012/11/09/uber-schalttage-des-gregorianischen-kalenders/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Datums- und Zeitbibliotheken in Java &#8211; eine Übersicht</title>
		<link>http://www.menodata.de/blog/2012/09/10/datums-und-zeitbibliotheken-in-java-eine-ubersicht/</link>
		<comments>http://www.menodata.de/blog/2012/09/10/datums-und-zeitbibliotheken-in-java-eine-ubersicht/#comments</comments>
		<pubDate>Mon, 10 Sep 2012 00:10:58 +0000</pubDate>
		<dc:creator>Meno Hochschild</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.menodata.de/blog/?p=45</guid>
		<description><![CDATA[Zuletzt aktualisiert am 27.09.2012! Will ich alle jemals existierenden Ansätze und fertige Bibliotheken auflisten, werde ich sicherlich nicht fertig. Die tatsächliche Anzahl ist auch nicht ermittelbar, weil viele Bibliotheken gar nicht öffentlich verfügbar sind. So gibt es in meiner Firma &#8230; <a href="http://www.menodata.de/blog/2012/09/10/datums-und-zeitbibliotheken-in-java-eine-ubersicht/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><em>Zuletzt aktualisiert am 27.09.2012!</em></p>
<p>Will ich alle jemals existierenden Ansätze und fertige Bibliotheken auflisten, werde ich sicherlich nicht fertig. Die tatsächliche Anzahl ist auch nicht ermittelbar, weil viele Bibliotheken gar nicht öffentlich verfügbar sind. So gibt es in meiner Firma intern eine eigene Datumsklasse und auch eine eigene Uhrzeitklasse, die jeweils als Zustand Jahr, Monat, Tag und Stunde, Minute, Sekunde in Integer-Variablen halten und die Zeitrechnung an das JDK (java.util.GregorianCalendar) delegieren.</p>
<p>Bibliotheken, die lediglich die JDK-Kalenderklassen ummanteln und so einige unschöne Details verstecken und nach außen verbessern, gibt es in Unmengen. Auf diese Art und Weise kann z.B. die vielfach kritisierte Zählung des JDK von Monaten ab 0 (Januar) statt 1 (in der Umhüllung) leicht geändert werden. Eine unsortierte Mini-Auswahl von Open-Source-Bibliotheken dieses Typs sind zum Beispiel:</p>
<ul>
<li><a href="https://developers.google.com/gdata/javadoc/com/google/gdata/data/DateTime" target="_blank">com.google.gdata.data.DateTime</a> (Google Data APIs Client Library (1.41.1))</li>
<li><a href="http://sourceforge.net/projects/joocal/" target="_blank">jOOCal</a> von Lukas Eder</li>
<li><a href="http://calendardate.sourceforge.net/" target="_blank">CalendarDate</a> von Mark McLaren</li>
<li><a href="http://timeandmoney.sourceforge.net/" target="_blank">Time and Money Code Library</a> (inaktiv)</li>
<li>&#8230;</li>
</ul>
<p>Ich möchte daher das Thema etwas anders formulieren: Wieviele eigenständige Bibliotheken gibt es, die alle wesentlichen Aspekte einer Zeitbibliothek selbst behandeln, ohne an das JDK zu delegieren und daher auch <em>stand-alone</em> verwendet werden können? Die folgende Übersicht behandelt genau diese. Es sind überraschend wenige, nämlich (nach meinem Kenntnisstand) nur 6, das JDK eingeschlossen! Wer nach dem Kriterium der Eigenständigkeit noch mehr solche Bibliotheken kennt, möge sie mir gerne mitteilen.</p>
<ul>
<li>JDK &#8211; java.util.Calendar, sun.util.calendar-Paket etc.</li>
<li><a href="http://joda-time.sourceforge.net/" target="_blank">JodaTime</a> von Brian O&#8217;Neill und Stephen Colebourne</li>
<li><a href="http://site.icu-project.org/" target="_blank">ICU-Projekt</a> von IBM</li>
<li><a href="http://sourceforge.net/apps/mediawiki/threeten/index.php?title=ThreeTen" target="_blank">JSR 310 (Threeten)</a> von Stephen Colebourne, Michael N. Santos und Roger Riggs</li>
<li><a href="http://mindprod.com/jgloss/bigdate.html" target="_blank">BigDate</a> von Roedy Green (Quellcode <a href="http://read.pudn.com/downloads120/sourcecode/others/511879/com/mindprod/common11/BigDate.java__.htm" target="_blank">hier</a>)</li>
<li><a href="http://www.date4j.net/" target="_blank">DATE4J</a> von John O&#8217;Hanley</li>
</ul>
<p><span id="more-45"></span>Zu den Bibliotheken BigDate und DATE4J ist allerdings anzumerken, daß sie nicht ganz eigenständig sind, da ihnen eine eigene Zeitzonenimplementierung fehlt und sie hierzu einfach nur die JDK-Klasse java.util.TimeZone verwenden (und das auch nur als Methodenparameter). Durch Weglassen von Merkmalen wird deren API natürlich leicht sehr schlank. Und das JDK selbst bietet zwar nur relativ wenige öffentliche Klassen an, hat aber im Hintergrund noch viele weitere Klassen und Pakete, ist also deutlich gewichtiger als auf den ersten Augenschein hin.</p>
<table border="1" rules="all">
<thead>
<tr>
<th>Merkmale/Eigenschaften</th>
<th> JDK</th>
<th> Joda</th>
<th> ICU</th>
<th> Threeten</th>
<th> BigDate</th>
<th> DATE4J</th>
</tr>
</thead>
<tbody>
<tr>
<td>Anzahl öffentlicher Klassen (mit spi-Paketen)<sup>1)</sup></td>
<td>14</td>
<td>143</td>
<td>61</td>
<td>~75</td>
<td>1</td>
<td>3</td>
</tr>
<tr>
<td>Zugriff auf kalendarische Felder als Integer</td>
<td>☑</td>
<td>☑</td>
<td>☑</td>
<td>☑ <sup>2)</sup></td>
<td>☑</td>
<td>☑ <sup>3)</sup></td>
</tr>
<tr>
<td>Zugriff auf kalendarische Felder als Objekt (z.B. Monat-Enum)</td>
<td>☐</td>
<td>☐ <sup>4)</sup></td>
<td>☐</td>
<td>☑</td>
<td>☐</td>
<td>☐</td>
</tr>
<tr>
<td>Feldbereichsabfrage auf kalendarischen Feldern (Minimum/Maximum)</td>
<td>☑</td>
<td>☑</td>
<td>☑</td>
<td>☑</td>
<td>☐</td>
<td>☐</td>
</tr>
<tr>
<td>&gt;&gt;immutable&lt;&lt; Klassen (Thread-Sicherheit)</td>
<td>☐</td>
<td>☑</td>
<td>☐</td>
<td>☑</td>
<td>☐</td>
<td>☑</td>
</tr>
<tr>
<td>Abfrage der aktuellen Zeit über System.currentTimeMillis() oder now()/today()-Methoden</td>
<td>☑</td>
<td>☑</td>
<td>☑</td>
<td>☑</td>
<td>☑</td>
<td>☑</td>
</tr>
<tr>
<td>Abfrage der aktuellen Zeit über Uhrenabstraktion (injizierbare Clock-Klasse)</td>
<td>☐</td>
<td>☐</td>
<td>☐</td>
<td>☑</td>
<td>☐</td>
<td>☐</td>
</tr>
<tr>
<td>Genauigkeit in Sekunden</td>
<td>Milli</td>
<td>Milli</td>
<td>Milli</td>
<td>Nano</td>
<td>Tag <sup>5)</sup></td>
<td>Nano</td>
</tr>
<tr>
<td>Separate Typen für Datum und Uhrzeit (je Genauigkeitsgrad ein Typ)</td>
<td>☐</td>
<td>☑</td>
<td>☐</td>
<td>☑</td>
<td>☐ <sup>5</sup></td>
<td>☐</td>
</tr>
<tr>
<td>Variable Genauigkeit innerhalb eines Zeitpunkttyps</td>
<td>☐</td>
<td>☐</td>
<td>☐</td>
<td>☐</td>
<td>☐</td>
<td>☑</td>
</tr>
<tr>
<td>Erzeugung von Datum oder Zeit über Konstruktoren</td>
<td>☑</td>
<td>☑</td>
<td>☑</td>
<td>☐</td>
<td>☑</td>
<td>☑</td>
</tr>
<tr>
<td>Erzeugung von Datum oder Zeit über statische Fabrimethoden (ClassName.of(year, month, day) u.ä.)</td>
<td>☐</td>
<td>☐</td>
<td>☐</td>
<td>☑</td>
<td>☐</td>
<td>☑</td>
</tr>
<tr>
<td>Eigene Zeitzonenimplementierung</td>
<td>☑</td>
<td>☑</td>
<td>☑</td>
<td>☑</td>
<td>☐</td>
<td>☐</td>
</tr>
<tr>
<td>Quelle der Zeitzonendaten des JDK pre 8 ({java.home}/lib/zi)</td>
<td>☑</td>
<td>☐</td>
<td>☑</td>
<td>☐</td>
<td>☐</td>
<td>☐</td>
</tr>
<tr>
<td>Eigene Quelle der Zeitzonendaten (TZ-DB)</td>
<td>☐</td>
<td>☑</td>
<td>☑</td>
<td>☑</td>
<td>☐</td>
<td>☐</td>
</tr>
<tr>
<td>Historische Zeitzoneninformationen per UTC-Zeitabfrage</td>
<td>☑</td>
<td>☑</td>
<td>☑</td>
<td>☑</td>
<td>☐</td>
<td>☐</td>
</tr>
<tr>
<td>Historische Zeitzoneninformationen per nextTransition()</td>
<td>☐</td>
<td>☑ <sup>6)</sup></td>
<td>☐</td>
<td>☑ <sup>6)</sup></td>
<td>☐</td>
<td>☐</td>
</tr>
<tr>
<td>Historische Zeitzoneninformationen per Listing/Iterator</td>
<td>☐</td>
<td>☐</td>
<td>☐</td>
<td>☑ <sup>6)</sup></td>
<td>☐</td>
<td>☐</td>
</tr>
<tr>
<td>Erkennung von Zeitzonennamen (z.B. MESZ, PST)</td>
<td>☑</td>
<td>☐</td>
<td>☑</td>
<td>☐</td>
<td>☐</td>
<td>☐</td>
</tr>
<tr>
<td>Erkennung von Windows-Zeitzonen-IDs</td>
<td>☐</td>
<td>☐</td>
<td>☐</td>
<td>☐</td>
<td>☐</td>
<td>☐</td>
</tr>
<tr>
<td>Vordefinierte Konstanten für Standard-Zeitzonen-IDs (z.B. Europe/Paris)</td>
<td>☐</td>
<td>☐</td>
<td>☐</td>
<td>☐</td>
<td>☐</td>
<td>☐</td>
</tr>
<tr>
<td>Konfliktstrategie für Zeitzonenlücken/Überlappungen</td>
<td>☐</td>
<td>☑ <sup>7)</sup></td>
<td>☐</td>
<td>☑</td>
<td>☐</td>
<td>☐</td>
</tr>
<tr>
<td>Abstrakte Jahr/Monat/Tag-Basisklasse</td>
<td>☑</td>
<td>☑</td>
<td>☑</td>
<td>☑ <sup>8)</sup></td>
<td>☐</td>
<td>☐</td>
</tr>
<tr>
<td>Generisches API mit gemeinsamer Basisimplementierung für Chronologien ohne Jahr/Monat/Tag-Struktur</td>
<td>☐</td>
<td>☐</td>
<td>☐</td>
<td>☐ <sup>9)</sup></td>
<td>☐</td>
<td>☐</td>
</tr>
<tr>
<td>Unterstützung des UTC-Standards (Schaltsekunden)</td>
<td>☐</td>
<td>☐</td>
<td>☐</td>
<td>☐ <sup>10)</sup></td>
<td>☐</td>
<td>☐</td>
</tr>
<tr>
<td>Addition einer Dauer (add/plus/minus)</td>
<td>☑</td>
<td>☑</td>
<td>☑</td>
<td>☑</td>
<td>☑ <sup>11)</sup></td>
<td>☑</td>
</tr>
<tr>
<td>Rolloperation (wie Addition, aber ohne Effekt auf größere Zeitfelder)</td>
<td>☑</td>
<td>☐</td>
<td>☑</td>
<td>☐</td>
<td>☐</td>
<td>☐</td>
</tr>
<tr>
<td>Typsicherheit in der Addition/Subtraktion</td>
<td>☐</td>
<td>☑ <sup>12)</sup></td>
<td>☐</td>
<td>☐ <sup>12)</sup></td>
<td>☐</td>
<td>☐</td>
</tr>
<tr>
<td>Konfliktstrategie für Monatsaddition <sup>14)</sup></td>
<td>☐</td>
<td>☐</td>
<td>☐</td>
<td>☐ <sup>15)</sup></td>
<td>☐</td>
<td>☑</td>
</tr>
<tr>
<td>Dauerberechnung zwischen zwei Zeitpunkten wie in MS-DotNet (t1.subtract(t2))</td>
<td>☐</td>
<td>☐</td>
<td>☐</td>
<td>☐</td>
<td>☐</td>
<td>☑ <sup>16)</sup></td>
</tr>
<tr>
<td>Dauerberechnung zwischen zwei Zeitpunkten ausgehend von der Zeiteinheit (units.between(t1, t2))</td>
<td>☐</td>
<td>☑</td>
<td>☐</td>
<td>☑</td>
<td>☐</td>
<td>☐</td>
</tr>
<tr>
<td>Dauer mit mehreren Zeitfeldern erzeugen (z.B. P3M1D)</td>
<td>☑ <sup>17)</sup></td>
<td>☑</td>
<td>☐</td>
<td>☑</td>
<td>☐</td>
<td>☐</td>
</tr>
<tr>
<td>Addition einer Dauer mit mehreren Zeitfeldern zu einem Zeitpunkt</td>
<td>☑ <sup>17)</sup></td>
<td>☑</td>
<td>☐</td>
<td>☑</td>
<td>☐</td>
<td>☐</td>
</tr>
<tr>
<td>XML-konforme Darstellung einer negativen Dauer (z.B. -P2D)</td>
<td>☑</td>
<td>☐</td>
<td>☐</td>
<td>☐</td>
<td>☐</td>
<td>☐</td>
</tr>
<tr>
<td>Intervalle mit je zwei Zeitpunkten (Start/Ende)</td>
<td>☐</td>
<td>☑</td>
<td>☐</td>
<td>☐</td>
<td>☐</td>
<td>☐</td>
</tr>
<tr>
<td>Format-API (eigene konfigurierbare Formatklassen mit CLDR-Unterstützung)</td>
<td>☑</td>
<td>☑</td>
<td>☑</td>
<td>☑</td>
<td>☐</td>
<td>☐</td>
</tr>
<tr>
<td>Zeitformat mit AttributedCharacterIterator <sup>18)</sup></td>
<td>☑</td>
<td>☐</td>
<td>☑ <sup>19)</sup></td>
<td>☐</td>
<td>☐</td>
<td>☐</td>
</tr>
<tr>
<td>Lokalisierte Wocheninformationen (erster Tag der Woche etc.)</td>
<td>☑</td>
<td>☐</td>
<td>☑</td>
<td>☑</td>
<td>☐</td>
<td>☐</td>
</tr>
<tr>
<td>Anzahl der vorinstallierten Kalendersysteme inklusive ISO (I18N)</td>
<td>3</td>
<td>6</td>
<td>10</td>
<td>6 <sup>20)</sup></td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>Tagesnummerierungsverfahren (Stichwort: Modified Julian Date)</td>
<td>☐</td>
<td>☐</td>
<td>☑</td>
<td>☑</td>
<td>☑</td>
<td>☑</td>
</tr>
<tr>
<td>Anpassung von kalendarischen Feldern über set/with-Methoden</td>
<td>☑</td>
<td>☑</td>
<td>☑</td>
<td>☑</td>
<td>☑</td>
<td>☐</td>
</tr>
<tr>
<td>Anpassung von kalendarischen Feldern über Adjuster-Verfahren (z.B. letzter Tag dieses Monats, erster Tag der nächsten Woche etc.)</td>
<td>☐</td>
<td>☐</td>
<td>☐</td>
<td>☑</td>
<td>☐</td>
<td>☐</td>
</tr>
</tbody>
</table>
<p><sup>1)</sup> In den gegebenen Zahlen sind auch spi- und Formatpakete wie java.text.* berücksichtigt. Während eine kleine Zahl für eine leichtere Erlernbarkeit spricht, zeigt sie in der Regel aber auch einen Mangel an Merkmalen und Eigenschaften an. Dieses Kriterium eignet sich somit nicht als Aussage zur Qualität einer Bibliothek.<br />
<sup>2)</sup> Als long-Primitive<br />
<sup>3)</sup> Feldwert als java.lang.Integer-Objekt<br />
<sup>4)</sup> Ersatzweise gibt es generische Property-Klassen.<br />
<sup>5)</sup> Reine Datumsklasse<br />
<sup>6)</sup> Komplexer uneinheitlicher Zugriff, Aufruf mehrerer Methoden für eine vollständige Historie notwendig<br />
<sup>7)</sup> Nur für Überlappungen (Wechsel von Sommerzeit zur Winterzeit, wenn eine lokale Zeitangabe zweimal existiert)<br />
<sup>8)</sup> Das grundlegende Design der Klasse ChronoDate, wie java.util.Calendar auf Jahr/Monat/Tag-Kalender eingeschränkt, ist wenige Monate vor dem vorgesehenen Projektende (Anfang 2013) unter den Projektleitern selbst noch stark umstritten.<br />
<sup>9)</sup> Es gibt zwar ein AdjustableDateTime-Interface, das aber erstens zuwenig bietet und zweitens keine abstrakte Skelettimplementierung hat.<br />
<sup>10)</sup> In einem separat hinzulinkbaren Erweiterungsmodul gibt es eine sogenannte UTC-SLS-Implementierung, die UT1-Zeiten zu TAI konvertieren hilft. Eine echte Unterstützung von UTC selbst inklusive Anzeige/Formatierung und Zeitrechnung gibt es leider nicht.<br />
<sup>11)</sup> Nur Addition von Tagen, nicht Monaten oder Jahren<br />
<sup>12</sup> Änderungen sind über Methoden wie plusMonths(), plusSeconds() etc. typsicher, aber die generische Variante plus(3, MONTHS) in Threeten ist es leider nicht, da sie z.B. auch auf eine reine Uhrzeit angewandt werden kann. Der Compiler läßt es durchgehen, zur Laufzeit fliegt dann eine Ausnahme&#8230; Joda wirft im Kontrast auch zur Laufzeit keine Ausnahme, ignoriert aber die unpassenden Argumente schweigend &#8211; eine fragwürdige Strategie.<br />
<sup>14)</sup> Was ist zum Beispiel [2012-01-30] + [1M]? =&gt; 29. Februar oder 1. März oder Abbruch?<br />
<sup>15)</sup> Dieses Merkmal war zwischenzeitlich implementiert, ist momentan aber wieder entfernt worden.<br />
<sup>16)</sup> Eingeschränkt auf Tage oder Sekunden über die Methoden numDaysFrom() und numSecondsFrom()<br />
<sup>17)</sup> Im JDK möglich über die wenig bekannte Klasse javax.xml.datatype.Duration!<br />
<sup>18)</sup> Notwendig zur Interoperabilität mit der javax.swing-Klasse JFormattedTextField, um dort ein Spinner-Verhalten zu realisieren. Merkwürdigerweise bietet Threeten im Gegensatz zum aktuellen JDK hier nichts, obwohl es als neue Zeitbibliothek für Java 8 vorgesehen ist.<br />
<sup>19)</sup> Hier nicht verifiziert, nur vermutet, da sich ICU strukturell eng an das JDK anlehnt.<br />
<sup>20</sup> Stand von Anfang September 2012. Es sollen noch mindestens drei dazukommen, angeblich auch der (korrekt schwierig zu implementierende) hebräische Kalender.</p>
<h2>Bewertung</h2>
<p>Wie aus der Tabelle ersichtlich, ist keine Datums- und Zeitbibliothek perfekt. Auch ist überraschenderweise die vielgelobte Joda-Bibliothek keineswegs immer besser als das JDK. <strong>Allerdings können Joda und der designierte Joda-Nachfolger Threeten stark mit der Eigenschaft der Immutability punkten.</strong> Mit Sicherheit ist Threeten am ehesten ernst zu nehmen, befindet sich aber immer noch im alpha-Stadium. Weil niemand ernsthaft mit einem instabilen API arbeiten kann, lautet die Empfehlung zur Zeit immer noch <strong>Joda</strong>, obwohl es einige gravierende Schwächen aufweist, die so manchen trotzdem zum JDK haben greifen lassen. Da wären vor allem die fehlende lokalisierte Wochenunterstützung oder der Mangel an Unterstützung für die Swing-Komponente JFormattedTextField zu nennen. Vorsicht ist auch bei negativen Dauern angebracht (betrifft besonders Joda und leider auch Threeten). Und dann gibt es noch einige Features, auf die wohl auch die größten Threeten-Fans vergeblich warten werden, wie z.B. UTC-Schaltsekunden oder ein generisches Kalendersystem-API u.a. für Spieleentwickler. Es kommt nicht von ungefähr, daß die Anzahl der von Joda unterstützten Kalendersysteme relativ klein ist, obwohl Joda schon seit 2004 auf dem Markt ist. Ohne ein einigermaßen leicht zu handhabendes generisches API ist der Bau von neuen Kalendersystemen einfach zu schwer.</p>
<h2>Wie umfangreich darf oder soll eine Datums- und Zeitbibliothek sein?</h2>
<p>Der Umgang mit der Zeit und Kalendern ist komplex. Tatsächlich hat das Thema so viele mögliche Facetten, daß die obige Übersicht das nur unvollständig wiederzugeben vermag. Klar ist, daß die Beschränkung auf weniger als 10 Klassen (sogar nur eine im Fall von BigDate) notwendig mit dem Weglassen von vielen Features einhergehen muß. Insofern ist die Kritik mancher Java-Entwickler an Joda überzogen. Aber ein wahrer Kern steckt schon drin. Der abstrakte Überbau von Joda mit Namen wie AbstractReadableInstantFieldProperty überzeugt nicht wirklich. Threeten bringt hier Verbesserungen, aber zum Beispiel sein öffentliches Zeitzonen-API erscheint leider noch unnötig aufgeblasen. Wie wirbt ein gewisser oxbow_lakes für seine Scala-Bibliothek <a href="https://github.com/oxbowlakes/saturn/wiki" target="_blank">Saturn</a>?</p>
<p>It is a bone-crushingly simple datetime library for those of us that have never needed:</p>
<ul>
<li>non-Gregorian calendars</li>
<li>months that are not Jan-Dec, days of week that are not Mon-Sun etc.</li>
<li>to schedule a meeting on Klingon during the daylight saving era of Dhu&#8217;ruk-ha&#8217;a</li>
</ul>
<p>Erstens ist oxbow_lakes etwas ungerecht, denn seine so simple Bibliothek ist in Wirklichkeit nur eine Hülle um das JDK herum (er verwendet zur Datumsrechnung die äußerst komplexe Klasse java.util.GregorianCalendar). Zweitens gibt es gerade im religiösen Umfeld viele, die andere Kalender brauchen (das sage ich selber als Atheist &#8211; eine Ironie), zum Beispiel hebräische Kalender, die auch etwas taugen (die ICU-Variante ist nicht ganz korrekt oder gar vollständig). Und selbst Klingon-Kalender sind für Spiele-Entwickler nicht abwegig. Zu guter Letzt: Wochentage sind selbstverständlich nicht immer von Montag bis Sonntag, in einem ziemlich wichtigen Land wie den USA fängt die Woche mit dem Sonntag an&#8230;</p>
<p>Was könnte man Menschen noch sagen, die für sie unwichtige Features gar nicht erst sehen wollen? Wichtig ist in Sachen Schlankheit vor allem, daß das Hauptpaket einer Bibliothek überschaubar bleibt und möglichst nicht mehr als 3 Zeit-Klassen (plus wenige Hilfsklassen) anbietet &#8211; eine für Datum, eine für die Uhrzeit und eine für die Kombination. Das JDK und ICU ziehen alles in einer Calendar-Klasse zusammen, was schon zu schlank ist. Andererseits ist Joda hier leider abschreckend mit &gt;50 Klassen. Threeten ist deutlich besser mit 7 Zeit-Klassen, aber man fragt sich schon, was die Daseinsberechtigung einer Klasse wie OffsetDate ausmacht. Der XML-Hintergrund wäre sicherlich in einem xml-Unterpaket besser aufgehoben. Oder warum gibt es zwei Dauer-Implementierungen in Threeten, obwohl die eine Implementierung nur ein Spezialfall der anderen ist? Schlankheit bedeutet auch, daß die Klassen selbst nicht zuviele Methoden anbieten (ZonedDateTime in Threeten hat ca. 100 Methoden).</p>
<h2>Fazit</h2>
<p>Im Moment ist Joda zu empfehlen, in Zukunft Threeten (ab Java 8). Die alten JDK-Klassen werden dann leider immer noch nicht ausgedient haben, denn sie unterstützen einige Features, die auch Threeten nicht bietet. Es gibt also durchaus noch Raum für eine neue ultimative Datums- und Zeitbibliothek&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.menodata.de/blog/2012/09/10/datums-und-zeitbibliotheken-in-java-eine-ubersicht/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Zeitliche Genauigkeit eines SNTP-Java-Clients</title>
		<link>http://www.menodata.de/blog/2012/07/29/zeitliche-genauigkeit-eines-sntp-java-clients/</link>
		<comments>http://www.menodata.de/blog/2012/07/29/zeitliche-genauigkeit-eines-sntp-java-clients/#comments</comments>
		<pubDate>Sun, 29 Jul 2012 04:38:30 +0000</pubDate>
		<dc:creator>Meno Hochschild</dc:creator>
				<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://www.menodata.de/blog/?p=29</guid>
		<description><![CDATA[Zum Schaltsekundenereignis am 30. Juni 2012 habe ich aus Interesse einige Messungen mit einem in Java selbstprogrammierten SNTP-Client vorgenommen. Andere marktübliche Implementierungen stammen von Adam Buckley, Apache Commons oder von Google-Android. Die grundlegenden Programmiermuster solcher Implementierungen sind praktisch gleich &#8211; &#8230; <a href="http://www.menodata.de/blog/2012/07/29/zeitliche-genauigkeit-eines-sntp-java-clients/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Zum Schaltsekundenereignis am 30. Juni 2012 habe ich aus Interesse einige Messungen mit einem in Java selbstprogrammierten SNTP-Client vorgenommen. Andere marktübliche Implementierungen stammen von <a href="http://support.ntp.org/bin/view/Support/JavaSntpClient" target="_blank">Adam Buckley</a>, Apache Commons oder von Google-<a title="Android-Quellcode" href="http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.2_r1.1/android/net/SntpClient.java" target="_blank">Android</a>. Die grundlegenden Programmiermuster solcher Implementierungen sind praktisch gleich &#8211; einfach aufgrund der Anforderungen des SNTP-Protokolls. Allerdings habe ich in meiner Lösung noch einige Debugging-Ausgaben und Logging-Fähigkeiten eingebaut. Auch habe ich zum Vergleich den üblichen Ausdruck <em>System.currentTimeMillis()</em> nur einmalig zur Initialisierung verwendet und bin dann immer vom Ausdruck <em>System.nanoTime()</em> ausgegangen, da hier aus dem PC die maximal verfügbare zeitliche Genauigkeit herausgeholt werden kann.<span id="more-29"></span>Solche Zeitmessungen werten nicht nur die vom NTP-Server gemeldeten NTP-Zeitstempel (Festkommazahlen als Anzahl der Sekunden seit dem 1. Januar 1900) aus, sondern zwecks Schätzung der Laufzeitdifferenz im Netz auch die lokale Computer-Uhr. Entscheidende Messgröße ist die so erhaltene Differenz zwischen der lokalen Computer-Uhr und der über das SNTP-Protokoll ermittelten Netzzeit. Die Standardabweichung dieses Offsets liefert dann ein Maß zur Schätzung des mittleren Fehlers (hier des Mittelwerts) und ist letztlich das statistisch relevante Ergebnis dieses Artikels.</p>
<p><strong>Die Hardware-Daten sahen bei mir wie folgt aus:</strong></p>
<p>Lokaler PC mit Windows 7 =&gt; Intel(R) Core i7 CPU 2.93 GHz</p>
<p>NTP-Server =&gt; Physikalisch-Technische Bundesanstalt in Braunschweig (PTB), Stratum 1, NTP-Adresse &#8220;ptbtime1.ptb.de&#8221;</p>
<p>Internet-Connection =&gt; DSL 16000</p>
<p><strong>Einige für die angegebene Hardware-Konstellation typische Messdaten mit Mikrosekundenanzeige:</strong></p>
<p>Connecting NTP-Server, waiting for reply&#8230;<br />
NTP-Server connected: de.menodata.time4j.utc.net.SntpMessage[version=4, mode=server, leap-indicator=1, stratum=1, poll-interval=0, precision=-22, root-delay=0.0, root-dispersion=4.425048828125E-4, reference-identifier=PTB, reference-timestamp=2012-06-30T23:59:42,064662000Z, originate-timestamp=2012-06-30T23:59:50,809102000Z, receive-timestamp=2012-06-30T23:59:57,875550000Z, transmit-timestamp=2012-06-30T23:59:57,875559000Z]<br />
NTP-Server signals positive leap second.<br />
Last-Connection-Time=2012-06-30T23:59:57,898053000Z<br />
Offset=7044423082<br />
*************************************************<br />
Connecting NTP-Server, waiting for reply&#8230;<br />
NTP-Server connected: de.menodata.time4j.utc.net.SntpMessage[version=4, mode=server, leap-indicator=1, stratum=1, poll-interval=0, precision=-22, root-delay=0.0, root-dispersion=4.57763671875E-4, reference-identifier=PTB, reference-timestamp=2012-06-30T23:59:42,064662000Z, originate-timestamp=2012-06-30T23:59:51,154119000Z, receive-timestamp=2012-06-30T23:59:58,240131000Z, transmit-timestamp=2012-06-30T23:59:58,240138000Z]<br />
NTP-Server signals positive leap second.<br />
Last-Connection-Time=2012-06-30T23:59:58,271604000Z<br />
Offset=7054978015<br />
*************************************************<br />
Connecting NTP-Server, waiting for reply&#8230;<br />
NTP-Server connected: de.menodata.time4j.utc.net.SntpMessage[version=4, mode=server, leap-indicator=1, stratum=1, poll-interval=0, precision=-22, root-delay=0.0, root-dispersion=4.57763671875E-4, reference-identifier=PTB, reference-timestamp=2012-06-30T23:59:42,064662000Z, originate-timestamp=2012-06-30T23:59:51,517077000Z, receive-timestamp=2012-06-30T23:59:58,568375000Z, transmit-timestamp=2012-06-30T23:59:58,568382000Z]<br />
NTP-Server signals positive leap second.<br />
Last-Connection-Time=2012-06-30T23:59:58,583115000Z<br />
Offset=7037023577<br />
*************************************************<br />
Connecting NTP-Server, waiting for reply&#8230;<br />
NTP-Server connected: de.menodata.time4j.utc.net.SntpMessage[version=4, mode=server, leap-indicator=1, stratum=1, poll-interval=0, precision=-22, root-delay=0.0, root-dispersion=4.57763671875E-4, reference-identifier=PTB, reference-timestamp=2012-06-30T23:59:42,064662000Z, originate-timestamp=2012-06-30T23:59:51,847118000Z, receive-timestamp=2012-06-30T23:59:58,893526000Z, transmit-timestamp=2012-06-30T23:59:58,893532000Z]<br />
NTP-Server signals positive leap second.<br />
Last-Connection-Time=2012-06-30T23:59:58,904998000Z<br />
Offset=7035401682<br />
*************************************************<br />
Connecting NTP-Server, waiting for reply&#8230;<br />
NTP-Server connected: de.menodata.time4j.utc.net.SntpMessage[version=4, mode=server, leap-indicator=1, stratum=1, poll-interval=0, precision=-22, root-delay=0.0, root-dispersion=2.288818359375E-4, reference-identifier=PTB, reference-timestamp=2012-06-30T23:59:59,065810000Z, originate-timestamp=2012-06-30T23:59:52,170168000Z, receive-timestamp=2012-06-30T23:59:59,247781000Z, transmit-timestamp=2012-06-30T23:59:59,247788000Z]<br />
NTP-Server signals positive leap second.<br />
Last-Connection-Time=2012-06-30T23:59:59,275411000Z<br />
Offset=7050516613<br />
*************************************************<br />
Connecting NTP-Server, waiting for reply&#8230;<br />
NTP-Server connected: de.menodata.time4j.utc.net.SntpMessage[version=4, mode=server, leap-indicator=1, stratum=1, poll-interval=0, precision=-22, root-delay=0.0, root-dispersion=2.288818359375E-4, reference-identifier=PTB, reference-timestamp=2012-06-30T23:59:59,065810000Z, originate-timestamp=2012-06-30T23:59:52,525063000Z, receive-timestamp=2012-06-30T23:59:59,566965000Z, transmit-timestamp=2012-06-30T23:59:59,566972000Z]<br />
NTP-Server signals positive leap second.<br />
Last-Connection-Time=2012-06-30T23:59:59,575551000Z<br />
Offset=7033785196<br />
*************************************************<br />
Connecting NTP-Server, waiting for reply&#8230;<br />
NTP-Server connected: de.menodata.time4j.utc.net.SntpMessage[version=4, mode=server, leap-indicator=1, stratum=1, poll-interval=0, precision=-22, root-delay=0.0, root-dispersion=2.288818359375E-4, reference-identifier=PTB, reference-timestamp=2012-06-30T23:59:59,065810000Z, originate-timestamp=2012-06-30T23:59:52,842035000Z, receive-timestamp=2012-06-30T23:59:59,884087000Z, transmit-timestamp=2012-06-30T23:59:59,884093000Z]<br />
NTP-Server signals positive leap second.<br />
Last-Connection-Time=2012-06-30T23:59:59,892778000Z<br />
Offset=7033833181<br />
*************************************************<br />
Connecting NTP-Server, waiting for reply&#8230;<br />
NTP-Server connected: de.menodata.time4j.utc.net.SntpMessage[version=4, mode=server, leap-indicator=1, stratum=1, poll-interval=0, precision=-22, root-delay=0.0, root-dispersion=2.44140625E-4, reference-identifier=PTB, reference-timestamp=2012-06-30T23:59:59,065810000Z, originate-timestamp=2012-06-30T23:59:53,159185000Z, receive-timestamp=2012-06-30T23:59:59,256841000Z, transmit-timestamp=2012-06-30T23:59:59,256847000Z]<br />
NTP-Server signals positive leap second.<br />
Last-Connection-Time=<strong>2012-06-30T23:59:60,294928000Z</strong><br />
Offset=6060019006</p>
<p><strong>Besprechung der Messdaten:</strong></p>
<p>Der letzte gemessene Offset lag um ca. eine volle Sekunde kleiner, weil er als Differenz zwischen lokaler (fortlaufender) Computer-Uhr und vom NTP-Server gemessener Atomuhrzeit die Tatsache reflektiert, daß der NTP-Server eine Schaltsekunde wiederholt, also zweimal den gleichen NTP-Zeitstempel liefert (im Rahmen einer Sekundenanzeige ohne Berücksichtigung der Nachkommastellen). Gleichzeitig läuft die Windows-Computer-Uhr trotz der Schaltsekunde einfach weiter. Daher wird auf den letzten zu kleinen Offset eine Sekunde aufaddiert, um dann die Fehlerrechnung anzuwenden.</p>
<p>Offset-Mittelwert der Stichprobe = 7,043747544 Sekunden</p>
<p>Standard-Abweichung der Einzelwerte = 0,010348006 Sekunden</p>
<p>Standard-Abweichung des Mittelwerts = 0,003658572 Sekunden</p>
<p><strong>Ergebnis: Offset ~ 7,044 +/- 0,004 Sekunden</strong></p>
<p>Die unter Windows-Betriebssystemen übliche Genauigkeit von ca. 10 Millisekunden konnte also auf besser als 4 Millisekunden gesteigert werden. Allerdings führt Windows gelegentlich selber automatische NTP-Synchronisationen mit meistens dem Windows-Time-Server unter &#8220;time.windows.com&#8221; aus, die zu größeren Sekundensprüngen in der lokalen PC-Zeit führen können. Bei den oben angegebenen Messdaten ist nach einem Blick in die Windows-Systemprotokolle sichergestellt, daß die Messdaten durch diese unabhängigen Synchronisationsvorgänge nicht verfälscht worden sind. Umgekehrt ist natürlich hieraus auch zu folgern, daß die NTP-Zeit wesentlich zuverlässiger als die PC-Uhr ist (der Offset im Beispiel von ca. 7 Sekunden ist erheblich bei lange nicht erfolgter Windows-Synchronisation).</p>
<p>Interessant ist auch, daß der PTB-Server zwar ständig einen <em>leap-indicator</em> (=1) sendet, aber dieser nicht geeignet ist, die aktuelle Schaltsekunde abzufragen. Vielmehr kündet er nur eine kommende UTC-Schaltsekunde an. Und dieses Flag wird auch nicht sofort mit Ende der eingefügten Schaltsekunde abgeschaltet. So wurde es auch mehr als 3 Minuten danach noch von der PTB gesendet:</p>
<blockquote><p>Connecting NTP-Server, waiting for reply&#8230;<br />
NTP-Server connected: de.menodata.time4j.utc.net.SntpMessage[version=4, mode=server, <strong>leap-indicator=1</strong>, stratum=1, poll-interval=0, precision=-22, root-delay=0.0, root-dispersion=3.662109375E-4, reference-identifier=PTB, reference-timestamp=2012-07-01T00:03:37,080589000Z, originate-timestamp=2012-07-01T00:03:40,327099000Z, receive-timestamp=2012-07-01T00:03:46,367308000Z, transmit-timestamp=2012-07-01T00:03:46,367315000Z]<br />
NTP-Server signals positive leap second.<br />
Last-Connection-Time=<strong>2012-07-01T00:03:46,376627000Z</strong><br />
Offset=6031366725</p></blockquote>
<p>Erst ungefähr 8 Minuten später hat das leap-indicator-Flag den Normalwert 0. Zusammengefasst läßt sich sagen, daß das leap-indicator-Flag des NTP-Protokolls keine Möglichkeit bietet, eine bestimmte Sekunde als Schaltsekunde zu qualifizieren. Erst der Vergleich mit einer lokalen PC-Uhr in Kombination mit einem Offset-Sprung von ca. 1 Sekunde gestattet dies.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.menodata.de/blog/2012/07/29/zeitliche-genauigkeit-eines-sntp-java-clients/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ist Java schuld am Schaltsekunden-Crash zum&#160;30.&#160;Juni&#160;2012?</title>
		<link>http://www.menodata.de/blog/2012/07/20/ist-java-schuld-am-schaltsekunden-crash-zum-30-juni-2012/</link>
		<comments>http://www.menodata.de/blog/2012/07/20/ist-java-schuld-am-schaltsekunden-crash-zum-30-juni-2012/#comments</comments>
		<pubDate>Fri, 20 Jul 2012 16:11:41 +0000</pubDate>
		<dc:creator>Meno Hochschild</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.menodata.de/blog/?p=22</guid>
		<description><![CDATA[Ja, meinte neulich ein Mozilla-Ingenieur, als mit der Einführung einer UTC-Schaltsekunde zur Synchronisation der langsamer werdenden erdrotationsgebundenen Zeit UT1 mit der Atomuhrzeit UTC etliche Linux-basierte Webserver abstürzten, und mit ihnen so manche populären Java-basierten Anwendungen darauf mit. Sogar in der &#8230; <a href="http://www.menodata.de/blog/2012/07/20/ist-java-schuld-am-schaltsekunden-crash-zum-30-juni-2012/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Ja, meinte neulich ein <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=769972" target="_blank">Mozilla-Ingenieur</a>, als mit der Einführung einer UTC-Schaltsekunde zur Synchronisation der langsamer werdenden erdrotationsgebundenen Zeit UT1 mit der Atomuhrzeit UTC etliche Linux-basierte Webserver abstürzten, und mit ihnen so manche populären Java-basierten Anwendungen darauf mit.</p>
<p><span id="more-22"></span></p>
<p>Sogar in der Threeten-Mailing-Liste des JSR-310-Teams, das eine neue Datums- und Zeitbibliothek für Java 8 entwickeln will, nimmt der bei Oracle für den JDBC-Bereich beschäftigte<a href="http://sourceforge.net/mailarchive/forum.php?thread_name=6.2.5.6.2.20120702105109.06e68ce0%40oracle.com&amp;forum_name=threeten-develop" target="_blank"> Douglas Surber</a> die von Mozilla ausgestreuten Gerüchte für bare Münze und glaubt, daß die JSR-310-Referenzimplementierung Threeten derartige Probleme zuverlässig beseitigen würde. Als Begründung dient ihm, daß Threeten eine Minimalunterstützung für Schaltsekunden böte.</p>
<p><a href="http://sourceforge.net/mailarchive/forum.php?thread_name=6.2.5.6.2.20120703082845.06faaa30%40oracle.com&amp;forum_name=threeten-develop" target="_blank">Meine Antwort</a> in der Threeten-Mailing-Liste bezieht sich unter anderem auf <a href="http://serverfault.com/questions/403732/anyone-else-experiencing-high-rates-of-linux-server-crashes-during-a-leap-second" target="_blank">eine fundiertere Analyse von John Stultz</a>, die die Probleme tatsächlich auf Fehler im Linux-Kernel zurückführt. Java ist also völlig außen vor, und damit ist es im Hinblick auf die Server-Abstürze egal, was das JSR-310-Team als Schaltsekundenunterstützung rudimentär implementiert (oder auch gar nicht). Sowohl Java als erst recht auch Microsoft Windows sind bis jetzt gegenüber UTC-Schaltsekunden völlig ignorant und funktionieren trotzdem&#8230; Eine ganz andere Frage ist allerdings, ob Schaltsekunden nicht doch in irgendeiner Form unterstützt werden sollten, denn immerhin handelt es sich dabei um einen gesetzlichen Standard, der auch in der ISO-8601-Norm und im Internet-Protokoll RFC 3339 verankert ist.</p>
<p>Was lernen wir daraus? Nicht vorschnell irgendwelchen Gerüchten nachlaufen und daraus dann notwendig falsche Schlüsse ziehen. Wie auch in meinem letzten Kurzbeitrag zu populären Physikexperimenten angeklungen, rate ich zu mehr <em>Un</em>-Aufgeregtheit und Abwarten.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.menodata.de/blog/2012/07/20/ist-java-schuld-am-schaltsekunden-crash-zum-30-juni-2012/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zeit und Physik</title>
		<link>http://www.menodata.de/blog/2012/07/19/zeit-und-physik/</link>
		<comments>http://www.menodata.de/blog/2012/07/19/zeit-und-physik/#comments</comments>
		<pubDate>Thu, 19 Jul 2012 10:18:03 +0000</pubDate>
		<dc:creator>Meno Hochschild</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Physik]]></category>
		<category><![CDATA[Einstein]]></category>
		<category><![CDATA[Marxismus]]></category>
		<category><![CDATA[Materialismus]]></category>
		<category><![CDATA[Relativitätstheorie]]></category>
		<category><![CDATA[Zeit]]></category>

		<guid isPermaLink="false">http://www.menodata.de/blog/?p=1</guid>
		<description><![CDATA[Dieser erste Blog-Beitrag ist eigentlich ein Verweis auf eine Serie von älteren Artikeln, die ich früher in einer Auseinandersetzung mit Kritikern der Relativitätstheorie von Albert Einstein geschrieben habe. Während religiöse Spinner und Esoteriker keine ernsthaften und halbwegs rationalen Argumente gegen &#8230; <a href="http://www.menodata.de/blog/2012/07/19/zeit-und-physik/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Dieser erste Blog-Beitrag ist eigentlich ein Verweis auf eine <a onclick="window.open('http://www.marxismus-online.eu/display/dyn/xce9e63f2-11d4-453e-81ce-92b85eebdb03/index.html','newwindow');return false;" href="http://www.marxismus-online.eu/display/dyn/xce9e63f2-11d4-453e-81ce-92b85eebdb03/index.html">Serie von älteren Artikeln</a>, die ich früher in einer Auseinandersetzung mit Kritikern der Relativitätstheorie von Albert Einstein geschrieben habe.</p>
<p><span id="more-1"></span></p>
<p>Während religiöse Spinner und Esoteriker keine ernsthaften und halbwegs rationalen Argumente gegen das Zeitverständnis der modernen Physik vorzubringen vermögen, lohnt es sich doch, auf die Kritik anderer Personen einzugehen, die in der Regel auf der Schulphysik basiert. Die Schulphysik setzt ihren Schwerpunkt auf die althergebrachte klassische Mechanik von Newton, Kepler und Galilei. Die Relativitätstheorie kommt allenfalls nur als Randthema in der Oberstufe vor. Hinzu kommt, daß die Alltagserfahrungen mit Raum und Zeit sehr gut zur Newton&#8217;schen Mechanik passen, aber die Relativitätstheorie dem sogenannten &#8220;gesunden Menschenverstand&#8221; &#8211; sprich den Alltagserfahrungen &#8211; zu widersprechen scheint.</p>
<p>Leider fühlen sich speziell im politischen linken Spektrum einige Kräfte bemüßigt, angeblich von der Perspektive des philosophischen Materialismus ausgehend nicht nur die Relativitätstheorie anzugreifen, sondern letztlich die gesamte Physikerzunft als Trottel darzustellen, die einem Scharlatan namens Einstein hinterherlaufen würden. Tatsächlich verwechseln diese Kräfte Materialismus (der sehr wohl die vielfältigen physikalischen Experimente zu würdigen hat, die zur modernen Physik führten) mit Sensualismus basierend auf ihren eigenen Alltagserfahrungen.</p>
<p>Die nachstehend zitierte Debatte ist dabei zuweilen recht hitzig abgelaufen. Es hat sich für mich auch nicht wirklich gelohnt, auf die zwischenzeitliche Raserei eines Egbert Scheunemann näher einzugehen. Raserei ist in der Regel ein starkes Indiz, daß dem Kontrahenten die Sachargumente ausgehen. Jedoch haben meine physikalischen Argumente Bestand, und ich glaube, die Leser können deshalb von der Lektüre sehr profitieren und die tiefen und fundamentalen Gedankengänge der Relativitätstheorie nachvollziehen, zumal ich fast überhaupt keinen Gebrauch von komplizierten mathematischen Formeln gemacht habe.</p>
<p>Sehen Sie selbst:</p>
<p><a onclick="window.open('http://www.marxismus-online.eu/display/dyn/xce9e63f2-11d4-453e-81ce-92b85eebdb03/index.html','newwindow');return false;" href="http://www.marxismus-online.eu/display/dyn/xce9e63f2-11d4-453e-81ce-92b85eebdb03/index.html">Marxismus und Relativitätstheorie</a></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.menodata.de/blog/2012/07/19/zeit-und-physik/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
