Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi StrToTime löst Exception bei Millisekunden (https://www.delphipraxis.net/171509-strtotime-loest-exception-bei-millisekunden.html)

TUX_der_Pinguin 9. Nov 2012 11:18

Delphi-Version: 2009

StrToTime löst Exception bei Millisekunden
 
Ich versuche gerade einen String "12:05:20.160" in einen TDateTime umzuwandeln und nutze dazu die Funktion StrToTime. Diese löst jedoch eine Exception aus und meinte der String wäre keine gültige Zeit.

Ich habe schon versucht mit GetLocaleFormatSettings() die aktuellen Einstellungen zu laden und anzupassen, jedoch ohne erfolg.

Delphi-Quellcode:
var
  glFmtSet: TFormatSettings;
  Date: TDateTime;

begin
  GetLocaleFormatSettings(LOCALE_SYSTEM_DEFAULT, glFmtSet);
 
  glFmtSet.TimeSeparator := ':';
  glFmtSet.ShortTimeFormat := 'hh:nn:ss';
  glFmtSet.LongTimeFormat := 'hh:nn:ss.zzz';

  Date := StrToTime('12:05:20.160'); //Exception wird ausgelöst -> "Keine gültige Zeit"
Bei meiner Suche im Netz habe ich irgendwas gelesen davon das man nicht GetLocaleFormatSettings verwenden soll sondern TFormatSettings.Create, jedoch geht das mit Delphi 2009 nicht.

Ich hoffe es hat jemand einen Tipp ansonsten werde ich den String wohl zerlegen müssen und ihn mit EncodeTime() umwandeln.

Union 9. Nov 2012 11:27

AW: StrToTime löst Exception bei Millisekunden
 
Du musst den Decimalseparator in dem TFormatSetting anpassen, da dieser als ms Trennzeichen verwendet wird. Und natürlich auch die Formatsettings als Parameter übergeben. Zudem würde ich keine Funktionsnamen (i.e. Date) als Variablennamen verwenden:
Delphi-Quellcode:
var
   glFmtSet: TFormatSettings;
   Datum : TDateTime;
begin
   GetLocaleFormatSettings(LOCALE_SYSTEM_DEFAULT, glFmtSet);
   glFmtSet.DecimalSeparator := '.';
   Datum := StrToTime('12:05:20.160', glFmtSet);
end;

TUX_der_Pinguin 9. Nov 2012 12:18

AW: StrToTime löst Exception bei Millisekunden
 
Also DecimalSeparator ist bereits auf '.' gesetzt, ich hatte das nur nicht erwähnt in dem Beispiel.
Du hast natürlich auch recht das man die Format Einstellungen auch der Funktion übergeben muss. Aber
auch das war nur ein Fehler im Beispiel, genau wie der Variablen Name "Date" nur ein Beispiel ist.

Ich habe den Fehler gefunden ich hatte bei dem String erst den '.' in einen weiter ':' umgewandelt und
LongTimeFormat auf 'hh:nn:ss:zzz' eingestellt und das scheint wohl nicht zu gehen mit 'hh:nn:ss.zzz' klappt
es jetzt.

Delphi-Quellcode:
var
   glFmtSet: TFormatSettings;
   TestDate: TDateTime;

begin
   GetLocaleFormatSettings(LOCALE_SYSTEM_DEFAULT, glFmtSet);
   
   glFmtSet.ThoundSeparator := ',';
   glFmtSet.DecimalSeparator := '.';
   glFmtSet.DateSeparator := '.';
   glFmtSet.TimeSeparator := ':';
   glFmtSet.ShortDateFormat := 'dd.mm.yy';
   glFmtSet.LongDateFormat := 'dd.mm.yyyy';
   glFmtSet.ShortTimeFormat := 'hh:nn:ss';
   glFmtSet.LongTimeFormat := 'hh:nn:ss.zzz';

   TestDate := StrToTime('12:05:20.160', glFmtSet); //Jetzt klappt alles ;-)

Sir Rufo 10. Nov 2012 08:01

AW: StrToTime löst Exception bei Millisekunden
 
FYI

Da du im Datum-Formatstring nicht den DateSeparator-Platzhalter benutzt
Delphi-Quellcode:
/
ist es zwecklos den DateSeparator zu setzen. Es schadet nichts, bringt aber auch nichts.

Der TimeSeparator-Platzhalter ist übrigens
Delphi-Quellcode:
:
und den benutzt du - aber wohl eher zufällig

http://docwiki.embarcadero.com/Libra...FormatDateTime


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