Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Zeitdifferenz "ordentlich" formatiert darstellen (https://www.delphipraxis.net/32577-zeitdifferenz-ordentlich-formatiert-darstellen.html)

Alex_ITA01 25. Okt 2004 16:04


Zeitdifferenz "ordentlich" formatiert darstellen
 
Hi @all
ich hab da mal eine Frage zu dem TDateTime-Format.
Und zwar habe ich folgendes Problem:
Ich habe eine Zeitdifferenz (natürlich auch von zwei Zeiten) im Format TDateTime.
Nun möchte ich diese Zeit je nachdem ob sie größer als 59 Sekunden ist,59Minuten 23Stunden... usw. auswerten.
Viele sagen jetzt MinutesBetween,SecondsBetween usw. nur das hilft.
An einem Beispiel erklärt:
Die erste Zeit: 12:03:24 (hh:mm:ss:)
Die zweite Zeit: 14:27:54 (hh:mm:ss:)

Zeitdifferenz: 02:24:30 (hh:mm:ss) (ich hoffe ich habe richtig gerechnet :-) )

Jetzt kann die Zeitdifferenz aber auch größer als Stunden sein...
Beispiel:
Zeit1: 12.03. 11:22:33 (dd.mm. hh:mm:ss)
Zeit2: 14.03. 12:33:44 (dd.mm. hh:mm:ss)

Zeitdifferenz: 02 01:11:11 (dd hh:mm:ss)
(Die Formatierung wie was aussieht erstmal ausgeschlossen...)

Wisst ihr wie ich das mache? Aus einer Zeitdifferenz zu analysieren wie groß der Unterschied ist (Sekunden,Minuten,Stunden,Tage...) und das dann dementsprechend darzustellen.

Ich hoffe ihr könnt mir da helfen
MFG Alex

paresy 25. Okt 2004 16:18

Re: Zeitdifferenz "ordentlich" formatiert darstell
 
Delphi-Quellcode:
procedure TfrmScriptEvents.tmrRunningTimer(Sender: TObject);
const sDay = 60 * 60 * 24;
      sHour = 60 * 60;
      sMin = 60;
var xSecs : Integer;
    xMins : Integer;
    xHours: Integer;
    xDays : Integer;
begin

  xSecs := Abs(SecondsBetween(Now, fNextRun));

  xDays := xSecs div sDay;
  xHours := (xSecs - xDays * sDay) div sHour;
  xMins := (xSecs - xDays * sDay - xHours * sHour) div sMin;
  xSecs := xSecs - xDays * sDay - xHours * sHour - xMins * sMin;

  if (xDays > 0) or (xHours > 0) or (xMins > 0) or (xSecs > 0) then
   lblNextRun.Caption := Format('%d + %.2d:%.2d:%.2d', [xDays, xHours, xMins, xSecs])
  else
   begin
    lblNextRun.Caption := 'Running';
    FormShow(Self); //update
   end;

end;
hier nen aussschnitt aus nem code den ich mal in nem projekt benutzt hatte... und nen coutdown anzuzeigen und wenn er die differenz <= 0 ist dann zeigt er "running" an.

paresy

Alex_ITA01 26. Okt 2004 10:15

Re: Zeitdifferenz "ordentlich" formatiert darstell
 
danke für den source.
Ich wollte dich mal fragen @paresy, ob ich den code noch auf monate und jahre erweitern kann?

MFG Alex

himitsu 26. Okt 2004 12:29

Re: Zeitdifferenz "ordentlich" formatiert darstell
 
z.B.
Delphi-Quellcode:
If YearsBetween(Zeit1, Zeit2) <> 0 Then
  S := IntToStr(YearsBetween(Zeit1, Zeit2)) + ' Jahre'
Else If MonthsBetween(Zeit1, Zeit2) <> 0 Then
  S := IntToStr(MonthsBetween(Zeit1, Zeit2)) + ' Monate'
Else If WeeksBetween(Zeit1, Zeit2) <> 0 Then
  S := IntToStr(WeeksBetween(Zeit1, Zeit2)) + ' Wochen ' + IntToStr(Round(Abs(Zeit) - WeeksBetween(Zeit1, Zeit2) * 7)) + ' Tage'
Else If DaysBetween(Zeit1, Zeit2) <> 0 Then
  S := IntToStr(DaysBetween(Zeit1, Zeit2)) + ' Tage ' + TimeToStr(Abs(Zeit) - DaysBetween(Zeit1, Zeit2))
Else
  S := TimeToStr(Abs(Zeit1 - Zeit2));
Bei Monaten und Jahren ist es ein bissl schwerer genauere Angaben, zu den kleineren Einteilungen zu machen, da 1 Jahr/1 Monat nunmal keine feste Anzahl an Tagen/Stunden... hat.

Alex_ITA01 26. Okt 2004 12:34

Re: Zeitdifferenz "ordentlich" formatiert darstell
 
danke himitsu...
ich konnte mir schon denken das es problematisch wird weil Monat und Jahr wie du schon sagtest, nicht immer die gleiche Anzahl von Tagen haben.
Aber trotzdem danke
MFG Alex

Alex_ITA01 26. Okt 2004 12:42

Re: Zeitdifferenz "ordentlich" formatiert darstell
 
@himitsu:
die Variable zeit, welche muss das sein? Zeit1 oder Zeit2? :gruebel:

MFG Alex

CJ_lux 10. Aug 2008 13:43

Re: Zeitdifferenz "ordentlich" formatiert darstell
 
Zitat:

Zitat von Alex_ITA01
folgendes Problem:
Ich habe eine Zeitdifferenz (natürlich auch von zwei Zeiten) im Format TDateTime.

An einem Beispiel erklärt:
Die erste Zeit: 12:03:24 (hh:mm:ss:)
Die zweite Zeit: 14:27:54 (hh:mm:ss:)

Zeitdifferenz: 02:24:30 (hh:mm:ss)


hallo, ehm könnte mier bitte einer erklären wie er das hin bekommen hat solch eine zeitdifferenz?
ich bekomme nur folgendes hin...

z.B.:

Zeit1 : 14:00:00
Zeit2 : 15:00:00
Differenz : 23:00:00

DeddyH 10. Aug 2008 13:53

Re: Zeitdifferenz "ordentlich" formatiert darstell
 
Wie ermittelst Du denn die Differenz?

DP-Maintenance 10. Aug 2008 13:54

DP-Maintenance
 
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.
Delphi-Frage

DeddyH 10. Aug 2008 13:59

Re: Zeitdifferenz "ordentlich" formatiert darstell
 
Zitat:

Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.
Delphi-Frage
[OT] Nach fast 4 Jahren schon bemerkt? :lol: :duck: [/OT]

CJ_lux 10. Aug 2008 14:04

Re: Zeitdifferenz "ordentlich" formatiert darstell
 
[quote="DeddyH"]
Zitat:

[OT] Nach fast 4 Jahren schon bemerkt? :lol: :duck: [/OT]
ja, habe das schon bemerkt, brauche aber die antwocht heute^^ (vor 4 jahren kannte ich dlphi nichtmal^^)

DeddyH 10. Aug 2008 14:07

Re: Zeitdifferenz "ordentlich" formatiert darstell
 
Je nachdem, wie der Vorkommaanteil aussieht, sind 23 Stunden doch vollkommen korrekt.

[edit] Beispiel:
01.01.2008 15:00 und 02.01.2008 14:00 --> 23 Stunden Differenz
01.01.2008 15:00 und 01.01.2008 14:00 --> 1 Stunde Differenz[/edit]

CJ_lux 10. Aug 2008 14:25

Re: Zeitdifferenz "ordentlich" formatiert darstell
 
okay, glaube ich habe was verdreht^^ :gruebel: :wall: :wiejetzt:

also, was ich will ist eigentlich ein countdown...

dazu muss ich wissen wie lang es noch ist (von jetzt an) bis XXX (die eingegebene zeit) :dance:

//edit also das ganze soll immer am gleichen tag bleiben
die eingegebene zeit wird nie größer als 15stunden sein

DeddyH 10. Aug 2008 14:34

Re: Zeitdifferenz "ordentlich" formatiert darstell
 
Dann musst Du das "bis" korrekt ermitteln. Das sollte mit IncHour(now,Anzahl_Stunden) aus DateUtils einfach zu machen sein.

[edit] Achnee, andersrum. Wie gibst Du den Zeitpunkt "bis" denn ein? [/edit]

CJ_lux 10. Aug 2008 14:50

Re: Zeitdifferenz "ordentlich" formatiert darstell
 
Zitat:

Zitat von DeddyH

[edit] Achnee, andersrum. Wie gibst Du den Zeitpunkt "bis" denn ein? [/edit]

habe z.b. 2 "editKasten" einer für stunden der andere für minuten

da gebe ich z.b. 18 un 30 also 18:30:00 ein

jetzt soll der programm mir sagen dass eis bis dahin noch 2 stunden 40min sind

Fussball-Robby 10. Aug 2008 15:04

Re: Zeitdifferenz "ordentlich" formatiert darstell
 
Du müsstest Die Zeit erstmal mit EncodeTime zusammensetzen, dann die zeit dazwischen mittels MinutesBetween(DateUtils) ermitteln und diese Minuten dann wieder zu einer Zeit zusammensetzen:
Delphi-Quellcode:
function ZeitBis(Hours, Mins: String): TTime;
var
  AThen: TDateTime;
  AHours, AMinutes: Word;
begin
  AThen := EncodeTime(StrToInt(Hours), StrToInt(Mins), 0, 0);
  AMinutes := MinutesBetween(Time, AThen);
  AHours := AMinutes div 60;
  Dec(AMinutes, AHours * 60);
  Result := EncodeTime(AHours, AMinutes, 0, 0);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage('Zeit bis zum eingestellten Zeitpunkt: ' + TimeToStr(ZeitBis(Edit1.Text, Edit2.Text)));
end;

CJ_lux 10. Aug 2008 15:31

Re: Zeitdifferenz "ordentlich" formatiert darstell
 
hey! vielen dank! damit kann ich sicher erreichen was ich will :dancer2:
danke vielmals! :thumb: :thumb: :stupid: :dance: :cheer:

CJ_lux 10. Aug 2008 17:15

Re: Zeitdifferenz "ordentlich" formatiert darstell
 
Könntest du mier sagen wie man da noch für sekunden umschreiben kann? :bouncing4: :duck:

DeddyH 10. Aug 2008 17:18

Re: Zeitdifferenz "ordentlich" formatiert darstell
 
Mit MinutesBetween() geht das für Minuten, wie dürfte das also für Sekunden heißen? :stupid:

CJ_lux 10. Aug 2008 17:22

Re: Zeitdifferenz "ordentlich" formatiert darstell
 
Zitat:

Zitat von DeddyH
Mit MinutesBetween() geht das für Minuten, wie dürfte das also für Sekunden heißen? :stupid:

lol, genau^^ SecondsBetween :cheer: :wall: :zwinker:

DeddyH 10. Aug 2008 17:25

Re: Zeitdifferenz "ordentlich" formatiert darstell
 
100 Punkte :thumb:

CJ_lux 10. Aug 2008 17:27

Re: Zeitdifferenz "ordentlich" formatiert darstell
 
so, jetzt sag mir bitta was da falsch ist? AThen := EncodeTime(StrToInt(Hours), StrToInt(Mins), StrToInt(Secs), 0, 0, 0);

der unterstrichene teil soll falsch sein :gruebel:

DeddyH 10. Aug 2008 17:30

Re: Zeitdifferenz "ordentlich" formatiert darstell
 
EncodeTime erwartet 4 Parameter, Du hast 6.

CJ_lux 10. Aug 2008 17:37

Re: Zeitdifferenz "ordentlich" formatiert darstell
 
ich hab folgendes:


Delphi-Quellcode:
function ZeitBis(Hours, Mins: String): TTime;
var
  AThen: TDateTime;
  AHours, AMinutes,ASeconds: Word;
begin
  AThen := EncodeTime(StrToInt(Hours), StrToInt(Mins), StrToInt(Secs), 0, 0);

  ASeconds := SecondsBetween (Time, AThen);
  AMinutes := MinutesBetween(Time, AThen);
  AHours := AMinutes div 60;
  Dec(AMinutes, AHours * 60);

  Result := EncodeTime(AHours, AMinutes,ASeconds, 0, 0, 0);
end;

fehler(?)

1. StrToInt(Secs) --> Secs soll declariert werden (?!)
2. ja, und wie du schon sagtest... zuviele Parameter

DeddyH 10. Aug 2008 17:42

Re: Zeitdifferenz "ordentlich" formatiert darstell
 
Irgenwie fehlt mir da ein Funktionsparameter.
Delphi-Quellcode:
function ZeitBis(Hours, Mins, Secs{fehlte}: String): TTime;
var
  AThen: TDateTime;
  AHours, AMinutes,ASeconds: Word;
begin
  AThen := EncodeTime(StrToInt(Hours), StrToInt(Mins), StrToInt(Secs), 0); //4 Parameter

  ASeconds := SecondsBetween (Time, AThen);
  AMinutes := MinutesBetween(Time, AThen);
  AHours := AMinutes div 60;
  Dec(AMinutes, AHours * 60);

  Result := EncodeTime(AHours, AMinutes,ASeconds, 0); //4 Parameter
end;

CJ_lux 10. Aug 2008 18:00

Re: Zeitdifferenz "ordentlich" formatiert darstell
 
oh...hatte ich wohl übersehn :oops: danke!

und dan...

jetzt kackt der programm immer wieser ab (Fehlermeldung)

und nach dem "abkacken" markiert delphi immer diese Zeile blau
Delphi-Quellcode:
 Result := EncodeTime(AHours, AMinutes,ASeconds, 0);

doch beim Compilieren gibt es keine Fehler..

(sorry wenn ich so langsam nerve :) )

mkinzler 10. Aug 2008 18:02

Re: Zeitdifferenz "ordentlich" formatiert darstell
 
Häng den Screenshot mal hier an

CJ_lux 10. Aug 2008 18:09

Re: Zeitdifferenz "ordentlich" formatiert darstell
 
Zitat:

Zitat von mkinzler
Häng den Screenshot mal hier an

http://img166.imageshack.us/img166/6...nnt1al4.th.jpg

mkinzler 10. Aug 2008 18:14

Re: Zeitdifferenz "ordentlich" formatiert darstell
 
Hier im Forum!

DeddyH 10. Aug 2008 18:29

Re: Zeitdifferenz "ordentlich" formatiert darstell
 
Machen wir das nicht viel zu kompliziert? Es würde doch reichen, die eingegebene Zeit einmalig zu wandeln und dann in z.B. einem Timer-Event zu vergleichen und auszugeben.

CJ_lux 10. Aug 2008 18:35

Re: Zeitdifferenz "ordentlich" formatiert darstell
 
Zitat:

Zitat von DeddyH
Machen wir das nicht viel zu kompliziert? Es würde doch reichen, die eingegebene Zeit einmalig zu wandeln und dann in z.B. einem Timer-Event zu vergleichen und auszugeben.

versteh nicht wirklich was du denkst? :stupid:

DeddyH 10. Aug 2008 18:44

Re: Zeitdifferenz "ordentlich" formatiert darstell
 
Angenommen, Du hast ein privates Feld "FTimeUntil" vom Typ TTime definiert. Dann ginge doch so etwas (Zuweisung mittels 2 Edits ohne Fehlerprüfung):
Delphi-Quellcode:
procedure TForm1.btn1Click(Sender: TObject);
begin
  FTimeUntil := Date + StrToTime(Format('%s:%s',[edtHour.Text,edtMinute.Text]));
  cdTimer.Enabled := True;
end;
Und im Timer-Event dann so:
Delphi-Quellcode:
procedure TForm1.cdTimerTimer(Sender: TObject);
var RemainingSeconds: Cardinal;
begin
  RemainingSeconds := SecondsBetween(Now,FTimeUntil);
  lblRemaining.Caption := Format('Noch %.2d:%.2d:%.2d bis %s',
                                  [RemainingSeconds div 3600,
                                   RemainingSeconds div 60 mod 60,
                                   RemainingSeconds mod 60,
                                   FormatDateTime('hh:mm',FTimeUntil)]);
end;

CJ_lux 10. Aug 2008 18:53

Re: Zeitdifferenz "ordentlich" formatiert darstell
 
ich weis nicht... das kenn ich noch gar nicht (das Feld "FTimeUntil" & Edits ohne Fehlerprüfung)
muss zuerst noch versuchen das zu verstehen und so :P (bin wirklich neuling was programmieren angeht :?)

DeddyH 10. Aug 2008 18:56

Re: Zeitdifferenz "ordentlich" formatiert darstell
 
Das ist eigentlich ganz einfach: da globale Variablen im Allgemeinen "pfui" sind, deklariert man sich ein privates Feld.
Delphi-Quellcode:
type TMyForm = class(TForm)
...
private
  FTimeUntil: TTime;
...
end;
Und mit der fehlenden Fehlerprüfung meinte ich nur, dass ich in meinem Beispiel nicht nachschau, ob in den Edits Blödsinn drinsteht (keine Zahlen oder eine Stunde > 23 z.B.).

CJ_lux 10. Aug 2008 19:10

Re: Zeitdifferenz "ordentlich" formatiert darstell
 
Zitat:

Zitat von DeddyH
Und mit der fehlenden Fehlerprüfung meinte ich nur, dass ich in meinem Beispiel nicht nachschau, ob in den Edits Blödsinn drinsteht (keine Zahlen oder eine Stunde > 23 z.B.).


wozu sind diese inputboxen dann gut wenn man akkes reinschreiben darf? :nerd:


für den rest... so langsam wird das ganze chinesisch für mich^^
kannst du mier ein beisèiel programmieren das funktionstüchtig ist, dann kann ich dass leichter verstehen (Nein, will nicht von anderen profitieren, will es selbst auch können :tongue: )

DeddyH 10. Aug 2008 19:14

Re: Zeitdifferenz "ordentlich" formatiert darstell
 
Wieso, das Beispiel aus #32 ist funktionstüchtig, Du müsstest nur eine Fehlerbehandlung einbauen. Beispielsweise könntest Du mit TryStrToInt schauen, ob die Eingabe in eine Zahl gewandelt werden kann. Wenn nicht, hat der Anwender anscheinend nicht genug Grips oder ist böser Absicht oder einfach nur Softwaretester :mrgreen:


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