![]() |
Delphi-Version: XE2
Industrieminuten
Guten Morgen zusammen,
bevor die Frage aufkommen sollte: Ja, ich habe die SuFu genutzt. Mein Problem ist folgendes: Ich möchte zwei TDateTimes vergleichen und mir die Differenz in Stunden ausgeben lassen. Mir sind die Funktionen YearBetween, HoursBetween, etc. bekannt und leider auch zu ungenau. Deshalb habe ich eine eigene Funktion geschrieben:
Delphi-Quellcode:
Das Problem was sich nun stellt ist, dass wenn ich beispielsweise folgende Rechnung habe:
function TXmlfunction.GetDate(dtVon, dtBis: TDateTime): string;
var dtDate: TDateTime; sHour: string; sTime: string; begin dtDate := (dtBis - dtVon); sHour := TimeToStr(dtDate); sTime := FloatToStr(StrToFloat(sHour[1] + sHour[2]) + StrToFloat(sHour[4] + sHour[5]) / 60); result := sTime; end; 22.01.2015 10:00:00 - 21.01.2015 10:00:00, dann ist das Ergebnis 0, da er durch den Befehl
Delphi-Quellcode:
nur die Stunden nimmt.
TimeToStr()
Ich kann aber nicht
Delphi-Quellcode:
nutzen, weil ich so nur Müll rausbekomme.
DateTimeToStr()
Frage: Wie stelle ich das jetzt am geschicktesten an? Gruß Jan |
AW: Industrieminuten
Wozu dieses ganze String-Geraffel, wäre z.B. DecodeDateTime nicht zielführender?
|
AW: Industrieminuten
Oder
![]() ![]() ![]() Abgesehn von den fehleranfälligen Stringbehandlungen ... StrToFloat, obwohl man nur ganze Zahlen rein gibt. Zitat:
Wie wäre es, wenn du auch die Tages/Monats/Jahres-Anteile mit einrechnest? :roll: Und was ist mit den MinutenSekunden-Anteilen? 22.01.2015 10:00:00 - 22.01.2015 09:30:00 Nur das Markierte wird von dir beachtet und der Rest einfach ignoriert, da kann das doch nicht richtig funktionieren. |
AW: Industrieminuten
Nach kurzer Überlegung: die Differenz zweier TDateTime ist doch in Tagen, um also auf die Stunden zu kommen, müsste man sie doch lediglich mit 24 multiplizieren, oder mache ich da einen Denkfehler?
|
AW: Industrieminuten
Zitat:
UPDATE Aber bitte keine MagicValues im Code benutzen sondern ![]() UPDATE 2 Die einzige Zahl, die keine MagicValue ist, ist die 42 :mrgreen: |
AW: Industrieminuten
Zitat:
Sherlock |
AW: Industrieminuten
Danke schonmal für die Antworten. Mein Programm erfasst Arbeitszeiten.
Zitat:
Zitat:
Zitat:
Delphi-Quellcode:
Gruß
function TXmlfunction.GetDate(dtVon, dtBis: TDateTime): string;
var dtDate: TDateTime; begin dtDate := ((dtBis - dtVon)*24); result := DateTimeToStr(dtDate); end; Jan |
AW: Industrieminuten
Zitat:
(hab da schnell und heimlich da oben meine Antwort angepasst) Zitat:
Darum gibt es auch diese "sprechenden" Konstanten. (Oder man schreibt ständig "unnötige" Kommentare in seinen Code :stupid:) DateTimeToStr wird nur zum "Konvertieren" von DateTime-Werten benutzt (Tage = ganzzahliger Anteil und Nachkommateil ist Stunden/Minuten/Sekunden ... bzw. "Tage" seit Anfang) Mal "24" (die Fernsehserie) ist das natürlich kein DateTime-Wert mehr, sondern ein Stunden-Wert. (FloatToStr, Format, gerundet und dann IntToStr usw.) |
AW: Industrieminuten
So ungefähr, aber die 24 ist nun der angesprochene Magic Value: da steht eine 24 und niemand weiß, was sie zu bedeuten hat. Aus diesem Grund benutzt man Konstanten mit sprechenden Bezeichnern.
Delphi-Quellcode:
So wird einem auch nach Jahren sofort klar, dass das mit Stunden je Tag zu tun hat.
dtDate := ((dtBis - dtVon)*DateUtils.HoursPerDay);
|
AW: Industrieminuten
Zitat:
Check, ich probier es gleich mal aus. :) Gruß Jan Edit: DateUtils.HoursPerDay sind bei mir zwei undeklarierte Bezeichner. Ich habe in den Uses System.DateUtils eingebunden. Bin ich dumm oder sehe ich den Fehler nicht? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz