Calc: Zeiten vereinfacht eingeben

Hallo,
in meinen Zeitentabellen habe ich eine menge Zeitwerte einzutippen.
Dabei nervt mich besonders der Doppelpunkt, ohne den keine Zeit, sondern
bestenfalls ein Datum, Null Uhr, herauskommt. Eine Gültigkeitsprüfung
allein befriedigt mich dabei nicht so richtig. Am liebsten würde ich für
die Uhrzeit

13:15 h

nur

[1] [3] [1] [5] [Enter]

tippen müssen.

Da das Ganze anschließend noch ausgedruckt werden soll, sollte die
Uhrzeit wirklich wie

13:15 h

aussehen und nicht etwa

1315

oder so ähnlich. Und rechnen können sollte man damit auch noch. :wink:
Wie kriege ich das am handhabungsfreundlichsten hin, am besten ohne
Hilfszellen?

Hallo Boris,

irgendwie muss Calc "wissen", dass 1234 keine Dezimalzahl sondern eine
Uhrzeit sein soll. Wenn dich der Doppelpunkt stört, kann du eventuell
ein anderes Zeichen dafür verwenden, welches du automatisch ersetzen
lässt. Ob das für dich praktikabel ist und dir das Originalzeichen nicht
abgeht, müsstest du testen.
Wie die Uhrzeit ausgegeben wird, ob als 13:15 oder 13:15 h, 13 Uhr 15,
Stunde 13 Minute 15, usw. kannst du über die Zellenformatierung festlegen.

LG Günther

privat

Nachtrag:

Alternativ kannst du auch vierstellige Dezimalzahlen eingeben und am
Ende mit suchen nach ([:digit:][:digit:])([:digit:][:digit:]) ersetzen
durch $1:$2 als reguläre Ausrücke.

LG Günther

privat

Hallo Boris,

Calc speichert Datum und Uhrzeit als Vor- und Nachkommastellen einer Zahl. Daher hilft auch eine Formateinstellung als Uhrzeit nichts, um zu erkennen, dass es eine Uhrzeit sein soll, denn Calc muss auch seine gespeicherten Dezimalzahlen in dieses Format umwandeln können und braucht daher den Doppelpunkt als Signal, dass es sich eben nicht um den Nachkommateil einer Zahl handelt, wie Günther das schon beschrieben hat.
Das erklärt auch, dass bei deinen Versuchen 0 Uhr herauskommt: du gibst eine Ganzzahl ein, der Nachkommateil ist also 0.
Was außer Günthers Vorschlag in seiner zweiten Mail auch noch möglich ist, ist, eine Hilfsspalte A zu verwenden, um die Uhrzeit einzugeben und die eigentliche Spalte B zu berechnen; einfaches Beispiel:
der Inhalt von B3 ist =VERKETTEN(TEIL(A3;1;2);":";TEIL(A3;3;2))
Bei dieser Form muss man eine führende Null immer eingeben, da müsste man ggf. noch etwas dazu tun, z. B. eine Abfrage auf drei- oder vierstellig.
Wenn alles erfasst ist, kann man über Daten -> Berechnen -> Formel in Wert umwandeln die Formeln durch die Ergebnisse ersetzen und dann die Hilfsspalte A löschen.
Du solltest für die Datei immer ein Muster haben, weil ja die Formel nach der Aktion verschwunden ist, oder dir die Formel irgendwo aufheben, dass du sie nur reinkopieren und anpassen musst.

Gruß

Gerhard

Hallo Boris,

ich habe keine Lösung ohne Hilfszelle parat, aber die lässt sich doch nach der Eingabe ausblenden.
Mit der Formel

=ZEITWERT(VERKETTEN(LINKS(TEXT(A1;"0000");2);":";RECHTS(TEXT(A1;"0000");2)))

erhältst du eine Zahl, die sich als Stunde/Minute formatieren lässt und mit der man weiterrechnen kann. Der Umweg über die Formatierung als Text dient zur Ergänzung der führenden Null bei dreistelligen Dezimalzahlen.

Zu der gewünschten Anzeige mit dem " h" kommst du über

=VERKETTEN(LINKS(TEXT(A2;"0000");2);" : ";RECHTS(TEXT(A2;"0000");2); " h")

Das ergibt einen Text.

Bei beiden enthält  Spalte A die Hilfszellen, die angepasst werden müssen.

VG Bernd

Hallo,
vielen Dank für die vielen Anregungen. Für mich habe ich das jetzt so
gelöst:

Spalte C: von -Zeit, Format: #":"##;[ROT]-#":"##
  Gültigkeit: Jeder Wert

Spalte D: bis -Zeit, Format: #":"##;[ROT]-#":"##
  Gültigkeit: Ganze Zahl, Gültiger Bereich: 0 ... 2400

Berechnung der Dauer (hier in Zeile 3):

=WENN(ODER(C3="";D3="");"";(GANZZAHL(D3/100)+(D3-(GANZZAHL(D3/100)*100))/60)-(GANZZAHL(C3/100)+(C3-(GANZZAHL(C3/100)*100))/60))

  Format: #.##0,00;[ROT]-#.##0,00

Das ist zwar kein richtiges Zeitformat, erfüllt fürs erste meine
Anforderung: nach Tippen von
1315
erscheint
13:15
und die Dauer wird auch richtig berechnet und kann weiterverarbeitet
werden, wenn auch nicht als Zeit, sondern als Dezimalzahl.

Mach doch eine Spalte mit Deinen Uhrzeiten 1234, 2345, 1255,
und in der Spalte daneben bestimmst Du mit den Textfunktionen Links()
und Rechts() Stunde und Minute und dann kannst dazwischen dann das :
hinein schmuggeln. Eventuell musst Du Calc noch 'sagen'. jetzt ist das
ein Uhrzeit.

Hallo Boris,

eigentlich ist sowohl die Zeit wie auch das Datum eine spezielle
Speicherart welche zumeist als uInt litleendian im System hinterlegt wird.

Als "TIME" gilt unter 32Bit: Auflösung in Millisekunden
T# -596h31m23s648ms...59h31m23s647ms
Dieses Format scheint auch in LibOf genutzt zu werden; ob das jedoch
wirklich ms genau ist weiss nehme ich an... aber das müssten dann schon
die Programmierer beantworten; jedenfalls ist in Calc eine solche mit
Formatierung MM:MM:SS,ms verfügbar...

Als DATE_AND_TIME unter 32Bit gilt: Auflösung Sekunden
Dabei gibt es eine Fixpunkt von welchem aus der Nullpunkt definiert ist.
Fixpunkt 1.1.1970 00:00:00
DT# 2106-02-07-06:28:15
-(ps. hier ist zu beachten, dass diverse Fixpunkte in Anwendung sind.
- über viele Jahre war das 1.1.1900.00:00:00
- unter 64Bit ist das jedoch kein Thema mehr, da ein Überlauf bei
- unserer Lebensdauer nicht mehr zu befürchten ist)

Nach DIN EN 28601 galt im deutschen Sprachraum JJJJ-MM-TT
Diese wurde jedoch mit DIN 5008 (2001) zugunsten JJJJ.MM.TT (wie in
LibOf) wieder fallen gelassen!

Diese Numerische Darstellung ermöglicht es, die Rechenoperatoren direkt
auf Zeitformate anzuwenden, jedoch müssen diese via Interpretation
ausgegeben werden.
Das ist der Grund, warum diese Zeitformate nur via Umrechnung zu deuten
sind und nicht einfach so in einer Tabelle eingetragen werden können!

Um nun in Calk rein numerische Werte eingeben zu können gibt es eine
ganz einfache Lösung:

Dazu nehmen wir mal zwei Spalten mit vier Zeilen

1. Spalte A für die rein numerischen Eingaben:
  Zeile 1 Stunden => Dezimal Standard
  Zeile 2 Minuten => Dezimal Standard
  Zeile 3 Sekunden => Dezimal Standard
2. Spalte B Ausgabe im Zeitformat
  Zeile 1 =ZEIT(A1;0;0) => Format Zeit
  Zeile 2 =ZEIT(0;A2;0) => Format Zeit
  Zeile 3 =ZEIT(0;0;A3) => Format Zeit
3. Spalte TIME-Ausgabe
  Zeile 4 =B1+B2+B3 => Format Zeit

Diese Funktion kann auf alle Datentypen Zeit oder Datum angewandt werden
und Calc gibt so immer die interpretierte Zeit/Datum Form aus!

schönen Tag und gutes Neues Jahr

Marino

Hallo,
vielen Dank für die vielen Anregungen. Für mich habe ich das jetzt so
gelöst:

Spalte C: von -Zeit, Format: #":"##;[ROT]-#":"##
  Gültigkeit: Jeder Wert

Spalte D: bis -Zeit, Format: #":"##;[ROT]-#":"##
  Gültigkeit: Ganze Zahl, Gültiger Bereich: 0 ... 2400

Berechnung der Dauer (hier in Zeile 3):

=WENN(ODER(C3="";D3="");"";(GANZZAHL(D3/100)+(D3-(GANZZAHL(D3/100)*100))/60)-(GANZZAHL(C3/100)+(C3-(GANZZAHL(C3/100)*100))/60))

  Format: #.##0,00;[ROT]-#.##0,00

Das ist zwar kein richtiges Zeitformat, erfüllt fürs erste meine
Anforderung: nach Tippen von
1315
erscheint
13:15
und die Dauer wird auch richtig berechnet und kann weiterverarbeitet
werden, wenn auch nicht als Zeit, sondern als Dezimalzahl.

¦

Hallo Marino,

...

Nach DIN EN 28601 galt im deutschen Sprachraum JJJJ-MM-TT
Diese wurde jedoch mit DIN 5008 (2001) zugunsten JJJJ.MM.TT (wie in
LibOf) wieder fallen gelassen!

Das wurde nicht fallengelassen, es wurde nur die bisher in Deutschland verwendete Form TT.MM.JJJJ (und nicht, wie du schreibst, die umgekehrte JJJJ.MM.TT !!!) wieder offiziell zugelassen, weil sich keiner an die Standardform JJJJ-MM-TT gehalten hat, was auch kein Wunder ist, weil dieser internationale Standard auch kaum irgendwo offensiv vertrieben und beworben wurde.
Und LibO unterstützt selbstverständlich auch das internationale Format, gib mal in ein leeres Calc-Dokument 2019-12-27 ein, das ist dann anschließend als Datumsfeld erkannt worden, mit eben dieser Formatierung.
LibO speichert Datum und Uhrzeit in einer Zahl, wobei die Vorkommastellen die Tage seit einem Stichtag zählen, den ich momentan nicht mehr weiß, das kann man ja ausprobieren, und die Nachkommstellen die Uhrzeit ergeben, 0,5 entspricht 12 Uhr. Was man an der Oberfläche sieht, ist immer umgerechnet und formatiert. Keine der vielen möglichen Formen ist besser oder schlechter als die andere, LibO ist da neutral.

Gruß

Gerhard

Hallo Gerhard und Marino,

>>wobei die Vorkommastellen die Tage seit einem Stichtag zählen<<

Im Menü Extras>Optionen>LibreOfficeCalc>Berechnen

ist der Stichtag (standardmäßig) als 30.12.1899 vorgegeben.

Zur Auswahl gibt es dort noch zwei Alternativen

01.01.1900 (Star-Calc 1.0) und

01.01.1904

Freundliche Grüße

Harald

Hi Gerhard,

jep das hast Du richtig erkannt, habe mich da vertan...

Hallo Marino,

...

Nach DIN EN 28601 galt im deutschen Sprachraum JJJJ-MM-TT
Diese wurde jedoch mit DIN 5008 (2001) zugunsten JJJJ.MM.TT (wie in
LibOf) wieder fallen gelassen!

Das wurde nicht fallengelassen, es wurde nur die bisher in Deutschland
verwendete Form TT.MM.JJJJ (und nicht, wie du schreibst, die umgekehrte
JJJJ.MM.TT !!!

Die Reihenfolge ist im deutschsprachigen Raum tatsächlich umgekehrt; was
jedoch keinen Einfluss auf die abgespeicherten Daten hat, da diese nicht
Sprach-gebunden hinterlegt sind. Diese Werte werden nur jeweils anders
interpretiert ausgegeben.

Es gilt jedoch zu beachten, dass wesentlicher Unterschiede zwischen:
A. TIME und DATE_AND_TIME (DIN)
B. Time_of_Day und Date_and_Time_of Day (ISO)
bestehen.
Die binäre Hinterlegung folgt dabei nicht der gleichen Gesetzen.

In diesem Zusammenhang ist mir aufgefallen, dass in LibOf eine unschöne
Ungereimtheit existiert.

Da bei der DtTm Eingabe "Zellen formatieren" Datum und Uhrzeit die
Platzhalter für:
1. Datum TT.MM.JJJJ
2. Uhrzeit HH:MM:DD
verwendet werden, erfolgt das unangenehme Ersetzen von Uhrzeit in Datum,
wenn "MM" als Format_Code eingefügt wird. Wird ":MM" oder "MM:"
geschrieben, dann bleibt die Minute von Time, jedoch erscheint nun in
der Tabelle der Wert mit vor- bez, nach-gestelltem Doppelpunkt; gerade
das, was es unmöglich macht hier eine Glanzzahl einzusetzen!
In gewissen Programmieroberflächen welche Format-restriktiv sind, sind
die Datums-Platzhalter in Grossbuchstaben-, die Zeit-Platzhalter in
Kleinbuchstaben gehalten (e); DD.MM.JJJJ / hh:mm:ss,ms damit solche
Vertauschungen gar nicht erst auftreten können!

) wieder offiziell zugelassen, weil sich keiner an die

Standardform JJJJ-MM-TT gehalten hat, was auch kein Wunder ist, weil
dieser internationale Standard auch kaum irgendwo offensiv vertrieben
und beworben wurde.
Und LibO unterstützt selbstverständlich auch das internationale Format,
gib mal in ein leeres Calc-Dokument 2019-12-27 ein, das ist dann
anschließend als Datumsfeld erkannt worden, mit eben dieser Formatierung.
LibO speichert Datum und Uhrzeit in einer Zahl, wobei die
Vorkommastellen die Tage seit einem Stichtag zählen, den ich momentan
nicht mehr weiß, das kann man ja ausprobieren, und die Nachkommstellen
die Uhrzeit ergeben, 0,5 entspricht 12 Uhr. Was man an der Oberfläche
sieht, ist immer umgerechnet und formatiert. Keine der vielen möglichen
Formen ist besser oder schlechter als die andere, LibO ist da neutral.

Gruß

Gerhard

Gruss Marino

Hallo,

Im Menü Extras>Optionen>LibreOfficeCalc>Berechnen
ist der Stichtag (standardmäßig) als 30.12.1899 vorgegeben.

warum eigentlich der 30. und nicht der 31.?

Das ermöglicht, dass der interne Wert 1,0000 direkt den Zeitstempel
01.01.1900 00:00:00 repräsentieren kann. Und dementsprechend jeder
beliebige Datums- und Zeitwert dirket in eine entsprechende Zahl (Tage
seit Stichtag) umgewandelt werden kann. Bei jedem anderen Basiswert
müsste bei der Umwandlung immer ein entsprechender Offset abgezogen oder
hinzugefügt werden.

Wobei die Angabe 30.12.1899 etwas zu Missverständnissen verleiten kann,
eigentlich gemeint ist nämlich genau genommen der Zeitstempel
23.12.1899 24:00 (aka 31.12.1899 00:00).

Wolfgang

Hallo Gerhard,

Hallo Marino,

...

Nach DIN EN 28601 galt im deutschen Sprachraum JJJJ-MM-TT
Diese wurde jedoch mit DIN 5008 (2001) zugunsten JJJJ.MM.TT (wie in
LibOf) wieder fallen gelassen!

Das wurde nicht fallengelassen, es wurde nur die bisher in Deutschland
verwendete Form TT.MM.JJJJ (und nicht, wie du schreibst, die umgekehrte
JJJJ.MM.TT !!!) wieder offiziell zugelassen, weil sich keiner an die
Standardform JJJJ-MM-TT gehalten hat, was auch kein Wunder ist, weil
dieser internationale Standard auch kaum irgendwo offensiv vertrieben
und beworben wurde.
Und LibO unterstützt selbstverständlich auch das internationale Format,
gib mal in ein leeres Calc-Dokument 2019-12-27 ein, das ist dann
anschließend als Datumsfeld erkannt worden, mit eben dieser Formatierung.
LibO speichert Datum und Uhrzeit in einer Zahl, wobei die
Vorkommastellen die Tage seit einem Stichtag zählen, den ich momentan
nicht mehr weiß, das kann man ja ausprobieren, und die Nachkommstellen
die Uhrzeit ergeben, 0,5 entspricht 12 Uhr.

Es tut mir leid, aber hier stimmt etwas nicht...
Es werden bestimmt keine Kommastellen im Speicher verwendet!
Das würde ja bedeuten, dass eine FLOAT bez. REAL in Anwendung wäre. Das
jedoch wäre mit der erheblichen Tatsache verbunden, dass je nach
rechen-Operanden enorme Abweichungen der tatsächlichen Zeit resultieren
würden.
  => https://de.wikipedia.org/wiki/Gleitkommazahl
    / Eigenschaften einer Gleitkommaarithmetik

TIME wird in Millisekunden in INT hinterlegt, darum auch der beschränkte
Umfang von ~±596 Std.
(das reicht nicht mal für einen Monat ~720h, aber für ms-genaue
Wochenuhren und Funktion-Timer prädestiniert)

Zeit und Datum DATE_AND_TIME werden daher im Speicher immer Binär in
Anzahl Sekunden ab Fixpunkt hinterlegt.
Bei 32Bit DINT ergibt das einen Umfang von ± ~68 Jahren vom gesetzten
Nullpunkt aus gerechnet; darum wird ja auch zwingend ein Fixpunkt benötigt.
(Bei 32Bit-Rechnern musste daher für eine grössere Genauigkeit bez.
grösseren Umfang auf 2 DINT geschiftet werden; eine Technik die unter
8Bit-Prozessoren früher zum täglichen Brot gehörten...)

Die Rechnung an sich ist trivial:
1Min = 60 Sek
1Std = 60 Min Bez. 3600Sek.
Tag = 60*60*24 = 86400 Sekunden.
Somit können Zeiten Addiert, Subtrahiert u. u. u. werden ohne dass
spezielle Interpretationen benötigt werden.
Da eine INT Zeit die in INT dividiert wird ohne Rest zurückgegeben wird
(keine Rundung) kann diese direkt z.B. mit 60 geteilt werden und ich
erhalte die Zeit in Minuten - u.s.w. Solches macht der Zeitinterpreter.
Dieser interpunktiert diese Resultate und gibt die Werte nach Addition
mit dem Fixpunkt formatiert aus: DD.MM.JJJJ hh:mm:ss aus.
In Jahresbereich muss jedoch ein Kalender mit integriert sein, damit die
Schalttage mit einfliessen sonst kommt es zu Interpretationsabweich-ungen!
Bei 64Bit LINT ist die Beschränkung an sich kein Thema ist doch der
Bereich bei ±1.45E11 Jahre in Sekunden; daher kann hier die Formatierung
auch bis Millisekunde genau ausgegeben werden.

Was man an der Oberfläche
sieht, ist immer umgerechnet und formatiert. Keine der vielen möglichen
Formen ist besser oder schlechter als die andere, LibO ist da neutral.

Gruß

Gerhard

Gruss
Marino

Es tut mir leid, aber hier stimmt etwas nicht...
Es werden bestimmt keine Kommastellen im Speicher verwendet!
Das würde ja bedeuten, dass eine FLOAT bez. REAL in Anwendung wäre.

Nein, DOUBLE.

Das
jedoch wäre mit der erheblichen Tatsache verbunden, dass je nach
rechen-Operanden enorme Abweichungen der tatsächlichen Zeit resultieren
würden.
  => https://de.wikipedia.org/wiki/Gleitkommazahl
    / Eigenschaften einer Gleitkommaarithmetik

Ja, tut es; und ja, in der Tat, Rundungsfehler können im Extremfall bis
in den Nanosekundenbereich druchschlagen.

TIME wird in Millisekunden in INT hinterlegt, darum auch der beschränkte
Umfang von ~±596 Std.

Ich habe keine Ahnung, von welchem Programm du redest, von Calc
jedenfalls nicht; da gibt es überhaupt keinen Variablentyp TIME o. ä.
Und auch in Base aka der Makrosprache gibt es das nicht, höchstens die
/Funktion/ TIME; den Variablentyp /DATE/.

(das reicht nicht mal für einen Monat ~720h, aber für ms-genaue
Wochenuhren und Funktion-Timer prädestiniert)

Zeit und Datum DATE_AND_TIME werden daher im Speicher immer Binär in
Anzahl Sekunden ab Fixpunkt hinterlegt.

*Alle* Daten, sogar Texte, werden intern binär abgelegt. Und Calc selbst
kennt überhaupt nur 3 Datentypen, nämlich String aka Text, Integer und
Gleitkomma aka Double.

Bei 32Bit DINT

Was bitte ist ein DINT? Meinst du etwa LONG?

ergibt das einen Umfang von ± ~68 Jahren vom gesetzten

Bei einem DOUBLE ergibt sich ein Wertebereich von rund 4,93E+305 Jahren.
Zum Vergleich, das Universum ist überhaupt erst ca. 1,37E+010 Jahre alt.
Der Wertebereich reicht also durchaus noch ein paar Monate. Aber ja, mit
Werten größer/kleiner ca. +/- 1,80E+308 kann Calc nicht mehr rechnen.

Die Rechnung an sich ist trivial:
1Min = 60 Sek
1Std = 60 Min Bez. 3600Sek.
Tag = 60*60*24 = 86400 Sekunden.
Somit können Zeiten Addiert, Subtrahiert u. u. u. werden ohne dass
spezielle Interpretationen benötigt werden.

Im Prinzip ist deine Schlussfolgerung schon richtig. Aber sie gilt
natürlich genauso, wenn 1 Sekunde als 1/86400 Tag aka
0,00001157407407407410 Tage repräsentiert wird. 2 Sekunden ist in beiden
Fällen das doppelte, 86400 Sekunden ist in beiden Fällen das
86400-fache, usw.; völlig problemlos, und ohne spezielle
Interpretationen. Das würde sogar funktioneren, wenn du den Wert Pi für
1 Sekunde (oder 1 Tag, 1 Woche, 1 Jahr, 1 Millisekunde, oder sonst was,
sogar mit sieben drittel Stunden, oder fünfundzwanzig
siebenunddreißigstel Wochen, usw.) an nimmst.

Da eine INT Zeit die in INT dividiert wird ohne Rest zurückgegeben wird
(keine Rundung) kann diese direkt z.B. mit 60 geteilt werden und ich
erhalte die Zeit in Minuten - u.s.w.

Und was bitte machst du mit Millisekunden usw.?

Solches macht der Zeitinterpreter.

Der wer? Meinst du etwa das Teil, mit dem eine Zeitreisemaschine
gesteuert wird?

Wolfgang

Hallo Marino,

zur Ergänzung von Wolfgangs Aussagen hier die betreffenden Eigenschaften der Zelle, in der ich einen Testwert eingegeben habe, ausgelesen mit Xray:
FormulaLocal              string              "28.12.2019 17:11:45"
Formula                   string                 "43827.7164930556"
Value                     double                   43827.7164930556
String                    string              "28.12.2019 17:11:45"

Gruß
Gerhard

Hallo,

Hallo,

Im Menü Extras>Optionen>LibreOfficeCalc>Berechnen
ist der Stichtag (standardmäßig) als 30.12.1899 vorgegeben.

warum eigentlich der 30. und nicht der 31.?

Das ermöglicht, dass der interne Wert 1,0000 direkt den Zeitstempel
01.01.1900 00:00:00 repräsentieren kann.

genau das ist dann eben nicht der Fall, der 01.01.1900 entspräche dann
der 2 und nicht der 1 -das ist dann nämlich der 31.12.1899. Für mich
sieht im das ersten Anlauf nicht nach einer Erleichterung, Merkhilfe
o.ä. aus.

Wobei die Angabe 30.12.1899 etwas zu Missverständnissen verleiten kann,
eigentlich gemeint ist nämlich genau genommen der Zeitstempel
23.12.1899 24:00 (aka 31.12.1899 00:00).

Nicht bei mir, da ist das tatsächlich der 30. Dezember 1899, 00:00:00
(Copy&Paste).

Hei Boris, Wolfgang,

Hallo,

Hallo,

Im Menü Extras>Optionen>LibreOfficeCalc>Berechnen
ist der Stichtag (standardmäßig) als 30.12.1899 vorgegeben.

warum eigentlich der 30. und nicht der 31.?

Das ermöglicht, dass der interne Wert 1,0000 direkt den Zeitstempel
01.01.1900 00:00:00 repräsentieren kann.

genau das ist dann eben nicht der Fall, der 01.01.1900 entspräche dann
der 2 und nicht der 1 -das ist dann nämlich der 31.12.1899. Für mich
sieht im das ersten Anlauf nicht nach einer Erleichterung, Merkhilfe
o.ä. aus.

Es gibt da noch eine andere "Theorie". 1,0 sollte der 01.01.1900 sein, und das "Große" Excel-Programm eines Marktführers hat dies auch so intern bestimmt und festgelegt.

Leider hat man in der weiteren Berechnung das Schaltjahr 1904 "vergessen", so dass hier ein Tag fehlt. So stimmen die Zeitwerte zwischen LO/AOO und Excel in der Zeitspanne von 1900 bis 1904 nicht überein - erst ab dem 1. März 1904 passt das dann wieder. So erklärt sich der Stichtag 30.12.1899 als Starttag.

Viele Grüße

Thomas

Hallo Wolfgang

Es tut mir leid, aber hier stimmt etwas nicht...
Es werden bestimmt keine Kommastellen im Speicher verwendet!
Das würde ja bedeuten, dass eine FLOAT bez. REAL in Anwendung wäre.

Nein, DOUBLE.

Das
jedoch wäre mit der erheblichen Tatsache verbunden, dass je nach
rechen-Operanden enorme Abweichungen der tatsächlichen Zeit resultieren
würden.
  => https://de.wikipedia.org/wiki/Gleitkommazahl
     / Eigenschaften einer Gleitkommaarithmetik

Ja, tut es; und ja, in der Tat, Rundungsfehler können im Extremfall bis
in den Nanosekundenbereich druchschlagen.

TIME wird in Millisekunden in INT hinterlegt, darum auch der beschränkte
Umfang von ~±596 Std.

Ich habe keine Ahnung, von welchem Programm du redest, von Calc
jedenfalls nicht; da gibt es überhaupt keinen Variablentyp TIME o. ä.
Und auch in Base aka der Makrosprache gibt es das nicht, höchstens die
/Funktion/ TIME; den Variablentyp /DATE/.

(das reicht nicht mal für einen Monat ~720h, aber für ms-genaue
Wochenuhren und Funktion-Timer prädestiniert)

Zeit und Datum DATE_AND_TIME werden daher im Speicher immer Binär in
Anzahl Sekunden ab Fixpunkt hinterlegt.

*Alle* Daten, sogar Texte, werden intern binär abgelegt. Und Calc selbst
kennt überhaupt nur 3 Datentypen, nämlich String aka Text, Integer und
Gleitkomma aka Double.

Jep,
aber nur bedingt richtig "Wahrheitswert" (BOOL) hast Du unterschlagen...
und String ist in sich kein echter Datentyp sondern ein eindimensionales
ARRAY zu 8Bit.

Wenn das, was Du hier sagst richtig ist; das die Zeiten in Calc in
Fliesskomma-Werten hinterlegt sind; dann werden bei gewissen
Rechenoperationen unweigerlich Fehler auftrete.
Nicht gerade das Gesuchte. In INT würde solches nie auftreten. Auf
Leitsystemen mit Echtzeiteinträgen ist es Bedingung, dass die
Zeitstempel kohärent sind!
Gerade beim Abgleich von Letzt-wert, was in Leitebene als Bedingung für
die Neuwert-Gültigkeit steht (DCP/IP Daten-Überholungen), eine absolute
Bedingung.
Somit kommt Calc als Tabelle für Datenhinterlegung für diesen Zweck
nicht in Frage!

Bei 32Bit DINT

Was bitte ist ein DINT? Meinst du etwa LONG?

Es ist mir sehr wohl bewusst, dass heute oft nur INT geschrieben wird,
obwohl es eigentlich einen grösseren Bereich umfasst. Da kommt daher,
dass auf einem Rechner die Grösse durch einen 16er-, 32er- oder
64er-BitProzessor festgelegt wird. So bezieht sich der Begriff INT heute
zumeist auf die Maximal-Bit-zahl der Recheneinheit.

Meine Aussagen beruhen aber auf den Standard von den grundsätzlichen
ANY_INT Datentypen.
SINT = ShortInteger 8Bit = 1 BYTE (in C CHAR ) -128...127 / 255
INT = Integer 16Bit= 2 BYTE -32768...32767
DINT = DoubleInteger 32Bit= 4 BYTE
LINT = LongInteger 64Bit= 8 BYTE

Die Aufgliederung in BYTE ist darum zu berücksichtigen, weil die meisten
seriellen Transportmittel; CAN, PROFIBUS, MODBUS, Ethernet; Byte-weise
übertragen und die Speicher in Byte organisiert sind!
Darum wird der Speicher in Byte-Grösse definiert und bei der
Speicher-übertragung muss ja auch ein Pointer gesetzt werden, welcher
auf die erste Byte-Adresse zeigt.

Mit Vorstellung "U= für unsigned
in Abwandlung ohne Negativwerte dafür doppelten Umfang
(Höchstwertigels Bit wird nicht als Negativ sondern als Zahlenwert genutzt)
Demselben Muster folgt auch ANY_REAL
  REAL = 32Bit
  LREAL= 64Bit

ergibt das einen Umfang von ± ~68 Jahren vom gesetzten

Bei einem DOUBLE ergibt sich ein Wertebereich von rund 4,93E+305 Jahren.
Zum Vergleich, das Universum ist überhaupt erst ca. 1,37E+010 Jahre alt.
Der Wertebereich reicht also durchaus noch ein paar Monate. Aber ja, mit
Werten größer/kleiner ca. +/- 1,80E+308 kann Calc nicht mehr rechnen.

Die Rechnung an sich ist trivial:
1Min = 60 Sek
1Std = 60 Min Bez. 3600Sek.
Tag = 60*60*24 = 86400 Sekunden.
Somit können Zeiten Addiert, Subtrahiert u. u. u. werden ohne dass
spezielle Interpretationen benötigt werden.

Im Prinzip ist deine Schlussfolgerung schon richtig. Aber sie gilt
natürlich genauso, wenn 1 Sekunde als 1/86400 Tag aka
0,00001157407407407410 Tage repräsentiert wird. 2 Sekunden ist in beiden
Fällen das doppelte, 86400 Sekunden ist in beiden Fällen das
86400-fache, usw.; völlig problemlos, und ohne spezielle
Interpretationen. Das würde sogar funktioneren, wenn du den Wert Pi für
1 Sekunde (oder 1 Tag, 1 Woche, 1 Jahr, 1 Millisekunde, oder sonst was,
sogar mit sieben drittel Stunden, oder fünfundzwanzig
siebenunddreißigstel Wochen, usw.) an nimmst.

Da eine INT Zeit die in INT dividiert wird ohne Rest zurückgegeben wird
(keine Rundung) kann diese direkt z.B. mit 60 geteilt werden und ich
erhalte die Zeit in Minuten - u.s.w.

Und was bitte machst du mit Millisekunden usw.?

Solches macht der Zeitinterpreter.

Die richtige Reihenfolge für ein Datum ist:
Jahr.Monat.Tag.Stunde:Minute:Sekunde,Millisekunde
Daraus ergibt sich eine absteigende Rechen-Reihenfolge von der grössten
Einheit "Jahr" zur kleinsten "Sekunde", Rest "Millisekunde"
  Zeitwert / 1 Jahr = Jahre
  (Zeitwert - Jahre)/ 1 Tag = Tage
  (Zeitwert - Jahre - Tage) / 1 Stunde = Stunden
  (Zeitwert - Jahre - Tage - Stunden) / 1 Minute = Minuten
  ...
Die Millisekunden findest Du im Rest nach der Sekundendivision durch
Subtraktion aller vorherigen Werte.

Solches ist in der Regel schon in der Alu hinterlegt; kommt hier auf die
Hardware an = BIOS / Firmware je nach Hersteller...
Wie das genau in Calc abgebildet ist weiss ich nun tatsächlich nicht.
Soweit mir bekannt ist Calc jedoch in "C" programmiert und dürfte daher
die ALU für die Interpretation nutzen. Natürlich können Algorithmen auch
diskret aus-programmiert und andere Wege genutzt sein. Das Scheint mir
hier sogar so zu sein, da ja diese Doppeldeutigkeit von "M" für Monat
und Minute in Calc existiert!

ps. Nanosekunden sind nicht im Umfang von Zeitstempeln. Müssen solche
verarbeitet werden; in Calc kaum möglich; muss dafür ein Interrupt
genutzt werden, da die Prozessorleistung solches sonst nicht abgreifen
kann.
Im Maschinenbau kommt solches z.B. bei Inkrementalgeber vor und bedingt
eine entsprechende Hardwarestruktur und eine Firmware die Interrupt-
Funktionen zur Verfügung stellt.

Der wer? Meinst du etwa das Teil, mit dem eine Zeitreisemaschine
gesteuert wird?

Wolfgang

Schönen Tag

Marino

Hallo Marino,

Wenn das, was Du hier sagst richtig ist; das die Zeiten in Calc in
Fliesskomma-Werten hinterlegt sind; dann werden bei gewissen
Rechenoperationen unweigerlich Fehler auftrete.
Nicht gerade das Gesuchte. In INT würde solches nie auftreten. Auf
Leitsystemen mit Echtzeiteinträgen ist es Bedingung, dass die
Zeitstempel kohärent sind!
Gerade beim Abgleich von Letzt-wert, was in Leitebene als Bedingung
für die Neuwert-Gültigkeit steht (DCP/IP Daten-Überholungen), eine
absolute Bedingung.
Somit kommt Calc als Tabelle für Datenhinterlegung für diesen Zweck
nicht in Frage!

In solchen Fällen müsstest du Zeitangaben in INT _codieren_. Es hält
dich ja niemand davon ab, Zeiträume oder Zeitpunkte z.B. in Sekunden
oder Millisekunden zu speichern. Im Falle eines Zeitpunktes müsstest du
allerdings einen passenden Zeitpunkt als Nullpunkt festlegen. Du
könntest den Zeitpunkt des Messbeginns (möglicherweise als String) in
die Tabelle schreiben und diesem den Wert 0 (Millit-)Sekunden zuweisen.
Alle weiteren Zeitwerte werden dann als INT-Wert bezüglich dieses
Startwertes abgelegt.

> Der wer? Meinst du etwa das Teil, mit dem eine Zeitreisemaschine
> gesteuert wird?

Nein, das ist ein "Fluxkompensator" :wink:

Admin04