![]() |
Probleme bei der Darstellung der Zeit
Hallo Leute,
ich habe folgendes Problem: Ich versuche gerade ein Programm zu schreiben mit dem ich z.B. die Arbeitszeiten pro Woche, etc. errechnen kann. Die Woche besteht aus 6 Tagen (MO-SA). Zu jedem Tag gibt es 2 Editfelder. In das erste kommt die Anfangszeit rein, in das zweite die Zeit, wann man fertig war. Daraus errechne ich die Differenz, was dann der Arbeitszeit an einem tag entspricht. Dies wird für alle 6 Tage gemacht. Am ende werden die Arbeitszeiten zusammengerechnet und in einem Label ausgegeben. Soweit klappt das ja auch schon ganz gut. Wenn ich aber z.B. 6-mal 6 Stunden habe, dann steht in dem label "12:00:00", weil Delphi nach 24 Std. wieder bei 0 anfängt. Dies möchte ich aber gerne ändern. In Excel ist es möglich die Gesamtzeit in Stunden genau so anzeigen "36:00:00" zu lassen. Was muss ich jetzt tun, damit in meinem Label auch die Zeit folgendermaßen angezeigt wird: "36:00:00"??? Ich habe jetzt wirklich keine Ahnung mehr wie ich das hinkriege und hoffe, dass Ihr eine Idee habt. Gruß :???: |
Re: Probleme bei der Darstellung der Zeit
du hast die addierten Zeiten doch sicher in einer Variable. Entweder sind sie in der Variablen schon falsch oder du gibst sie einfach falsch aus. Ohne Quelltext wissen wir nicht was von beiden der Fall ist.
|
Re: Probleme bei der Darstellung der Zeit
Danke für die schnelle Antwort.
Also klar habe ich die in eine Variable geschrieben. Die Werte sind auch alle korrekt. Werde gleich mal den Quelltext hochladen, aber sowiet habe ich keinen Fehler gefunden außer, dass Delphi nich tdie vollen 36 Std. anzeigt. |
Re: Probleme bei der Darstellung der Zeit
naja, rechnest du im Moment mit TDateTimeWerten? TDateTime ist eben für Datumswerte und Zeitwerte ausgelegt. Die Zeit wird hinter dem Komma gespeichert und die Tage sind der Teil vor dem Komma.
|
Re: Probleme bei der Darstellung der Zeit
So, hier ist der Quelltext:
Delphi-Quellcode:
Dabei muss ich noch erwähnen, dass jew. das erste Editfeld die Std, das Label den ":" und das zweite Editfeld die Minuten in jeder Klammer darstellen.
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, mTSubtrahieren, mTAddieren, mTMultiplizieren, mTDividieren; type TForm1 = class(TForm) Label1: TLabel; Label2: TLabel; Label3: TLabel; Label5: TLabel; Namensfeld: TEdit; ..... //Es wären sonst zu viele :-) procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var a,b,c,d,e,f : TTime; begin a:=StrToTime(Edit3.Text+Label32.Caption+Edit4.Text)-StrToTime(Edit1.Text+Label31.Caption+Edit2.Text); b:=StrToTime(Edit7.Text+Label42.Caption+Edit8.Text)-StrToTime(Edit5.Text+Label41.Caption+Edit6.Text); c:=StrToTime(Edit11.Text+Label52.Caption+Edit12.Text)-StrToTime(Edit9.Text+Label51.Caption+Edit10.Text); d:=StrToTime(Edit15.Text+Label62.Caption+Edit16.Text)-StrToTime(Edit13.Text+Label61.Caption+Edit14.Text); e:=StrToTime(Edit19.Text+Label72.Caption+Edit20.Text)-StrToTime(Edit17.Text+Label71.Caption+Edit18.Text); f:=StrToTime(Edit23.Text+Label82.Caption+Edit24.Text)-StrToTime(Edit21.Text+Label81.Caption+Edit22.Text); Label21.Caption:=TimeToStr(a+b+c+d+e+f); end; end. [edit=SirThornberry]erneut Code-Tags durch Delphi-Tags ersetzt - künftig bitte Delphi-tags anstelle von Code-Tags verwenden wenn es um Delphiquelltext geht. Mfg, SirThornberry[/edit] |
Re: Probleme bei der Darstellung der Zeit
genau das ist dein Fehler.
du verwendest ein TTime was das gleiche ist wie ein TDate und auch das gleiche wie ein TDateTime (was wiederum ein Double ist). Der Typ ist also dazu gedacht Datum + Uhrzeit zu speichern. Dabei ist die Uhrzeit der Teil hinter dem Komma und die Tage der Teil vor dem Komma. 12 Stunden des Tages sind also 0,5. wenn du jetzt 3 mal 12 Stunden hast wären das 3 mal 0,5 was 1,5 ergibt. TimeToStr wandelt dir aber eben nur den Nachkommateil in eine Uhrzeit um. es wird also nur die ",5" beachtet was wieder 12 Uhr wäre. Du musst also zusätzlich den Teil vor dem Komma berücksichtigen. Und du musst dir klar machen das es hier um Uhrzeiten + Datum geht und nicht um Stundenwerte. wenn vor dem komma eine 0 steht ist das 30.12.1899 Wenn du nun 48 Stunden dazu addierst ist es immer noch 0 uhr aber eben 2 Tage später. Also der 01.01.1900 |
Re: Probleme bei der Darstellung der Zeit
Hallo,
1. lass die Finger von TDateTime ist ein Float ud damit gibt es Rundungsprobleme beim Addieren 2. wenn du es trotzdem nehmen willst (owe) DateOf(TDateTime) -> Anzahl der Tage Frac(TDateTime) -> Stunden (als TDateTime) Anzahl der Tage mit 24 multipliziert ergibt die Stunden > 24 h Ich hatte mit damals mal direkt ne Funktion geschrieben, die obige beide Funktionen verknüpft. TimeToStrEx ... Heiko |
Re: Probleme bei der Darstellung der Zeit
Hallo hoika,
Wie würdest du die Werte denn dann errechnen und zusammenfassen. Könntest du mal einen Quelltext mit deiner Funktion posten, dann kann ich das auch besser nachvollziehen. Gibt es auch noch andere vielleicht auch noch einfacher Methoden um dies zu erledigen? |
Re: Probleme bei der Darstellung der Zeit
Hallo,
es ist nichts verwerfliches am Datentyp TDateTime, man muss nur mit ihm umgehen können. Auch ist der ganzzahlige Anteil von TDateTime nicht ein Datum, sondern wird von bestimmten Routinen so interpretiert. TDateTime kann Zeitpunkte, aber auch Zeitspannen bezeichnen.
Delphi-Quellcode:
Freundliche Grüße
uses
SysUtils, // TimeSeparator DateUtils; // HourOf, MinuteOf, SecondOf function HoursToStr(timespan: TDateTime): string; var hours, mins, secs: Word; begin hours := HourOf(timespan) + 24 * Trunc(timespan); mins := MinuteOf(timespan); secs := SecondOf(timespan); Result := Format('%d%s%.2d%s%.2d', [hours, TimeSeparator, mins, TimeSeparator, secs]); end; |
Re: Probleme bei der Darstellung der Zeit
Hi,
kann mich dem nur anschliessen, bei TimeToStr etc gibt es ein paar Stolperfallen. Zur Veranschaulichung kann man mal probieren:
Delphi-Quellcode:
Lustig wird es, wenn du Zeiten berechnen musst wie z.B. von 22:00 bis 05:00, also über Mitternacht. ;-)
procedure TForm1.Button1Click(Sender: TObject);
var t,t1:ttime; std : double; begin t := StrToTime('12:00'); t1 := StrToTime('18:15'); std := t1 - t; label1.caption := FloatToStr(std * 24); end; Nur so nebenbei,
Delphi-Quellcode:
geht weniger umständlich mit
f:=StrToTime(Edit23.Text+Label82.Caption+Edit24.Text)
Delphi-Quellcode:
oder die Eingabe gleich in einem Edit und nur im richtigen Format hh:mm zulassen.
f:=StrToTime(Edit23.Text+':'+Edit24.Text)
MJ |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:26 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