AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Trunc und TTime (Wenn TTime = 1 gibt Trunc 0 zurück, warum?)
Thema durchsuchen
Ansicht
Themen-Optionen

Trunc und TTime (Wenn TTime = 1 gibt Trunc 0 zurück, warum?)

Ein Thema von Schmufu · begonnen am 29. Nov 2004 · letzter Beitrag vom 30. Nov 2004
Antwort Antwort
Schmufu

Registriert seit: 24. Sep 2003
Ort: Bremen
4 Beiträge
 
Delphi 7 Enterprise
 
#1

Trunc und TTime (Wenn TTime = 1 gibt Trunc 0 zurück, warum?)

  Alt 29. Nov 2004, 21:25
Hallo,

ich habe folgende Funktion geschrieben, um aus einem TTime (TDateTime) die Stunden und Minuten zu bekommen, und zwar auch dann die stunden wenn es sich um mehr als 24 stunden handelt.

Es Funktioniert auch wunderbar, allerdings gibt die Funktion 0:00 zurück wenn "Zeit" 1 ist, also exakt 24 Stunden.

Wenn ich mir das ganze beim Debuggen anschaue hat "Zeit" den wert 1, allerdings hat "Tage" nach dem Trunc den Wert 0!

Ändere ich den Quelltext auf "Tage := Trunc(1)" (also immer 1 an Trunc) ist Tage auch immer 1.

Irgendwie verstehe ich das nicht. Kann mir da vielleicht jemand auf die Sprünge helfen?

Code:
function TimeToStrInHoursMinutes(Zeit: TTime): String;
var Tage: Integer;
    Stunden, Minuten: String;
begin
  if Zeit >= 0 then
  begin
    Tage := Trunc(Zeit); // Ganzahl des TTime in Tage?!?
    Stunden := IntToStr(24*Tage + StrToInt(FormatDateTime('hh', Zeit - Tage)));
    Minuten := FormatDateTime('nn', Zeit - Tage);
    Result := Stunden+':'+Minuten;
  end
  else
  begin
    Tage := Trunc(Zeit) * (-1);
    Stunden := IntToStr(24*Tage + StrToInt(FormatDateTime('hh', Zeit + Tage)));
    Minuten := FormatDateTime('nn', Zeit + Tage);
    Result := '-'+Stunden+':'+Minuten;
  end;
end;
PS: Die Funktion hätte man vielleicht auch anders schreiben können, verbesserungsvorschläge werden dankbar angenommen
  Mit Zitat antworten Zitat
bttb930

Registriert seit: 6. Okt 2003
372 Beiträge
 
#2

Re: Trunc und TTime (Wenn TTime = 1 gibt Trunc 0 zurück, war

  Alt 29. Nov 2004, 21:38
TTime enthält soweit ich weiß nur eine ZEIT. Du brauchst TDateTime. 24 Uhr ist TTime-Mäßig halt 0 Uhr.
  Mit Zitat antworten Zitat
Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#3

Re: Trunc und TTime (Wenn TTime = 1 gibt Trunc 0 zurück, war

  Alt 29. Nov 2004, 21:40
Will mir nicht den Kopf zerbrechen, deswegen: mach es ordentlich - nutze Delphi-Referenz durchsuchenDecodeTime und Delphi-Referenz durchsuchenDecodeDate - damit klappt es
Gruß
Tim Leuschner
Programmierer = moderner Sysiphos: stets wenn er meint, den Stein seiner Dummheit auf den Berg des Wissens gewuchtet zu haben, erblickt er einen völlig neuen Aspekt und der Dummfels poltert mit Getöse zurück ins Tal der Unwissenheit...
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Trunc und TTime (Wenn TTime = 1 gibt Trunc 0 zurück, war

  Alt 29. Nov 2004, 21:40
Also bei mir klappt's immer. Lediglich bei 0.99999999999999995 wird bei mir mit trunc fälschlicherweise auf 1 getrunct, aber das liegt halt an der begrenzten Genauigkeit. 1 wird bei mir immer 1.
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Trunc und TTime (Wenn TTime = 1 gibt Trunc 0 zurück, war

  Alt 29. Nov 2004, 21:44
Zitat von bttb930:
TTime enthält soweit ich weiß nur eine ZEIT. Du brauchst TDateTime. 24 Uhr ist TTime-Mäßig halt 0 Uhr.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  t: TTime;
begin
  t := 1;
  Edit1.Text := IntToStr(trunc(t));
end;
In meinem Edit steht eine "1"... Ist allerdings die Frage woher dieser Wert stammt, und wie er dort behandelt wird! Es kann durchaus sein dass die Funktion die die Variable füllt, bei einem TTime-Wert darauf achtet, dass der Vorkommaanteil immer 0 ist.
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Trunc und TTime (Wenn TTime = 1 gibt Trunc 0 zurück, war

  Alt 30. Nov 2004, 08:11
Zitat von bttb930:
TTime enthält soweit ich weiß nur eine ZEIT. Du brauchst TDateTime. 24 Uhr ist TTime-Mäßig halt 0 Uhr.
TTime ist das selbe wie TDate oder TDateTime!!! Es gibt keinen Unterschied zweichen den drei Deklarationen.

Zitat von dizzy:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  t: TTime;
begin
  t := 1;
  Edit1.Text := IntToStr(trunc(t));
end;
In meinem Edit steht eine "1"... Ist allerdings die Frage woher dieser Wert stammt.
Naja, da Du t := 1 schreibst ist doch auch klar das in deinem Edit eine 1 steht.
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Trunc und TTime (Wenn TTime = 1 gibt Trunc 0 zurück, war

  Alt 30. Nov 2004, 10:41
Zitat von Sharky:
TTime ist das selbe wie TDate oder TDateTime!!! Es gibt keinen Unterschied zweichen den drei Deklarationen.
[...]
Naja, da Du t := 1 schreibst ist doch auch klar das in deinem Edit eine 1 steht.
Deswegen ja mein kleiner Einschub oben, der im Grunde aussagen sollte, dass zwar der Datentyp identisch ist, aber evtl. die Funktion die die Variable befüllt bei einer Deklaration als TTime darauf achtet keine Werte >= 1 zu schreiben. Geht zwar im Typ, macht aber die Funktion nicht.
Wurd das oben nicht klar?

Und da ich den Wert von Hand, und nicht durch eine der Zeit-Funtionen von Delphi setze, komme ich tatsächlich auf 1.
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Schmufu

Registriert seit: 24. Sep 2003
Ort: Bremen
4 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Trunc und TTime (Wenn TTime = 1 gibt Trunc 0 zurück, war

  Alt 30. Nov 2004, 12:08
Also erstmal vielen dank für die Vorschläge.

Momentan bin ich auf der Arbeit und kann leider nicht testen, es ist aber so, dass der TTime-Wert der übergeben wird folgendermaßen erstellt wird:

Zuerst wird mit "EncodeTime(0,0,0,0)" die Variable auf "null" gesetzt, dann werden die Eingaben des Nutzers mit "StrToTime" umgewandelt und zu der TTime-Variablen addiert.

Zu der Vermutung das es nicht möglich ist Werte größer 1 zuzuweisen, kann ich nicht zustimmen, da auch Stunden im Format 38:15, 128:37 usw fehlerfrei funktionieren. Wo ich mir momentan nicht sicher bin ist ob auch Werte von 2 (48 Std), 3 (72 Std) usw nicht funktionieren, ich bin aber der meinung das diese Werte funktionieren.
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Trunc und TTime (Wenn TTime = 1 gibt Trunc 0 zurück, war

  Alt 30. Nov 2004, 12:15
Zitat von Schmufu:
...Zu der Vermutung das es nicht möglich ist Werte größer 1 zuzuweisen, kann ich nicht zustimmen....
Also mal so aus dem Kopf getippt:
Delphi-Quellcode:
var
  t1 : TTime;
  t2 : TTime;
begin
  t1 := EncodeTime(12,0,0,0); // t1 "ist jetzt" 12 Uhr am 30. Dezember 1899
  t2 := t1 + 1; // t2 ist jetzt 12 Uhr am folge Tag von t1
end;
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Schmufu

Registriert seit: 24. Sep 2003
Ort: Bremen
4 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: Trunc und TTime (Wenn TTime = 1 gibt Trunc 0 zurück, war

  Alt 30. Nov 2004, 15:53
So, ich habe jetzt ein kleines Beispiel welches leicht nach zu vollziehen sein sollte, und wo genau der Fehler auftritt den ich meine!

Code:
function TForm1.TimeToStrInHoursMinutes(Zeit: TTime): String;
var Tage: Integer;
    Stunden, Minuten: String;
begin
  if Zeit >= 0 then
  begin
    Tage := Trunc(Zeit); // Ganzahl des TTime in Tage?!?
    Stunden := IntToStr(24*Tage + StrToInt(FormatDateTime('hh', Zeit - Tage)));
    Minuten := FormatDateTime('nn', Zeit - Tage);
    Result := Stunden+':'+Minuten;
  end
  else
  begin
    Tage := Trunc(Zeit) * (-1);
    Stunden := IntToStr(24*Tage + StrToInt(FormatDateTime('hh', Zeit + Tage)));
    Minuten := FormatDateTime('nn', Zeit + Tage);
    Result := '-'+Stunden+':'+Minuten;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var t1, t2: TTime;
    i: Integer;
begin
  t1 := EncodeTime(0,0,0,0); // t1 = 0
  t2 := EncodeTime(1,0,0,0); // t2 wert von 1 Stunde

  for i := 1 to 24 do // 24 * 1 ist 24 !
    t1 := t1 + t2;

  ShowMessage(FloatToStr(t1)); // Gibt in der Message "1" aus
  ShowMessage(TimeToStrInHoursMinutes(t1)); // Zeigt "0:00" an ! Warum ?
end;
Klickt man auf Button1 kommt zuerst eine "1" und danach "0:00"! Nach meiner Meinung sollte aber "24:00" kommen.
Setzt man vor die beiden ShowMessage noch folgende Zeile wird auch "24:00" angezeigt
Code:
t1 := t1 + 0.0000000001; // liegt irgendwo im Sekunden/Millisekunden bereich
Spielt man ein wenig mit der Schleife und stellt sie auf 48 statt 24 funktioniert alles, bei 72 zeigt er dann 48:00, obwohl t1 = 3 ist, und schließlich bei 96 zeigt er 72:00 an und t1 = 3,99...!

Schaut man sich bei einer Schleifenzahl von 72 das ganze im Debugger an sagt er das "Zeit" 3 ist aber nach dem trunc erhält "Tage" den wert 2.

Dass das ganze irgendwie mit Rundungsfehlern und ungenügender Genauigkeit zu tun hat kann ich mir schon vorstellen, aber auf die Minute genau sollte das doch eigentlich schon sein. Oder irre ich mich da?
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:18 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