![]() |
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 |
Re: Zeitdifferenz "ordentlich" formatiert darstell
Delphi-Quellcode:
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.
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; paresy |
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 |
Re: Zeitdifferenz "ordentlich" formatiert darstell
z.B.
Delphi-Quellcode:
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.
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)); |
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 |
Re: Zeitdifferenz "ordentlich" formatiert darstell
@himitsu:
die Variable zeit, welche muss das sein? Zeit1 oder Zeit2? :gruebel: MFG Alex |
Re: Zeitdifferenz "ordentlich" formatiert darstell
Zitat:
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 |
Re: Zeitdifferenz "ordentlich" formatiert darstell
Wie ermittelst Du denn die Differenz?
|
DP-Maintenance
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.
Delphi-Frage |
Re: Zeitdifferenz "ordentlich" formatiert darstell
Zitat:
|
Re: Zeitdifferenz "ordentlich" formatiert darstell
[quote="DeddyH"]
Zitat:
|
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] |
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 |
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] |
Re: Zeitdifferenz "ordentlich" formatiert darstell
Zitat:
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 |
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; |
Re: Zeitdifferenz "ordentlich" formatiert darstell
hey! vielen dank! damit kann ich sicher erreichen was ich will :dancer2:
danke vielmals! :thumb: :thumb: :stupid: :dance: :cheer: |
Re: Zeitdifferenz "ordentlich" formatiert darstell
Könntest du mier sagen wie man da noch für sekunden umschreiben kann? :bouncing4: :duck:
|
Re: Zeitdifferenz "ordentlich" formatiert darstell
Mit MinutesBetween() geht das für Minuten, wie dürfte das also für Sekunden heißen? :stupid:
|
Re: Zeitdifferenz "ordentlich" formatiert darstell
Zitat:
|
Re: Zeitdifferenz "ordentlich" formatiert darstell
100 Punkte :thumb:
|
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: |
Re: Zeitdifferenz "ordentlich" formatiert darstell
EncodeTime erwartet 4 Parameter, Du hast 6.
|
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 |
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; |
Re: Zeitdifferenz "ordentlich" formatiert darstell
oh...hatte ich wohl übersehn :oops: danke!
und dan... jetzt kackt der programm immer wieser ab ( ![]() 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 :) ) |
Re: Zeitdifferenz "ordentlich" formatiert darstell
Häng den Screenshot mal hier an
|
Re: Zeitdifferenz "ordentlich" formatiert darstell
Zitat:
![]() ![]() |
Re: Zeitdifferenz "ordentlich" formatiert darstell
Hier im Forum!
|
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.
|
Re: Zeitdifferenz "ordentlich" formatiert darstell
Zitat:
|
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:
Und im Timer-Event dann so:
procedure TForm1.btn1Click(Sender: TObject);
begin FTimeUntil := Date + StrToTime(Format('%s:%s',[edtHour.Text,edtMinute.Text])); cdTimer.Enabled := True; end;
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; |
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 :?) |
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:
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.).
type TMyForm = class(TForm)
... private FTimeUntil: TTime; ... end; |
Re: Zeitdifferenz "ordentlich" formatiert darstell
Zitat:
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: ) |
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