AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit Zeitangabe

Offene Frage von "stahli"
Ein Thema von Chaosritter · begonnen am 18. Mär 2011 · letzter Beitrag vom 18. Mär 2011
Antwort Antwort
Chaosritter

Registriert seit: 18. Mär 2011
1 Beiträge
 
#1

Problem mit Zeitangabe

  Alt 18. Mär 2011, 13:17
Hallo zusammen,
Ich bin gerade dabei ein Projekt zuschreiben. Dabei möchte ich eine Zeit mit TTime ausgeben, die größer wie 24h ist. Ich habe hier im Forum schon bestimmte Artikel gelsesen, die mir aber entweder bei der Lösungsfindung nicht weiter geholfen haben oder ich verstehe die angebotene Lösung nicht. Ihr müsst wissen, dass ich ein blutiger Anfänger bin.
Hier erstmal der betreffende Programmteil
Delphi-Quellcode:
if StrToTime(Edit1.Text) < StrToTime(Edit5.Text) then
begin
  Flugzeit := StrToTime(Edit1.Text) - StrToTime(Edit5.Text);
  Listbox8.Items.add(TimeToStr(Flugzeit));
  Gesamtflugzeit:= Gesamtflugzeit + Flugzeit;
  Listbox22.Items.clear;
  Listbox22.Items.Add(timetostr(Gesamtflugzeit));
 end;

if StrToTime(Edit1.Text) > StrToTime(Edit5.Text) then
begin
  Flugzeit:= 24 - (StrToTime(Edit1.Text) - StrToTime(Edit5.Text));
  Listbox8.Items.add(TimeToStr(Flugzeit));
  Gesamtflugzeit:= Gesamtflugzeit + Flugzeit;
  Listbox22.Items.clear;
  Listbox22.Items.Add(timetostr(Gesamtflugzeit));
end;
end;
Bei dem Programm geht es darum Gesamtflugzeiten eines Flugtages auszurechnen. Da aber mehrere Flugzuge gleichzeitig fliegen können, kann diese >24h werden. =)

Ich bitte nun also um konkrete Hilfe (bezogen auf unser Programm), wie die Zeit bieliebig weit weiter gezählt wird und nicht bei 24:00 wieder auf 0:00 springt.

Danke im Vorraus.

Gruß

Chaosritter
  Mit Zitat antworten Zitat
Benutzerbild von Billa
Billa

Registriert seit: 11. Aug 2003
237 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Problem mit Zeitangabe

  Alt 18. Mär 2011, 13:34
Überprüfe doch mal Deine Einstellungen bzgl Zeitformat! TimeToStr wertet standardmässig m.E. nur den Nachkommaanteil eines TDateTime aus. Ggf musst Du Vorher den Vorkommaanteil abtrennen.
Gruß Billa

Nur weil ich paranoid bin, heißt das nicht, daß die da draussen nicht hinter mir her sind....
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
655 Beiträge
 
Delphi 12 Athens
 
#3

AW: Problem mit Zeitangabe

  Alt 18. Mär 2011, 14:16
Mir ist von Delphi aus keine Funktion bekannt, die dir einen TTime oder TDateTime-Wert in ein Format hh:mm umwandeln würde, bei dem die Stunden >24 sein dürfen.

Das wirst du also schon selber umrechnen müssen. Ist aber eigentlich kein Problem - du solltest nur wissen, dass du, wenn du mit TTime oder TDateTime arbeitest, letztlich in deiner Differenz-Variable nichts anderes stehen hast, als die Differenz in Tagen.

Nehmen wir an, du hast
Code:
flugzeit = 1.5
Also eine Flugzeit von 1,5 Tagen. Um auf die Stunden zu kommen, nimmst du den Wert einfach *24:
flugStunden:=trunc(flugzeit*24)
Mit "trunc" wird dabei abgerundet, so dass du immer nur die ganzen Stunden erhälst (hier ist es natürlich immer 36 Stunden, weil 1,5 Tage nun mal genau passt). Nun darfst du noch ein bisschen knobeln, wie du an die Minuten kommst. Hierzu musst du dir den Restwert angucken, der übrig bleibt, wenn man von der gesamten Flugzeit die bisher ermittelten vollen Stunden abzieht, diesen Restwert *24*60 nehmen und du hast deine Minuten.

Ich hoffe, das hilft dir erst mal weiter.

Bis denn
Bommel

Geändert von Bbommel (18. Mär 2011 um 14:23 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Problem mit Zeitangabe

  Alt 18. Mär 2011, 15:01
Ich habe drei ältere Funktionen, um Zeininformationen anzuzeigen (Stunden, Tage Minuten usw).
Falls das hilft:

Delphi-Quellcode:
unit ssTimes;

interface

function BeforeTimeString(DT: TDateTime): String;
function DateTimeDurationString(DT: TDateTime; DifFlag, NullFlag, HourFlag, SecondFlag: Boolean): String;
function SecondDurationString(Sec: Integer; DifFlag, NullFlag: Boolean): String;

implementation

uses
  SysUtils;

function BeforeTimeString(DT: TDateTime): String;
var
  Hour, Min, Sec, MSec: Word;
  N, Dif: TDateTime;
  D, H: TDate;
  T: Word;
  S: String;
begin
  S := '';
  if DT > 0 then
  begin
    N := Now;
    D := TDate(DT);
    H := TDate(N);
    T := Trunc(H) - Trunc(D);
    Dif := N - DT;
    if Dif <= StrToTime('6:00:00') then
    begin
      DecodeTime(Dif, Hour, Min, Sec, MSec);
      if Hour > 0 then
        S := 'vor ' + FormatDateTime('h:nn', Dif) + ' h'
      else
      if Min > 0 then
        S := 'vor ' + FormatDateTime('n', Dif) + ' min'
      else
      if Sec > 1 then
        S := 'vor ' + FormatDateTime('s', Dif) + ' sec'
      else
        S := 'jetzt';
    end
    else
    begin
      case T of
        0: S := 'heute';
        1: S := 'gestern';
        2: S := 'vorgestern';
        else
          S := 'vor ' + IntToStr(T) + ' Tagen';
      end;
    end;
  end;
  Result := S;
end;

function DateTimeDurationString(DT: TDateTime; DifFlag, NullFlag, HourFlag, SecondFlag: Boolean): String;
var
  Tage, Hour, Min, Sec, MSec: Word;
  N, Dif: TDateTime;
  S: String;
begin
  S := '';
  if DifFlag then
  begin
    N := Now;
    if DT > N then
      Dif := DT - N
    else
      Dif := 0;
  end
  else
  begin
    if DT > 0 then
      Dif := DT
    else
      Dif := 0;
  end;
  if (Dif <> 0) or (NullFlag) then
  begin
    Tage := Trunc(Dif);
    DecodeTime(Dif, Hour, Min, Sec, MSec);
    if (Tage = 0) or (HourFlag) then
    begin
      if Hour > 0 then
      begin
        if SecondFlag then
          S := FormatDateTime('hh:nn:ss', Dif) + ' h'
        else
          S := FormatDateTime('hh:nn', Dif) + ' h';
      end
      else
      if Min > 0 then
      begin
        if SecondFlag then
          S := FormatDateTime('nn:ss', Dif) + ' min'
        else
          S := FormatDateTime('n', Dif) + ' min';
      end
      else
      begin
        if SecondFlag then
          S := FormatDateTime('ss', Dif) + ' sec'
        else
          S := '< 1 min';
      end;
    end;
    if Tage > 0 then
    begin
      if Dif - Tage = 0 then
        S := ''
      else
      if S <> 'then
        S := ', ' + S;
      if Tage = 1 then
        S := '1 Tag' + S
      else
        S := IntToStr(Tage) + ' Tage' + S;
    end;
  end
  else
    S := '';
  Result := S;
end;

function SecondDurationString(Sec:Integer;DifFlag,NullFlag:Boolean):String;
var
  DT: TDateTime;
begin
  DT := (Sec/60/60/24);
  Result := DateTimeDurationString(DT, DifFlag, NullFlag, True, True);
end;

end.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  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 09:09 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