![]() |
Datum / Zeit Vergleichen
Hallo.
Warum bekomme ich bei folgender Abfrage das Ergebnis '01.01.2000 09:58:00'? Ich hatte '01.01.2000 10:02:00' erwartet.
Delphi-Quellcode:
DateTimeToStr(StrToDateTime('01.01.2000 10:00:00') + StrToDateTime('01.01.1000 00:02:00') - StrToDateTime('01.01.1000 00:00:00')
Gibt es nicht eine einfacheren Weg 2 Minuten zu einem Datei-Datum zu addieren und dann mit der jetzigen Zeit zu vergleichen? Ich versuche das im Moment so:
Delphi-Quellcode:
Ist aber wohl nicht im Sinne des Erfinders oder?
if (FileDateToDateTime(Datei.Time) + StrToDateTime('01.01.1000 00:02:00') - StrToDateTime('01.01.1000 00:00:00')) < now then // Datum älter als 2 min?
Freue mich auf eure Beiträge... |
Re: Datum / Zeit Vergleichen
z.B. auch so:
if (FileDateToDateTime(Datei.Time) + 2*oneMinute) < now then... |
Re: Datum / Zeit Vergleichen
Schau Dir mal die Funktion StrToTime an.
Die macht glaube ich das, was Du brauchen könntest. |
Re: Datum / Zeit Vergleichen
Oder so:
Delphi-Quellcode:
Grüße vom marabu
uses
DateUtils; var fn: TFileName; dt: TDateTime; begin fn := ParamStr(0); dt := FileDateToDateTime(FileAge(fn)); if CompareDateTime(dt - Now, 2 * OneMinute) = GreaterThanValue then ShowMessage('Datei ist älter als 2 Minuten'); end; |
Re: Datum / Zeit Vergleichen
Zitat:
Z.B. wird also der Datumswert 30.12.1899 mit dem internen Wert 0 dargestellt. Der 01.01.1000 wäre dann also 328716 Tage davor, ergo beträgt der interne Wert einer dazugehörenden DateTime-Größe -328716. So weit so gut. Jetzt müsste aber ein Zeitpunkt, der 2 Minuten näher an dem 30.12.1899 liegt, dementsprechend eigentlich auch intern etwas näher an der 0 (also dem 30.12.1899) angesiedelt sein. Tut er aber nicht!!! Anstatt dass diese 2 Minuten den Abstand zur 0 entsprechend verringern würden, wird dieser dadurch nur nochmals vergrößert (d.h. dieser 2 Minutenanteil wird einfach nur so hinters Komma drangehängt, ohne eigentlich richtig reingerechnet zu werden! Warum auch immer.) ...und wegen dieser internen (imho) Unlogik können auch diese ansonsten so normalen schönen Rechnungen mit derartigen Datumswerten (älter als 30.12.1899) nicht mehr aufgehen. |
Re: Datum / Zeit Vergleichen
Ich habe ein ähnliches Problem was ich einfach nicht in den Griff bekomme, würde mich freuen wenn jemand Rat weiß. Ich will einen Parkautomaten nachbauen, der bei bestimmtem geldeinwurf eine spezielle zeit auf die aktuelle draufrechnet. ich glaube der vergleich funktioniert nicht, denn der teil wo zeiten nicht verglichen werden sollen funktioniert, der andere aber nicht.
Delphi-Quellcode:
danke schonmal, exploitbashor
function TZeit.endzeit : string;
var differenz, endtime : TDateTime; ende, frueh, spaet : string [8]; begin frueh := '09:00:00'; spaet := '19:00:00'; if geld > 0 then begin {Falls aktuelle Zeit vor 9 und nach 19 Uhr ist soll bei verschiedenen Geldwerten die jeweilige Zeit auf 9 Uhr draufgerechnet werden} if ((now < strtotime(frueh)) and (now > strtotime(spaet))) then begin if geld = 0.5 then ende := timetostr(strtotime(frueh)+strtotime('00:30:00')); if geld = 1 then ende := timetostr(strtotime(frueh)+strtotime('01:00:00')); if geld = 1.5 then ende := timetostr(strtotime(frueh)+strtotime('01:30:00')); if geld = 2 then ende := timetostr(strtotime(frueh)+strtotime('02:00:00')); end else {Falls die aktuelle Zeit zwischen 9 und 19 uhr liegt soll einfach die entsprechende Zeit draufgerechnet werden --nur dieser teil funktioniert-- } begin if geld = 0.5 then ende := timetostr(now+strtotime('00:30:00')); if geld = 1 then ende := timetostr(now+strtotime('01:00:00')); if geld = 1.5 then ende := timetostr(now+strtotime('01:30:00')); if geld = 2 then ende := timetostr(now+strtotime('02:00:00')); end; {Falls nun die bezahlte zeit über 19 uhr liegt soll der rest der bezahlten zeit auf 9 uhr des folgetages draufgerechnet werden (datum unwichtig, nur uhrzeit)} if (strtotime(ende) > strtotime('19:00:00')) then begin differenz := strtotime(ende) - now; endtime := strtotime(frueh) + differenz; ende := timetostr(endtime); end; endzeit := ende; end; end; |
Re: Datum / Zeit Vergleichen
Hi,
Now = Date + Time also funktionieren deine Vergleiche nicht, da du Datum+Uhrzeit mit nur Uhrzeit vergleichst. Verwende anstelle von Now nur Time, dann sollte es gehen. P.S. Ich würde hier bei der ganzen Vergleicherei niemals mit StrToTime oder so arbeiten. Mann kann vielbesser Werte berechnen. z.B. ist eine Stunde = 1 / 24 und somit 9:00 = 9 * 1 / 24 und so weiter. Gruss Thomas. |
Re: Datum / Zeit Vergleichen
Zitat:
OneHour, OneMinute, OneSecond, OneMillisecond |
Re: Datum / Zeit Vergleichen
Also ich habe jetzt "now" durch "time" ersetzt, doch jetzt bekomme ich beim obersten fall, wenn die zeit zwischen 19 und 9 uhr liegt und ich 0,5 € einwerfe nicht die zeit 9:30 sondern 9:29:59, bei 1 € 9:59:59 usw. also immer eine sekunde zu spät und ich weiß nicht wieso...
der teil, wo der teil bis 19 uhr angerechnet werden soll und der rest auf den folgetag funktioniert gar nicht, es passiert das selbe wie beim ersten fall, es werden einfach alle beträge auf den folgetag angerechnet und nicht die differenz. woher kommt das? edit: ich habe gerade nochmal geschaut und obwohl 19 uhr überschritten ist übergeht er die obere bedingung (zeitvergleich funktioniert immer noch nicht) und er setzt die normale zeit und errechnet die differenz etc. und gibt bei 0,5€ 9:29:59 aus. |
Re: Datum / Zeit Vergleichen
Moin ...,
0,5 € is'n Scherz oder? |
Re: Datum / Zeit Vergleichen
Hallo,
vielleicht hilft auch ein Blick in die ESBDATES - Library. Diese Library (ist eigentlich "nur" eine Unit die man einbinden muss) enthält für sowas eine Menge Arithmetik- und Konvertierungsfunktionen. Original kommt sie von ESB-Consultancy, ist aber meines Wissens "Freeware". Google einfach mal danach... |
Re: Datum / Zeit Vergleichen
Hallo,
wenn schon Time, dann zu Beginn in eine lokale Variable packen, sonst wird ja beim ersten Time (Vergleich) und beim zweiten u.U. ein anderer Wert ermittelt (die Zeit läuft ja weiter). Ein anderes Problem ist, dass Time auch die Millisekunden benutzt, bei einem Vergleich könnte das Probleme geben. Ich habe das über eine CutToMin Methode gelöst
Delphi-Quellcode:
Heiko
function CutToMin(theTime: TDateTime): TDateTime;
var Hours, Min, Sec, MSec: Word; begin DecodeTime(theTime, Hours, Min, Sec, MSec); Result:= EncodeTime(Hours, Min, Sec, 0) end; |
Re: Datum / Zeit Vergleichen
also jetzt läufts besser! ich habe den vergleich jetzt mit der funktion comparetime(a,b :TDateTime) gemacht und er funktioniert!
das einzige was immer noch nicht geht ist der überschlag der auf den nächsten tag angerechnet wird. da muss der fehler bei dem ausrechnen liegen... |
Re: Datum / Zeit Vergleichen
Hallo,
Besorg die dunit, füttere deine Testmethode mit Daten und debugge es einfach. edit: naja wolln wir mal nicht so sein ;) kommt dir überhaupt hier rein ?
Delphi-Quellcode:
NÖ!
if ((now < strtotime(frueh)) and (now > strtotime(spaet))) then
Now kann nie kleiner UND grösser sein, wenn schon, dann ODER
Delphi-Quellcode:
Was ich hier generell vermisse, ist das Datum.
if ((now < strtotime(frueh)) OR (now > strtotime(spaet))) then
Es wird hier ja nur mit Zeit gerechnet. Der Trick ist, einfach 1 (eins) dazuzuaddieren (=24 Stunden), da brauchst vielleicht später. Heiko PS: Mit F8 setzt man breakpoints. ;) |
Re: Datum / Zeit Vergleichen
Hallo,
ich würde einen anderen Ansatz wählen. Ich definiere eine ParkZeit analog zu TDateTime. Ein ParkTag dauert dann genau so lange, wie die auf der Parkuhr bekannt gegebene gebührenpflichtige Zeit. Der Einfachheit nehme ich an, dass die gebührenpflichtige Zeit ein einziger zusammenhängender Tageszeitraum ist. Wäre das die Zeit von morgens 9:00 Uhr bis abends 18:00 Uhr und hätte ich für zwanzig Stunden bezahlt, dann liefert mir DateTimeToStr(ParkzeitEnde(20/24, 9/24, 18/24)) den Aufdruck für mein Park-Ticket:
Delphi-Quellcode:
Getippt und nicht getestet.
function ParkzeitEnde(dtBezahlt, dtBeginn, dtEnde: TDateTime): TDateTime;
begin // Berechne Beginn der gebührenpflichtigen Parkzeit if TimeOf(Now) < dtBeginn then Result := DateOf(Now) + dtBeginn else if TimeOf(Now) >= dtEnde then Result := DateOf(Now) + dtBeginn + 1 else Result := Now; // Wandle von DateTime in "ParkTage" Result := Trunc(Result) + (Frac(Result) - dtBeginn) / (dtEnde - dtBeginn); // Berechne Ende der Parkzeit Result := Result + dtBezahlt / (dtEnde - dtBeginn); // Wandle "ParkTage" in DateTime Result := Trunc(Result) + Frac(Result) * (dtEnde - dtBeginn) + dtBeginn; end; Grüße vom marabu |
Re: Datum / Zeit Vergleichen
danke für die viele hilfe, aber ich würds lieber so lassen wies ist, größtenteils funktionierts ja auch. das einzige was nicht geht ist irgendwie zwei zeiten zu subtrahieren... leider
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:35 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-2025 by Thomas Breitkreuz