User:Stefanw/Werkstatt/Date Issue Calc

From Apache OpenOffice Wiki
Jump to: navigation, search
Der Inhalt dieser Seite steht unter der Lizenz Creative Commons Namensnennung - Weitergabe unter gleichen Bedingungen 3.0 Deutschland.
Bilder und Dateien können abweichende Lizenzen haben!





User-Bereich von Stefan Weigel

Seiten im User-Bereich:

Tipps

Archiv

Seiten von Stefan im OOo-Wiki:

Marketing

Makro

Dokumente

Stefan Weigel 15:34, 31 December 2008 (CET)

Theoretische Grundlagen

Darstellung von Datum als numerischer Zeitstrahl

Tabellenkalkulationen und andere Anwendungsprogramme stellen Datum und Zeit auf einem einfachen numerischen Zeitstrahl dar. Das heißt jedes Datum oder Zeitangabe ist nichts anderes, als eine Zahl. Allein das Zahlenformat der Zelle macht, dass eine in der Zelle befindliche Zahl als Datums- oder Zeitangabe lesbar wird.

Der Tag 1. Januar 2009 ist in OOo Calc genau genommen nichts anderes als die Zahl 39814. Es ist nämlich der 39814te Tag seit dem 30.12.1899. Der Zeitstrahl ist "geeicht" in ganzen Tagen, das heißt ein Abschnitt auf dem Zeitstrahl der Länge 1 entspricht genau einem Tag. In Calc ist der Ursprung des Zeitstrahls mit dem Wert 0 definiert als der 30.12.1899. Der Tag 1 auf dem Zeitstrahl ist der 31.12.1899, der Tag 2 auf dem Zeitstrahl ist der 01.01.1900, der Tag 30000 auf dem Zeitstrahl ist der 18.02.1982 und der Tag 39814 auf dem Zeitstrahl ist eben der 01.01.2009.

Unterschiede bei verschiedenen Programmen

Dieses Modell zur Darstellung des Datums macht das Rechnen mit Datums- und Zeitangaben besonders einfach. Deshalb wird dieses Modell von vielen Anwendungsprogrammen, vor allem von Tabellenkalkulationen eingesetzt. Uneinheitlich ist dabei von Programm zu Programm die Festlegung des Ursprungs mit dem Wert 0 des Zahlenstrahls.

Programm Definition des Zeitstrahls
OOo Calc Tag 0 ist der 30.12.1899
StarCalc 1.0 Tag 0 ist der 01.01.1900
MS Excel auf Win Tag 1 ist der 01.01.1900
MS Excel auf Mac Tag 1 ist der 02.01.1904

Beim Austausch von Spreadsheets zwischen den verschiedenen Programmen ist also zu beachten, dass sich Datumsangaben, die in den Zellen durch eine Zahl repräsentiert werden, auf unterschiedliche Nullpunkte beziehen.

Optionen in OOo Calc

Calc bezieht seinen Zeitstrahl für Datums- und Zeitangaben normalerweise auf den als Tag 0 definierten 30.12.1899. Daneben bietet Calc zwei weitere Optionen:

Einstellung Bedeutung
30.12.1899 (Standard) Tag 0 ist der 30.12.1899
01.01.1900 (StarCalc 1.0) Tag 0 ist der 01.01.1900
01.01.1904 Tag 0 ist der 01.01.1904

Optionen-Dialog

Die drei möglichen Einstellungen für das Datumsmodell in Calc korrespondieren mit den Zahlenstrahldefinitionen von StarCalc 1.0, MS Excel auf Windows und MS Excel auf Mac.

  • Für StarCalc 1.0 ist dies offensichtlich.
  • Für MS Excel auf Mac ist die Definition "Tag 0 ist der 01.01.1904" in Calc gleichbedeutend mit der Definition "Tag 1 ist der 02.01.1904" in Excel.
  • Für MS Excel auf Windows weichen die Definition "Tag 0 ist der 30.12.1899" von Calc und die Definition "Tag 1 ist der 01.01.1900" von Excel um einen Tag voneinander ab. Und doch entspricht die Standarddefinition von Calc der Definition von Excel. Dieser scheinbare Widerspruch löst sich auf, wenn man den Datums-Bug in Excel berücksichtigt.

Der Datums-Bug in Excel

Excel hat seit Urzeiten einen Datums-Bug, der nie behoben wurde, vermutlich um die Kompatibilität zu den mit dem Datums-Bug erstellten Dokumenten zu bewahren. Der Fehler in Excel ist, dass in Excel der Tag 29.02.1900, als vermeintlicher Schalttag existiert. In Wahrheit ist das Jahr 1900 aber kein Schaltjahr.

  • Ein Schaltjahr ist, wenn die Jahreszahl durch 4 teilbar ist.
  • Wenn die Jahreszahl aber durch 100 teilbar ist, dann ist es doch kein Schaltjahr.
  • Und wenn die Jahreszahl durch 400 teilbar ist, dann es als Ausnahme von der Ausnahme wieder ein Schaltjahr.

Also das Jahr 1600 ist ein Schaltjahr. Die Jahre 1700, 1800 und 1900 sind keine Schaltjahre. Das Jahr 2000 ist ein Schaltjahr.

OOo Calc macht diesen Fehler nicht, versetzt aber den Ursprung seines Zeitstrahls um einen Tag gegenüber Excel und stellt somit eine Kompatibilität zu Excel für alle Datumsangaben ab dem 01.03.1900 her. Tatsächlich weichen Datumsangaben, die vor dem 01.03.1900 liegen, aus von Excel importierten Dokumenten in Calc eine Abweichung von 1 Tag auf.

Speicherung des Datums im Dokument

Anders, als die oben erwähnten Anwendungsprogramme, wendet ODF das Zahlenstrahlmodell nicht an. OOo Calc verwendet zwar das Zahlenstrahlmodell an der Oberfläche. Das heißt, ein Datum in Calc ist an der Oberfläche letztlich nichts anderes als eine bloße Zahl, die ausdrückt, um den wievielten Tag nach dem 30.12.1899 es sich handelt, und die durch das Zahlenformat der Zelle als lesbar formatiertes Datum erscheint. Dennoch speichert Calc beispielsweise für eine Zelle, die das Datum 1. November 2008 enthält, in der content.xml folgenden XML-Code, in dem das Datum explizit und nicht im Zahlenstrahlmodell abgebildet wird:

<table:table-cell office:value-type="date" office:date-value="2008-11-01">
    <text:p>1. November 2008</text:p> 
</table:table-cell>

Speicherung des verwendeten Zeitstrahlmodells

Speicherung des Zeitstrahlmodells im Dokument

Befand sich beim Speichern des Dokuments in Calc die Option Extras|Optionen|Calc|Berechnen|Datum auf der Standardeinstellung "30.12.1899 (Standard)" so taucht im gespeicherten Dokument hierzu kein weiterer Vermerk auf.

War beim Speichern des Dokuments in Calc eine andere Option gewählt, so wird dies in der content.xml ausdrücklich als Eigenschaft "null-date" ausgewiesen:

<table:calculation-settings>
   <table:null-date table:date-value="1900-01-01" /> 
</table:calculation-settings>
<table:table table:name="Tabelle1" table:style-name="ta1" table:print="false">
   <table:table-column table:style-name="co1" table:default-cell-style-name="ce1" /> 
   <table:table-row table:style-name="ro1">
      <table:table-cell office:value-type="date" office:date-value="2008-11-01">
         <text:p>1. November 2008</text:p> 
      </table:table-cell>
   </table:table-row>
</table:table>

Es ist nicht ganz nachvollziehbar, welchen Nutzen die Angabe der Eigenschaft "null-date" haben könnte. Im gespeicherten Dokument ist das Datum explizit in Datumsschreibweise vorhanden. In ODF wird das Zeitstrahlmodell nicht angewendet. Für das gespeicherte Dokument und für das Einlesen des gespeicherten Dokuments spielt es keine Rolle, welches Zeitstrahlmodell dem Programm beim Erstellen des Dokuments zugrunde lag.


Speicherung des Zeitstrahlmodells in der Anwendung

Zusätzlich zur Speicherung des Ursprungs des Zeitstrahls im Dokument, findet auch eine Speicherung im Anwendungsprogramm selbst statt. Für ein neu erstelltes Spreadsheet wird stets das Zeitstrahlmodell angewendet, das der Anwender zuletzt unter Extras|Optionen|Calc|Berechnen|Datum für ein Dokument eingestellt hatte. Der gewählte Ursprung des Zahlenstrahls wird von OOo in der Datei user/registry/data/org/openoffice/Office/Calc.xcu gespeichert:

<node oor:name="Date">
    <prop oor:name="DD" oor:type="xs:int">
     <value>30</value>
    </prop>
    <prop oor:name="MM" oor:type="xs:int">
     <value>12</value>
    </prop>
    <prop oor:name="YY" oor:type="xs:int">
     <value>1899</value>
    </prop>
</node>

Fehler in Calc (Issue 97669)

In Zusammenhang mit dem Handling der unterschiedlichen Zeitstrahldefinitionen hat OOo Calc einen gravierenden Fehler, der Datenverlust bedeuten kann.

Issue 97669 : Calc wrongly changes dates

Entdeckt haben dies User, bei denen - aus welchem Grund auch immer - die Einstellung Extras|Optionen|Calc|Berechnen|Datum in der Anwendung verändert war und nicht mehr auf der Standardeinstellung "30.12.1899 (Standard)" stand. Die Datumsangaben in den Dokumenten der Anwender wiesen nach dem Öffnen plötzlich einen Fehler von zwei Tagen auf. Das dürfte beim Einlesen eines Spreadsheets, das im ODF-Format gespeichert ist, nie passieren. Denn im gespeicherten Dokument befindet sich das Datum in einer zweifelsfreien, ausdrücklichen Datumsschreibweise. Unabhängig vom Zahlenstrahlmodell, mit dem das Dokument erstellt wurde, und unabhängig vom gerade in der Anwendung gewählten Zahlenstrahlmodell müssen die modellunabhängig und ausdrücklich gespeicherten Datumsangaben unverändert eingelesen werden.

Dementgegen ist festzustellen, dass Calc die eingelesenen Datumsangaben fälschlicherweise um zwei Tage verändert, wenn die Einstellung in Calc beim Speichern des Dokuments auf "30.12.1899 (Standard)" stand und beim Öffnen des Dokuments auf "01.01.1900 (StarCalc 1.0)" steht. Speichert man das fehlerhafte Dokument und öffnet man es wieder, werden die Datumsangaben erneut um zwei Tage verringert. Mit jedem Speichern kommt ein Fehler von -2 Tagen hinzu.

Das ist fatal. Bis der User das bemerkt, kann er längst nicht mehr rekonstruieren, auf welches Backup er zur Rettung zurückgreifen müsste.

Schritt-für-Schritt-Anleitung zur Reproduktion des Fehlers

In der Beschreibung des Issue 97669 befindet sich eine Schritt-für-Schritt-Anleitung zur Reproduktion des Fehlers.

Zusätzliches Problem durch fragliche Konsistenz der eingestellten Optionen

Der festgestellte Fehler wirkt doppelt fatal, da es mehrere unbestätigte und noch nicht reproduzierte Berichte von Anwendern gibt, die Einstellung Extras|Optionen|Calc|Berechnen|Datum habe sich ohne Zutun des Anwenders verändert. So berichtet beispielsweise ein Anwender von OOo 2.4.1, er habe OOo 3.0 auf einem anderen PC installiert. Auf dem anderen PC mit dem neuen OOo habe er dann festgestellt, dass die Datumsangaben in den mit dem alten PC erstellten Dokumenten nicht mehr stimmten. Er vermutete einen Bug beim Importieren von OOo-2.4.1-Dokumenten in OOo 3.0. Nach meinem Hinweis fand er die veränderte Einstellung bei Extras|Optionen|Calc|Berechnen|Datum. Er schwört, dass er diese Einstellung niemals berührt habe. Er meint, dies müsse bereits bei der Installation von OOo 3.0 so gesetzt worden sein.

Wenn dem so ist, dann bedeutet Issue 97669, dass Anwender Daten verlieren können, nur durch die Benutzung von OOo, ohne irgendwelche Einstellungen berührt zu haben. Freilich dürften - wie erläutert - veränderte Einstellungen so oder so keine Veränderung der Datumsangaben bewirken.

Vermutungen, was falsch laufen könnte

Wie erläutert, darf beim Öffnen eines im ODF-Format gespeicherten Spreadsheets der zum Zeitpunkt der Speicherung des Dokuments gewählte Ursprung des Zahlenstrahls keine Rolle spielen. Denn die Datumsangaben befinden sich im gespeicherten Dokument in expliziter Datumsschreibweise, zum Beispiel:

<table:table-cell office:value-type="date" office:date-value="2008-11-01">

Anders liegt es freilich, wenn aus einem Fremdformat importiert wird, beispielsweise ein Spreadsheet im StarCalc-1.0-Format. In diesem fremden Dokument mag das Datum 1. Nov. 2008 entsprechend dem Zahlenstrahlmodell als die Zahl 39751 gespeichert sein. Sind die Optionen von Calc beim Öffnen dieses Dokuments auf Standard eingestellt, so muss der Zahlenwert der entsprechenden Zelle um 2 erhöht werden, damit das korrekte Datum wiedergegeben wird.

Die Vermutung ist nun, dass die für den Import auf Fremdformate notwendigerweise zu berücksichtigenden Offsets zwischen den definierten Nullpunkten der Zahlenstrahlen fälschlicherweise auch beim Öffnen von Spreadsheets im ODF-Format angewandt werden.

Personal tools