Thema: Delphi Datumskonvertierung

Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.214 Beiträge
 
Delphi 12 Athens
 
#11

AW: TimeStr im Format 'hh:mm:ss' in DateTime

  Alt 12. Jan 2017, 22:34
Warum ist im DateFormat ein Time-String drin?
Sei froh, dass Delphi beim Encodieren von Datums-/Zeitwerten so schrottig arbeitet, sonst hätte es dir diesen "kaputten" Datums-String um die Ohren geworfen.

Zitat:
If ( ((ord(InStr[i]) >= 48) and (ord(InStr[i]) <= 57 )) ) then
Wozu diese komische Obfuskation?
Delphi-Quellcode:
If (InStr[i] >= '0') and (InStr[i] <= '9') then

If CharInSet(InStr[i], ['0'..'9']) then //If InStr[i] in ['0'..'9'] then
Sinnlose Kommentare, ala // Zahlenbereiche auf Ziffern prüfen , könnte man sich dann auch sparen.


Zitat:
copy( FormatDateTime('dd.mm.yyyy hh:nn:ss', now) ,1,11 )
Ähhhhhhhhh?
FormatDateTime('dd.mm.yyyy ', now)

Zitat:
Delphi-Quellcode:
except
  ... mach hier irgendwelchen sinnlosen Scheiß, der die eigentliche Fehlermeldung zerstört ...
end;
oder
Delphi-Quellcode:
except
end;
Für sowas sollten Leute gesteinigt werden.

Kurz gefasst macht deine Funktion ausschließlich das:
Delphi-Quellcode:
function TimeStrToDateTime(InStr: String): TDateTime;
var
  i: Integer;
  fs: TFormatSettings;
begin
  for i := Length(InStr) downto 1 do
    if not CharInSet(InStr[i], ['0'..'9']) then
      InStr[i] := ':';
  fs.TimeSeparator := ':';
  //fs.ShortTimeFormat := 'hh:nn:ss'; // das ist sowieso egal, da die Delphi-Date/Time-Decodierungsfunktionen die Formatstrings fahrlässig ignorieren
  // und nur die richtigen Separatoren, sowie TimeAMString und TimePMString beachten

  //try
    Result := DateOf(Now) + StrToTime(Instr, fs);
  //except
  // Result := 666.000001; // ein unverständlicher krumer Wert ... warum nicht einfach 0?
  //end;
 end;
DateOf(Now) = Delphi-Referenz durchsuchenDate, aber jeder nutzt lieber Now.

Und in Wirklichkeit wolltest du wohl nur sowas machen?
Delphi-Quellcode:
function TimeStrToDateTime(InStr: String): TDateTime;
var
  fs: TFormatSettings;
begin
  fs.TimeSeparator := ':';
  InStr := ReplaceString(InStr, ' ', ''); // inkl. Trim
  InStr := ReplaceString(InStr, '/', ':'); // ein anderer bekannter TimeSeparator
  InStr := ReplaceString(InStr, '-', ':'); // ...
  Result := DateOf(Now) + StrToTime(Instr, fs);
end;
Wer "Dreck" eingibt, also z.B. irgendwelche falsche Zeichen/Buchstaben, der hat gefälligst mit der passenden Fehlermeldung zu rechnen, wo ihm gesagt wird, dass er Mist gebaut hat.
$2B or not $2B

Geändert von himitsu (12. Jan 2017 um 22:56 Uhr)
  Mit Zitat antworten Zitat