Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Zeit zwischen 2 daten (https://www.delphipraxis.net/152024-zeit-zwischen-2-daten.html)

wallwriht 8. Jun 2010 20:55

Zeit zwischen 2 daten
 
Hi Leute,


Ich habe 2 Daten und möchte die zeit zwischen ihnen auslesen.
Habs bislang so probiert:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
Tage,t1,t2 : Tdatetime;
zeit :Ttime;
s1,s2:string;


begin
Label1.Caption:=Timetostr(Now);
Label2.Caption:=Datetimetostr(Now);

s1:=datetimetostr(now);
s2:='03.06.2010 18:34:30';
Label3.Caption:=s1 + '  ' + s2;;
t1:=strtodatetime(s1);
t2:=strtodatetime(s2);
Tage:=t1 - t2;
Label4.Caption:=datetimetostr(Tage);

end;


Dies funktioniert aber nicht, es ergiebt immer das gleiche: 4.1.1900 .....
wo liegt der fehler?


lg
Wallwriht



als hinweis noch: Die label 1-3 sind zur hilfe um die einzelnen Daten zu zeigen.

mkinzler 8. Jun 2010 20:58

AW: Zeit zwischen 2 daten
 
Schau dir mal die Unit DateUtils an

s.h.a.r.k 8. Jun 2010 21:00

AW: Zeit zwischen 2 daten
 
TDateTime ist intern nur ein Extended, d.h. dort steht zurzeit ein Wert von über 30000 drin. Das Startdatum, d.h 0, ist der 1.1.1900 (soweit ich das noch weiß). Ein Tag zählt dabei als 1. Siehe:
Delphi-Quellcode:
var
  Timestamp : TDateTime;
begin
  Timestamp := Now();
  Timestamp := Timestamp + 1; // Einen Tag dazu addieren
end;
Das Problem bei dir ist, dass du dir das konkrete Datum ausgeben lässt. Es sind zwar drei Tage vergangen, aber du musst das immer relativ zum Startdatum sehen. So wie du es machst ist es relativ vom 1.1.1900 aus, plus die Difference.

Wolfgang Mix 8. Jun 2010 21:05

AW: Zeit zwischen 2 daten
 
Schau dir mal die Funktion DaysBetween (F1) an

DeddyH 8. Jun 2010 21:07

AW: Zeit zwischen 2 daten
 
Zitat:

Delphi-Quellcode:
Label4.Caption:=datetimetostr(Tage);

Versuch es stattdessen mal mit
Delphi-Quellcode:
Label4.Caption:=FloatToStr(Tage);
, das sollte die Differenz in Tagen ergeben. Zur genaueren Ausgabe kannst Du wie erwähnt die Funktionen aus DateUtils nutzen oder selbst umrechnen.

wallwriht 8. Jun 2010 21:08

AW: Zeit zwischen 2 daten
 
habe mir gerade days between angeschaut werde aber nnicht schlau draus. soll ich der funktion einfach anow und athen übergeben und das result ust dann mein komplettes ergebnis?


Das Problem ist auch das ich das ergebnis auf die minute oder sogar sekunde brauche

Wolfgang Mix 8. Jun 2010 21:09

AW: Zeit zwischen 2 daten
 
@ s.h.a.r.k:
Tag 0 ist der 30.12.1899, warum auch immer :wall:

@wallwriht:
Ja! Die Vorkommazahl ist die Anzahl der Tage,
die Nachkommastellen kannst du mit Trunc abschneiden

mkinzler 8. Jun 2010 21:10

AW: Zeit zwischen 2 daten
 
Weil 1 halt der 01.01.1900 ist

DeddyH 8. Jun 2010 21:11

AW: Zeit zwischen 2 daten
 
@wallwriht: Du übergibst der Funktion 2 Daten und erhältst die Differenz in Tagen.

[edit] Allerdings nur in ganzen Tagen, da eine ganze Zahl zurückgegeben wird [/edit]

s.h.a.r.k 8. Jun 2010 21:12

AW: Zeit zwischen 2 daten
 
Und weil 2 dann wohl der 02.01.1900 ist :mrgreen:

@Wolfgang Mix: Asche auf mein Haupt :-|

SirThornberry 8. Jun 2010 21:13

AW: Zeit zwischen 2 daten
 
Ein TDateTime ist Datum und Uhrzeit und hat eigentlich nichts mit einer Zeitspanne zu tun. Zumindest habe ich noch nie erlebt das jemand sagt "ich habe die Schulbank das letzte mal vor 14. Juni 1980 13:30 Uhr" gedrückt.
Wenn du also eine Zeitspanne messen willst solltest du dir als erstes bewusst sein in welcher Einheit das Ergebnis sein soll.

mkinzler 8. Jun 2010 21:16

AW: Zeit zwischen 2 daten
 
Im Klartext: Ein TDateTime ist nur bedingt für eine Zeitspanne zu gebrauchen

DeddyH 8. Jun 2010 21:18

AW: Zeit zwischen 2 daten
 
*Psst* das hatte ich doch schon indirekt verraten ;)

s.h.a.r.k 8. Jun 2010 21:20

AW: Zeit zwischen 2 daten
 
Und ich schon weit aus vorher *lach* Verwende daher auch seltenst TDateTime, sondern meist nur Extended.

mkinzler 8. Jun 2010 21:21

AW: Zeit zwischen 2 daten
 
Indirekt ist manchmal halt nicht direkt genug

Wolfgang Mix 8. Jun 2010 21:22

AW: Zeit zwischen 2 daten
 
Zitat:

Zitat von mkinzler (Beitrag 1027163)
Weil 1 halt der 01.01.1900 ist

Eben nicht, das ist ja die Unlogik! 01.01.1900 ist Tag Nr.2 :wall:

David Martens 10. Jun 2010 18:17

AW: Zeit zwischen 2 daten
 
Also um es nochmal zusammenzufassen:

Delphi-Quellcode:
datetimetostr(Tage);
macht keinen Sinn, da datetimetostr(4); genau der 04.01.1900 ist.

eher so:
Delphi-Quellcode:
inttostr(trunc(Tage)) + 'Tage und ' + timetostr(Frac(Tage)) + 'Stunden:Minuten:Sekunden';
ganz korrekt wäre es alles einzel aufdröseln.

Wolfgang Mix 10. Jun 2010 18:27

AW: Zeit zwischen 2 daten
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von David Martens (Beitrag 1027927)
Also um es nochmal zusammenzufassen:

Delphi-Quellcode:
datetimetostr(Tage);
macht keinen Sinn, da datetimetostr(4); genau der 04.01.1900 ist.

eher so:
Delphi-Quellcode:
inttostr(trunc(Tage)) + 'Tage und ' + timetostr(Frac(Tage)) + 'Stunden:Minuten:Sekunden';
ganz korrekt wäre es alles einzel aufdröseln.

Jetzt wird es langsam richtig. Schaue dir einmal den Anhang an

David Martens 10. Jun 2010 18:32

AW: Zeit zwischen 2 daten
 
@Wolfgang Mix: wie gesagt
Zitat:

ganz korrekt wäre es alles einzel aufdröseln.

Wolfgang Mix 10. Jun 2010 18:48

AW: Zeit zwischen 2 daten
 
RichtigI
Btw: Alle Delphi-Funktionen, die Zeitdifferenzen zurückgeben und das Schlüsselfunktionen *between" in sich tragen, sind fehlerhaft, da sie Nachkommastellen abschneiden, besser aber auch nicht zuverlässig sind die,
die das Schlüsselwort "span" in sich tragen, wenn man sie vernünftig rundet. Ich werde demnächt Ersatzfunktionen bereitstellen, die hoffentlich fehlerfei sind. Einige gibt es hier schon in der DP.

Klaus01 10. Jun 2010 20:56

AW: Zeit zwischen 2 daten
 
@Wolfgang,

in wieweit interessieren die Nachkommastellen wenn man (wie der TE) die
zeitliche Differenz in Tagen haben will?

Also kurz, was spricht da gegen daysBetween?

Grüße
Klaus

Wolfgang Mix 10. Jun 2010 21:29

AW: Zeit zwischen 2 daten
 
Aus #1:
Zitat:

s1:=datetimetostr(now);
DaysBetween z.B. von 10.06.2010 22:30:00 und 11.06.2010 07:00:00
liefert zwangsweise die Differenz 0 statt 1.

Mit
s1:=datetostr(now);
wird es natürlich richtig

Tagesdifferenzen sollte man ab Mitternacht rechnen :D

BTW: Die Zeitstempel von Delphi sind exakt, man muss nur logisch damit umgehen :-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:00 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