Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Code von Zeitrechnung verbessern (https://www.delphipraxis.net/202694-code-von-zeitrechnung-verbessern.html)

DieDolly 28. Nov 2019 12:30

Code von Zeitrechnung verbessern
 
Mir kam ein Stück Code über den Weg. Das ist schon was her.
Das kann man auch mit TimeSpan machen aber ich würde gerne verstehen, wie man das hier verbessern kann?

Delphi-Quellcode:
 LDivisor := 60;
 LSeconds := Seconds mod LDivisor;
 LMinutes := (Seconds div LDivisor) mod LDivisor;
 LHours := (Seconds div LDivisor) div LDivisor;
 LDays := LHours div 24;
 LHours := LHours mod 24;
 LMonths := LDays div 30;
 LDays := LDays mod 30;
 LYears := LMonths div 12;
 LMonths := LMonths mod 12;

TiGü 28. Nov 2019 12:46

AW: Code von Zeitrechnung verbessern
 
Bitte ankreuzen, in welcher Hinsicht verbessern?

[ ] Geschwindigkeit
[ ] Lesbarkeit/Verständlichkeit
[ ] Quelltextlänge/Kürze
[ ] Egal, ich stelle gerne programmiertechnisch-esoterische Fragen
[ ] Ich habe gar kein richtiges Problem, versuche mich nur abzulenken

DieDolly 28. Nov 2019 12:53

AW: Code von Zeitrechnung verbessern
 
Zitat:

[ ] Geschwindigkeit
[X] Lesbarkeit/Verständlichkeit
[X] Quelltextlänge/Kürze
[X] Egal, ich stelle gerne programmiertechnisch-esoterische Fragen
[ ] Ich habe gar kein richtiges Problem, versuche mich nur abzulenken
:thumb:

dummzeuch 28. Nov 2019 13:27

AW: Code von Zeitrechnung verbessern
 
Zitat:

Zitat von DieDolly (Beitrag 1452369)
Mir kam ein Stück Code über den Weg. Das ist schon was her.
Das kann man auch mit TimeSpan machen aber ich würde gerne verstehen, wie man das hier verbessern kann?

Delphi-Quellcode:
 LDivisor := 60;
 LSeconds := Seconds mod LDivisor;
 LMinutes := (Seconds div LDivisor) mod LDivisor;
 LHours := (Seconds div LDivisor) div LDivisor;
 LDays := LHours div 24;
 LHours := LHours mod 24;
 LMonths := LDays div 30;
 LDays := LDays mod 30;
 LYears := LMonths div 12;
 LMonths := LMonths mod 12;

Zumindest der letzte Teil ist schlicht falsch: Monate haben nicht immer 30 Tage.
Es sei denn, man ist eine Bank und berechnet Zinsen, dann ist das komischerweise erlaubt. Trotzdem ist die Berechnung dann falsch.

DieDolly 28. Nov 2019 13:31

AW: Code von Zeitrechnung verbessern
 
Deswegen bin ich hier, um das zu verbessern. Ich bin leider nicht ganz firm auf dem Gebiet.

Andreas13 28. Nov 2019 13:54

AW: Code von Zeitrechnung verbessern
 
Die korrekte Berechnung ist wesentlich komplizierter, weil auch die unterschiedliche Länge der Monate, die Schaltjahre & evtl. der Übergang zwischen Julianischem und Gregorianischem Kalender berücksichtigt werden müssen.
Gruß, Andreas

Rollo62 28. Nov 2019 14:33

AW: Code von Zeitrechnung verbessern
 
Warum verlässt Du dich nicht auf die DateUtils für solche Umrechnungen ?

Uwe Raabe 28. Nov 2019 15:13

AW: Code von Zeitrechnung verbessern
 
TTimeSpan kann das bis zu Days auf einen Aufruf (FromSeconds) herunterbrechen. Für Monate und Jahre geht des wegen der unterschiedlichen Längen dieser Einheiten nun mal nicht.

DieDolly 28. Nov 2019 16:21

AW: Code von Zeitrechnung verbessern
 
TTimeSpan und DateUtils möchte ich nicht verwenden.
Ich möchte aus Sekunden Jahre, Monate, Tage, Stunden Minuten und Sekunden machen. Das klappt mit dem Code da oben auch aber ich frage mich, wie man den verbessern kann denn der ist bestimmt alles andere als richtig.

Union 28. Nov 2019 16:28

AW: Code von Zeitrechnung verbessern
 
Wenn Du generell gewillt bist, bestehende Library-Routinen einzusetzen würde ich Delphi-Referenz durchsuchenDecodeDateTime empfehlen.

DieDolly 28. Nov 2019 16:29

AW: Code von Zeitrechnung verbessern
 
Ich habe kein Datum was ich umrechnen möchte. Ich habe eine Sekundenangabe, die zu einer Zeitangabe wie in einem Videoplayer umgerechnet werden sollen.
Das macht mein Code auch aber ich frage, wie man den verbessern kann.

Keine Alternatriven bitte.

jfheins 28. Nov 2019 17:04

AW: Code von Zeitrechnung verbessern
 
Du kannst die Monate weglassen (zu variabel) und nur noch Tage + Jahre angeben. Für letztere kannst du auch mit dem Mittelwert (365.2425 Tage pro Jahr) rechnen.

DieDolly 28. Nov 2019 17:06

AW: Code von Zeitrechnung verbessern
 
Zitat:

Du kannst die Monate weglassen (zu variabel) und nur noch Tage + Jahre angeben.
Wie genau meinst du das? Ich verstehe nicht warum ich eine solche Information weglassen sollte.

Ich dachte eigentlich an eine rechnerische Verbesserung und nicht an eine durch Löschen von irgendwelchen Informationen die man braucht.

jfheins 28. Nov 2019 17:39

AW: Code von Zeitrechnung verbessern
 
Naja, du sagtest ja
Zitat:

Ich habe eine Sekundenangabe, die zu einer Zeitangabe wie in einem Videoplayer umgerechnet werden sollen.
Und ich würde da eben empfehlen, gar keine Monate anzugeben. Also werden aus 36.767.506 Sekunden eben einfach "1 Jahr, 60 Tage, 7 Stunden, 22 Minuten und 34 Sekunden"
Monate hier anzugeben, kann eigentlich gar nicht richtig funktionieren. (sind 60 Tage jetzt 2 Monate 0 Tage oder 2 Monate und 1 Tag?)

DieDolly 28. Nov 2019 17:44

AW: Code von Zeitrechnung verbessern
 
Das mit dem Videoplayer war nur ein Beispiel. Ich möchte natürlich sämtliche Informationen behalten!

Rollo62 28. Nov 2019 17:46

AW: Code von Zeitrechnung verbessern
 
Delphi-Quellcode:
 LMonths := LDays div 30; // --> ! Hier passt es nicht, sind das sowas wie "Industrietage" ?
 LDays := LDays mod 30;   // --> ! dito
Wenn Du damit rechnest, und Dir die reale Zeit egal ist, dann ist es doch OK für dich.
Was genau willst Du denn überhaupt erreichen, beste Performance ?

Luckie 28. Nov 2019 17:50

AW: Code von Zeitrechnung verbessern
 
Ich glaube, du bist dir der Problematik der Monate nicht bewusst. Die Monate sind unterschiedlich lang. Und sind sie nicht mal konstant lang siehe Monat Februar. Wenn du jetzt eine Zeitspanne hast. Sagen wir 50 Jahre, dann musst du die Anzahl der enthaltenen Schaltjahre berücksichtigen und entsprechend die Länge des Monats Februar. Das ist aber nur die halbe Miete. Es kommt noch darauf an in welche Jahre die Zeitspanne fällt. Denn die Anzahl der Schaltjahre kann variieren in welche Jahre die Zeitspanne fällt. Das sind komplexe Berechnungen, wenn man überhaupt alleine mit Berechnungen das Problem lösen kann und nicht noch eine Tabelle benötigt zum Nachschlagen.

DieDolly 28. Nov 2019 17:56

AW: Code von Zeitrechnung verbessern
 
Zitat:

Was genau willst Du denn überhaupt erreichen, beste Performance ?
Es soll nur mathematisch korretekt sein. Schaltjahre und sowas sind mir total egal weil das noch da mit einzubauen würde alles sprengen.

Löst TimeSpan.FromSeconds() das mit den Schaltjahren und so denn richtig?
Edit hat sich erledigt. TimeSpan kann keine Monate und Jahre anzeigen.

Es gfeht wie zuvor nur um den Codeschnipsel im Eingangspost. Belassen wir es einfach bei 30 Tagen. Es geht mir nur drum, ob das mit Modulo usw richtig ist.

Rollo62 28. Nov 2019 18:16

AW: Code von Zeitrechnung verbessern
 
Wenn es nur um Zeit geht kannst Du es ja mit 360 "Industrietagen" glattbügeln.
Wenn es aber mit der realen Zeit irgendwie in Zusammenhang stehen muss,
würde ich immer mit Startdatumzeit, Differenzzeit und Enddatumzeit rechnen.

So kann man die Differenz zw. Start-End bekommen, oder umgekehrt das Ende aus Startzeit + Differenzsekunden berechen.

Ist aber halt nicht einfach nur A + B, sondern eine Kombination aus den Datumsfunktionen,
je nachdem was genau Du erreichen möchtest.

DieDolly 28. Nov 2019 18:21

AW: Code von Zeitrechnung verbessern
 
Zitat:

würde ich immer mit Startdatumzeit, Differenzzeit und Enddatumzeit rechnen.
Diese Informationen gibt es nicht. Es gibt nur diese Sekunden.

Zitat:

je nachdem was genau Du erreichen möchtest.
Ich wollte eigentlich nur wissen, wie man den Code verbessert den ich eingangs erwähnt habe. Mehr nicht.
Dass man das jetzt auf 3 Seiten strecken muss, ist mir ein Rätsel.

Luckie 28. Nov 2019 18:42

AW: Code von Zeitrechnung verbessern
 
Weil man nicht weiß, wie du ihn verbessern willst und jegliche Verbesserung ihn sehr komplex machen würde. Die einfachen Verbesserungen lehnst du ja ab.

DieDolly 28. Nov 2019 18:46

AW: Code von Zeitrechnung verbessern
 
Dann nochmal ganz klar damit jeder es versteht. Ob 30 tage, Schaltjahr oder 31 Tage ist total egal.

Es geht nur da drum den bestehenden Code zu verbessern. Ich weiß nicht, ob das zu kompliziert ist wie ich die Monate, Tage und so mit Modulo ausrechne.

Hobbycoder 28. Nov 2019 22:12

AW: Code von Zeitrechnung verbessern
 
Da, außer bei den Monaten, alles in der Zeitdarstellung nunmal in festen Grenzen gehalten ist, du aber eben diese Monate mit fest 30 Tagen annehmen willst, wird nicht wirklich klar was du daran noch verbessern willst.

Einzig die Genauigkeit wenn man exakte Monatslängen verwenden würde, oder vielleicht die Geschwindigkeit wenn man das ganze in Assembler umsetzen würde.

hoika 28. Nov 2019 22:12

AW: Code von Zeitrechnung verbessern
 
Hallo,
das Strecken auf 3 (4) Seiten hast du selbst erreicht...,
indem du keine genauen Angaben machst, was Du konkret erreichen willst.
Bzw. wo Du eventuelle Fehler siehst.

Bsp:
LMonths := LDays div 30;

Anzahl der Monate ergibt mit Tage div 30 doch total ungenaue Monate.
Wir schreiben "ist problematisch", Du schreibst "ist egal, wir lassen das div 30"
und wunderst dich dann über Fragen dazu?


Bitte einmal kurz und knapp (wie früher im Mathe-Unterricht ;) )
Was konkret ist Dein Problem mit dem Code aus Posting #1.

gegeben (geg.:)
gesucht (ges.:)

Hach, die gute alte Schulzeit ;)

DieDolly 28. Nov 2019 22:21

AW: Code von Zeitrechnung verbessern
 
Zitat:

Bitte einmal kurz und knapp
Der Code funktioniert.
Ein Problem gibt es nicht.
Ich möchte den Code nur optimieren. Das heißt eventuell kürzen, unnötige und falsche Rechenoperationen entfernen.

Michael II 28. Nov 2019 22:23

AW: Code von Zeitrechnung verbessern
 
Zitat:

Zitat von DieDolly (Beitrag 1452410)
Dann nochmal ganz klar damit jeder es versteht. Ob 30 tage, Schaltjahr oder 31 Tage ist total egal.

Es geht nur da drum den bestehenden Code zu verbessern. Ich weiß nicht, ob das zu kompliziert ist wie ich die Monate, Tage und so mit Modulo ausrechne.

Du möchtest eine Zeitdauer, welche in Sekunden bekannt ist in ein für uns Menschen lesbareres Format umwandeln.

Du kannst nicht einerseits schreiben, dass es dir total egal sei wie lang die Monate seien und andererseits fordern, dass die ganze Sache mathematisch korrekt sei. Beides aufs Mal geht schlicht nicht (log. Widerspruch).

Ohne Probleme korrekt umwandeln kannst du

f: Sekunden ¦-> Tage, Stunden, Minuten, Sekunden

Es macht keinen Sinn die Tage weiter in Monate und Jahre aufzuteilen, weil Monate/Jahre nicht alle gleich viele Tage haben.

Du möchtest ja sicher, dass die Umkehrfunktion
f^(-1): "lesbareres Format" ¦-> Sekunden
definiert ist; d.h. dass die Anzahl Sekunden berechenbar sind.

Das ist mit
f^(-1): Tage, Stunden, Minuten, Sekunden ¦-> Sekunden
gegeben.

Aus einer Angabe
Jahre, Monate, Tage, Stunden, Minuten, Sekunden
hingegen ist es nicht möglich die Sekunden zu berechnen.

_______________________________________

Nur wenn du die Anzahl Sekunden seit einem gewissen Datum als Angabe hättest - beispielsweise 9'002'934 Sekunden seit dem 1.1.2019 0h00m00s - machte die Angabe j Jahre, mo Monate, t Tage, h Stunden, m Minuten, s Sekunden seit 1.1.2019 Sinn. Denn du könntest aus (j,mo,t,h,m,s) wieder auf s schliessen.

DieDolly 28. Nov 2019 22:50

AW: Code von Zeitrechnung verbessern
 
Lassen wir das. Ich renne hier wohl gegen eine Wand.
Keine weiteren Vorschläge mehr. Bringt ja eh nix wenn ich sage "Ist egal ob 30 Tage oder 31!"

Jumpy 29. Nov 2019 08:34

AW: Code von Zeitrechnung verbessern
 
In der jetzigen Form geshst du ja davon aus, dass die Monate 30 Tage haben und somit das Jahr 360 Tage. Ggf. kannst du minmal genauer werden, wenn du aus der Anzahl der Tage/365 zunächst die Jahre berechnest und dann aus dem Rest der Tage die Monate usw.?

Problem dabei: Ist der Rest >= 360 Tage, und du teilst das durch 30 für die Monate können da 12 oder 13 rauskommen. Ist also fraglich ob das hilft.

Oder du rechnest mit genaueren Durschnittswerten für Monate und Jahre und benutzt dann halt nicht div/mod sondern machst das zu Fuß, weil du da ja keine Integer Werte mehr hast:

Delphi-Quellcode:
Jahre:=Trunc(Tage/365.2425);
Resttage:=Tage-Jahre*365.2425;
Monate:=Resttage/(365.2425/12);
Resttage:=Resttage-Monate*(365.2425/12);

Sherlock 29. Nov 2019 09:45

AW: Code von Zeitrechnung verbessern
 
Es ist nunmal mathematisch eben nicht korrekt "31=30" zu sagen. Aber eine mathematische Korrektheit und genauso einen Ausschluß von Fehlern hast Du Dir selbst gewünscht. So kommt man auf 4 und voraussichtlich mehr Seiten.

:lol:

Sherlock

OlafSt 29. Nov 2019 10:41

AW: Code von Zeitrechnung verbessern
 
Leute, gebt ihm doch endlich die Antwort, die er will:

Lass den Code so, besser geht es nicht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:28 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz