![]() |
DateTimeToStr Konvertierungsproblem
moin zusammen,
ich habe beim konvertieren eines strings nach datetime folgendes problem, und zwar bekomme ich aus der registry einen string folgenden musters: '12.11.2007'. dieser lässt sich auf meinem rechner problemlos konvertieren. stelle ich aber nun in der systemsteuerung/regions- und sprachoptionen die regionalen einstellungen auf z.b. englisch, die ja bekannterweise ein anderes datumsformat haben, kommt es natürlich zu einem konvertierungsfehler: '12.11.2007' ist keine gültige Datums- und Uhrzeitangabe. meine frage ist jetzt ob einer die idee hat wie ich erkennen kann welches datumsformat vom system gewünscht wird und ich den string ggfs. so umbauen kann, dass eine konvertierung klappt. mfg Jonny |
Re: DateTimeToStr Konvertierungsproblem
Moin alleine,
es gibt in Delphi globale Variablen, die Du setzen musst. Ich glaube, sie heissen ShortDateFormat und LongDateFormat. Damit bist Du unabhängig von den Einstellungen in der Systemsteuerung. Klaus |
Re: DateTimeToStr Konvertierungsproblem
danke klaus, hat wunderbar funktioniert :)
|
Re: DateTimeToStr Konvertierungsproblem
Moin, moin,
ich hab da grad ein Problem mit dem ShortDateFormat, deshalb häng ich hier mal mit dran. Ich benutze in einem Programm auch das ShortDateFormat um unabhängig von den Einstellungen der Datumseinstellung des PCs zu sein. Wenn mein Programm gestartet wird stelle ich in FormActivate yyyy-dd-mm ein. Alles funktioniert auch, aber wenn ich meinen Computer sperre (Strg+Alt+Entf z.B.) und mich anschliessend wieder anmelde schmiert mein Programm anschliessend gnadenlos ab, weil jetzt das ShortDateFormat wieder so ist, wie am PC eingestellt (dd.mm.yyyy). Ich denke XP liesst die Registry neu ein, aber wie bringe ich das jetzt meinem Programm bei? Hab schon mit den Form-Ereignissen experimentiert, aber irgendwie wird keins in dem Moment aufgerufen, wenn man den PC entsperrt. Hat jemand einen Tipp für mich? Lieben Gruß, Andreas. |
Re: DateTimeToStr Konvertierungsproblem
Verwende am Bestn die überladene Version der Konvertierungsfunktionen mit dem Format als Parameter.
|
Re: DateTimeToStr Konvertierungsproblem
Wenn Du Deinen Rechner sperrst, läuft Dein Programm ganz normal weiter. Ich vermute daher, dass irgendeine Komponente das ShortDateFormat zurückstellt. Ich hab mir angewöhnt, es immer direkt vor den Stellen zu setzen, wo ich auch die Konvertierung mache. Dann wird die Zuweisung zwar häufiger gemacht als nötig, aber es handelt sich um eine einfache Stringzuweisung an eine globale Variable.
Klaus |
Re: DateTimeToStr Konvertierungsproblem
Hallo Klaus, hallo mkinzler,
vielen Dank für die Antworten. Ich werde mein Programm wohl so umschreiben, dass ich unabhängig vom Datumsformat vom PC bin. Den Hinweis mit der Komponente verstehe ich nicht? Welche Komponente soll das Datumsformat umschreiben? In meinem Programm wird es nirgends zurückgestellt, es kann nur von Windows zurückgestellt werden. Gruß, Andreas. |
Re: DateTimeToStr Konvertierungsproblem
Diese Variablen zu setzen halte ich für einen Fehler. Ein Nutzer will ein Datum in der Art und Weise angezeigt bekommen wie es im System eingestellt ist. Wenn jetzt irgend eine Komponente ein spezielles Format erwartet und es umstellst stimmt von einer anderen Komponente plötzlich die visuelle Ausgabe nicht mehr mit dem überein was der Nutzer erwartet. Daher sollte man wie bereits erwähnt die überladenen Methoden verwenden wo man angeben kann welches format bei der Konvertierung genutzt werden soll.
Und das unschöne Effekte passieren wenn man sich auf die werte der globalen Variablen verlässt wurde ja schon festgestellt :-D |
Re: DateTimeToStr Konvertierungsproblem
Hallo Andreas,
wenn Du Deinen Rechner sperrst, wird doch nur die Bedienung des Rechners verhindert, bis Du Dich wieder anmeldest. Warum sollte Windows dann ein Neueinlesen der Registry durchführen und überhaupt, wohin einlesen. In Delphi sind eine globale Variable ShortDateFormat und einige weitere für ähnlich Aufgaben implementiert. Ein Delphi-Programm liest beim Start einmal den zugehörigen Wert aus der Registry und danach kann der Wert vom Programm verändert werden. Windows weiß aber überhaupt nichts davon, dass ein Delphi-Programm so vorgeht, kann also an der Stelle auch nicht von sich aus den Wert wieder zuurücksetzen. Meine Erfahrung ist, dass bei Einsatz von (Fremd-)Komponenten häufig solche Einstellungen wieder zurückgesetzt werden, weil diese Komponenten die Einstellungen eben für ihre eigenen Zwecke zurechtbiegen und den vorherigen Zustand nicht wieder herstellen. Klaus |
Re: DateTimeToStr Konvertierungsproblem
Hallo Klaus,
tja es ist aber so, dass Windows das Datumsformat nach der Neuanmeldung umstellt. Ich habe ein Testprojekt gemacht mit einem Memofeld und einem Button. Der Quelltext sieht so aus:
Delphi-Quellcode:
Beim Start ist das Datumsformat so wie an ShortDateFormat übergeben, aber wenn man Windows
procedure TForm1.FormActivate(Sender: TObject);
begin ShortDateFormat:='YYYY-DD-MM'; DateSeparator:='-'; Memo1.Lines.Add(''); Memo1.Lines.Add(ShortDateFormat); Memo1.Lines.Add(DateSeparator); end; procedure TForm1.Button1Click(Sender: TObject); begin Memo1.Lines.Add(''); Memo1.Lines.Add(ShortDateFormat); Memo1.Lines.Add(DateSeparator); end; einmal sperrt und sich wieder anmeldet, und dann den Button drückt, ist das Datumsformat anders (wie in der Systemsteuereung von Windows festgelegt). Ich wüsste jetzt nicht welche (Fremd)Komponente das Format umgestellt haben könnte. Deshalb muss man Sir Thornberry wohl recht geben ;-) Gruß, Andreas. [edit=SirThornberry] Mfg, SirThornberry[/edit] |
Re: DateTimeToStr Konvertierungsproblem
ich finde es auch einigermaßen einleuchtend das nach dem sperren die einstellungen aktuallisiert werden. Denn wenn man zum Beispiel per Remotedesktop zugreift nutzt man eventuell andere Spracheinstellungen.
|
Re: DateTimeToStr Konvertierungsproblem
Zitat:
Wenn du das bist, dann solltest du das Format ändern. Entweder a.) das ![]() Es gilt folgende Grundregel: Niemals ein Datum / Uhrzeit so speichern, wie es dem Benutzer an der Oberfläche präsentiert wird! Immer ein international anerkanntes Stringformat oder ein maschinenlesbares Format verwenden. Variante b.) ist besonders einfach:
Delphi-Quellcode:
Übrigens !!! Die Klasse TRegistry hat die Methoden ReadDate, WriteDate.
var
datum : TDateTime; begin ... datum := SysUtils.Date; Reg.WriteString('LastUpdate', IntToStr(Trunc(datum))); // Trunc schneidet den evtl. Zeitanteil ab ... datum := StrToFloat(Reg.ReadString('LastUpdate')); // und zurück lesen Damit wird ein Datum gleich binär in die Registry geschrieben/gelesen. CPU-Belastung und Speicherverbrauch sind hier am Kleinsten. |
Re: DateTimeToStr Konvertierungsproblem
Moin, moin
ich bin es noch einmal. Ich hab die Sache jetzt dahin umgebogen, dass ich unabhängig von den eingestellten Datums- und Uhrzeitformaten des PCs bin. Dazu habe ich "StrToTimeDef" und "StrToDateDef" benutzt. Allerdings bin ich jetzt auf eine Sache gestossen, die ich nicht verstehe (muss dazu sagen, dass ich kein Profi in Sachen Programmierung bin, sondern das eher als Hobby betreibe um nich ganz zu verblöden). Folgenden Quellcode habe ich erstellt:
Delphi-Quellcode:
Zeit1 und Zeit2 sind identisch und die Abfrage Zeit1 kleiner Zeit2 wird auch übersprungen.
procedure TForm1.Button1Click(Sender: TObject);
var Datumsformat: TFormatSettings; Zeit1,Zeit2: TDateTime; begin Datumsformat.DateSeparator:='-'; Datumsformat.ShortDateFormat:='yyyy-dd-mm'; Datumsformat.TimeSeparator:=':'; Datumsformat.ShortTimeFormat:='HH:mm:ss'; Memo1.Clear; Zeit1:=(StrToDateDef('2007-10-08', -10, Datumsformat) + StrToTimeDef('10:00:00', -10, Datumsformat)); Zeit2:=(StrToDateDef('2007-10-08', -10, Datumsformat) + StrToTimeDef('10:00:00', -10, Datumsformat)); if Zeit1 < Zeit2 then begin Memo1.Lines.Add('Zeit1 kleiner Zeit2'); //Dies wird nie erreicht end; if Zeit1 < (StrToDateDef('2007-10-08', -10, Datumsformat)+StrToTimeDef('10:00:00', -10, Datumsformat)) then begin Memo1.Lines.Add('Zeit1 kleiner Berechnung'); //Dies wird immer erreicht Memo1.Lines.Add('Aber warum???'); end; Memo1.Lines.Add(''); Memo1.Lines.Add('Kurzes Datumsformat PC: '+ShortDateFormat); Memo1.Lines.Add('Datumsseparator: '+DateSeparator); end; Warum aber ist bei der zweiten Abfrage mit der Berechnung statt Zeit2 die Zeit1 plötzlich kleiner ? Kann mir das jemand erklären? Ich bin einigermassen ratlos... Gruß, Andreas. |
Re: DateTimeToStr Konvertierungsproblem
Hallo Andreas,
Datum und Zeit werden in Delphi (und nicht nur dort) als Bruchteile und Vielfache eines Tages gesehen und auf einen Gleitkommawert abgebildet. Beim Vergleich von zwei anscheinend gleich großen Gleitkommawerten treten fast regelmäßig Abbildungsprobleme bei den letzten Nachkommastellen der entsprechenden Zahlen auf, deshalb musst du entweder mit einer Epsilon-Schranke arbeiten oder vor dem Vergleich auf eine für deine Zwecke ausreichende Genauigkeit (Sekunden) umrechnen. Grüße vom marabu |
Re: DateTimeToStr Konvertierungsproblem
Hallo marabu,
vielen Dank für Deine Antwort, dann ist das Ganze wohl ein Rundungsproblem. Dank an alle, die geholfen haben. Gruß, Andreas. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:54 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz