Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - String nach Zeit konvertieren


jackle32 - So 19.01.14 18:14
Titel: String nach Zeit konvertieren
Hallo zusammen,

ich versuche gerade, bis jetzt ohne Erfolg, einen String in einen Zeit zu wandeln. Klingt jetzt nicht schwer und StrToTime ist mir bekannt. Problem ist jetzt aber, dass mein String die Form 'nn:ss.zzz' hat, also nur Minuten, Sekunden und Millisekunden.

Wenn ich jetzt zum Beispiel in meinem Edit 01:23.456 stehen hätte sollte das ja in eine TTime Variable rein gehen.
Beim Versuch der Umwandlung mit StrToTime bekomme ich immer eine EConvertError Fehlermeldung. Es gibt ja noch TryStrToTime. Damit bekomme ich keine Fehlermeldung und er wandelt auch nur falsch. Die Minuten im ursprünglichen String werden zu den Stunden in meiner Variablen vom Typ TTime.

Kennt dafür jemand eine Lösung?

Gruß,

Jack


Delete - So 19.01.14 18:46

Die Lösung lautet: Füge vor deinen String – von dem du ja weißt, daß er lediglich Minuten, Sekunden und Millisekunden enthält – einfach '00:' ein.


jaenicke - So 19.01.14 19:17

Oder gleich so, dann kann vorne die Stunde stehen, muss aber nicht:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
uses
  System.SysUtils, System.RegularExpressions;

function StrToTimeEx(const AValue: String): TTime;
var
  RegEx: TRegEx;
  Match: TMatch;
begin
  RegEx := TRegEx.Create('(([0-9]{1,2})?:)?([0-9]{1,2}):([0-9]{1,2})[\.,]([0-9]{1,3})');
  Match := RegEx.Match(AValue);
  if Match.Success and (Match.Length = Length(AValue)) then // check for length if the string should only be handled complete
    if Match.Groups[2].Length > 0 then // workaround for problem in TRegEx, Success is true though optional value is missing
      Result := EncodeTime(StrToInt(Match.Groups[2].Value), StrToInt(Match.Groups[3].Value), StrToInt(Match.Groups[4].Value),
        StrToInt(Match.Groups[5].Value))
    else
      Result := EncodeTime(0, StrToInt(Match.Groups[3].Value), StrToInt(Match.Groups[4].Value),
        StrToInt(Match.Groups[5].Value))
  else
    raise EConvertError.Create(Format('"%s" is no valid time!', [AValue]));
end;

// Test:
  ShowMessage(FormatDateTime('hh:nn:ss,zzz', StrToTimeEx('11:22.333')));
Das funktioniert mit oder ohne Stunde und mit einstelligen Werten für Stunde und Minute usw. genauso wie mit zwei bzw. drei Stellen.