Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zeitstring 58:00 in ohne Überlauf in DateTime konvertieren (https://www.delphipraxis.net/74333-zeitstring-58-00-ohne-ueberlauf-datetime-konvertieren.html)

messie 1. Aug 2006 15:11


Zeitstring 58:00 in ohne Überlauf in DateTime konvertieren
 
Hallo,

ich habe zwei TMaskEdit, in die eine Zeit eingegeben wird (einmal Wartezeit sowie eine Ablaufzeit). Wenn ich
Delphi-Quellcode:
ActTime := StrToDateTime(Mask.Text);
eine Zeit von mehr als 24h gebe, gibt es eine Exception. Umgekehrt habe ich das Problem, daß FormatDateTime und andere beim Wandeln in einen String die Stunden abschneiden, die über 24h hinaus gehen.

Gibt es eine Lösung, die Formatierung so durchzuführen daß man auch mit DateTime > 1 arbeiten und das dann auch anzeigen kann?

Grüße, Messie

sakura 1. Aug 2006 15:19

Re: Zeitstring 58:00 in ohne Überlauf in DateTime konvertie
 
DateTime ist nichts anderes als ein Float. Alle Werte größer 1 sind mit 24 Stunden (einem Tag) gleichzusetzen. Wenn Du also die Stunden brauchst, dann musst Du mit Delphi-Referenz durchsuchenTrunc den Wert größer/gleich 1 ermitteln und mit 24 multiplizieren.

...:cat:...

messie 1. Aug 2006 15:51

Re: Zeitstring 58:00 in ohne Überlauf in DateTime konvertie
 
Zitat:

Zitat von sakura
DateTime ist nichts anderes als ein Float. Alle Werte größer 1 sind mit 24 Stunden (einem Tag) gleichzusetzen. Wenn Du also die Stunden brauchst, dann musst Du mit Delphi-Referenz durchsuchenTrunc den Wert größer/gleich 1 ermitteln und mit 24 multiplizieren.

...:cat:...

...was aber bedeutet, daß ich die Konvertierungen zu Fuß aufbauen muß. Genau das wollte ich vermeiden.

Grüße, Messie

sakura 1. Aug 2006 15:59

Re: Zeitstring 58:00 in ohne Überlauf in DateTime konvertie
 
Zitat:

Zitat von messie
...was aber bedeutet, daß ich die Konvertierungen zu Fuß aufbauen muß. Genau das wollte ich vermeiden.

Oder Du machst die oben genannte einfach Umrechnung, was imo die sinnvollste Lösung ist, da Du den reinen Floatwert eh nie anzeigen wirst ;)

...:cat:...

hoika 1. Aug 2006 16:04

Re: Zeitstring 58:00 in ohne Überlauf in DateTime konvertie
 
Hallo,

"zu Fuss"

es wird dir nichts anderes übrig bleiben
als eine eigene Routine zu schreiben.

Das "zu Fuss" machst du ja nur einmal.

Heiko

messie 1. Aug 2006 16:11

Re: Zeitstring 58:00 in ohne Überlauf in DateTime konvertie
 
Zitat:

Zitat von hoika
Hallo,

"zu Fuss"

es wird dir nichts anderes übrig bleiben
als eine eigene Routine zu schreiben.

Das "zu Fuss" machst du ja nur einmal.

Heiko

klar, ich hatte aber gehofft daß es vielleicht Aufrufkonventionen für die Standardfunktionen gibt, mit denen man das einstellen kann. In Excel beispielsweise gibt es eine auch Formatierung, die Stunden > 24 zuläßt.

Grüße, Messie

sakura 1. Aug 2006 16:17

Re: Zeitstring 58:00 in ohne Überlauf in DateTime konvertie
 
Zitat:

Zitat von messie
klar, ich hatte aber gehofft daß es vielleicht Aufrufkonventionen für die Standardfunktionen gibt, mit denen man das einstellen kann. In Excel beispielsweise gibt es eine auch Formatierung, die Stunden > 24 zuläßt.

Diese Formatierung musst Du halt selbst machen, aber das ist ja nun nicht schwer, oder :roll:
Delphi-Quellcode:
uses
  DateUtils; // oder so ähnlich ;)

function ToHourMinuteString(dt: TDateTime): string;
var
  Hours, Minutes, Dummy: Word;
begin
  DecodeTime(Hours, Minutes, Dummy, Dummy);
  Result := Format('%d:%d', [Trunc(dt) * 24 + Hours, Minutes]);
end;
Es kann sein, dass die Parameter bei DecodeTime jetzt nicht stimmen, aber es gibt ja die Hilfe ;)

...:cat:...

hoika 1. Aug 2006 17:19

Re: Zeitstring 58:00 in ohne Überlauf in DateTime konvertie
 
Hallo,

er wollte genau das Gegenteil String -> DateTime.
Übrigens kann DecodeTime auch nur Stunden bis 24.

Folgende Funktion hatte ich mir mal geschrieben.
Aber bitte nicht meckern, is elend lange her ;)

Delphi-Quellcode:
function StrToTime_hhhmm(theTimeStr: String; var theDateTime: TDateTime): Boolean;
var
  Counter  : Integer;
  Hours    : Integer;
  ResultTime: TDateTime;
  bMinus   : Boolean;
begin
  Result     := False;
  theDateTime := 0.0;
  bMinus     := False;

  try
    ResultTime:= 0.0;

    if Pos('-', theTimeStr)=1 then
    begin
      Delete(theTimeStr,1,1);
      bMinus:= True;
    end;

    {-- Die Stunden extrahieren--}
    {erstes Auftreten von : suchen}
    Counter:= Pos(':', theTimeStr)-1;

   {Stunden extrahieren }
    if Counter=-1 then
    begin
      Hours := StrToInt(theTimeStr);
      theTimeStr:= '';
    end
    else
    begin
      Hours := StrToInt(Copy(theTimeStr, 1, Counter));
      Delete(theTimeStr, 1, Counter); {Löscht hhh}
    end;

    {Stunden zu ResultTime addieren }
    while Hours >= 24 do
    begin
      ResultTime := ResultTime+1;
      Hours     := Hours-24;
    end;

    {Stunden <24 zurückschreiben}
    if theTimeStr='' then
    begin
      theTimeStr := IntToStr(Hours)+':00';
    end
    else
    begin
      theTimeStr := IntToStr(Hours)+theTimeStr;
    end;

    {RestString in DateTime umformen}
    ResultTime := ResultTime + StrToTime(theTimeStr);

    theDateTime:= ResultTime;

    if bMinus then theDateTime:= -theDateTime;

    Result:= True;
  except
    on Exception do;
  end;
end; { StrToTime_hhhmm }

Heiko

[edit=sakura] [delphi]-Tags Mfg, sakura[/edit]

sakura 1. Aug 2006 17:21

Re: Zeitstring 58:00 in ohne Überlauf in DateTime konvertie
 
@hoika: ich habe die Delphi-Tags eingefügt ;)
Zitat:

Zitat von hoika
er wollte genau das Gegenteil String -> DateTime.

Oops :oops:

...:cat:...

hoika 1. Aug 2006 17:30

Re: Zeitstring 58:00 in ohne Überlauf in DateTime konvertie
 
Danke ;)

Wieder was dazugelernt.
Das hatte bei entwickler.com nie so richtig funktioniert ;)


Heiko


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