Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Datum / Zeit Vergleichen (https://www.delphipraxis.net/79945-datum-zeit-vergleichen.html)

mymuschy 31. Okt 2006 16:05


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:
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?
Ist aber wohl nicht im Sinne des Erfinders oder?

Freue mich auf eure Beiträge...

TStringlist 31. Okt 2006 16:12

Re: Datum / Zeit Vergleichen
 
z.B. auch so:

if (FileDateToDateTime(Datei.Time) + 2*oneMinute) < now then...

RavenIV 31. Okt 2006 16:18

Re: Datum / Zeit Vergleichen
 
Schau Dir mal die Funktion StrToTime an.
Die macht glaube ich das, was Du brauchen könntest.

marabu 31. Okt 2006 16:36

Re: Datum / Zeit Vergleichen
 
Oder so:

Delphi-Quellcode:
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;
Grüße vom marabu

TStringlist 31. Okt 2006 16:53

Re: Datum / Zeit Vergleichen
 
Zitat:

Zitat von mymuschy
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')

Grund: Wenn Datumswerte vor dem 30.12.1899 liegen, dann werden diese intern (numerisch) als negative Werte dargestellt, allerdings in einer irgendwie etwas unlogischen (bizarren) Weise und weswegen einfach die normalen Rechnungen damit nicht mehr funktionieren!

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.

exploitbashor 1. Nov 2006 15:28

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:
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;
danke schonmal, exploitbashor

thkerkmann 1. Nov 2006 16:02

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.

TStringlist 1. Nov 2006 16:57

Re: Datum / Zeit Vergleichen
 
Zitat:

Zitat von thkerkmann
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.

In "DateUtils" sind übrigens genau hierfür schon Konstanten definiert, welche heißen:

OneHour, OneMinute, OneSecond, OneMillisecond

exploitbashor 2. Nov 2006 17:51

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.

Hobby-Programmierer 3. Nov 2006 06:35

Re: Datum / Zeit Vergleichen
 
Moin ...,
0,5 € is'n Scherz oder?


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:10 Uhr.
Seite 1 von 2  1 2      

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