![]() |
Delphi-Version: 7
StrToTime parst in falsches Datum
Hoi,
ich hab da ein sehr merkwürdiges Problem. Und zwar versuche ich momentan einen String in ein DateTime zu parsen. Wenn ich diesen aber zurück in einen String parse, bekomme ich ein komplett anderes Datum raus als ich reingeworfen habe. Folgenden Code verwende ich:
Code:
Wenn ich jetzt z.B. 20180602 reinschmeiße, bekomme ich aus irgendeinem grund 30.12.1899 zurück wenn ich den Datetime anschließend in DateToStr werfe. Hat jemand zufällig ne Idee was ich da falsch mache?
function Unit1.AnyStringToDate(fmt, dt: String) : TDateTime;
var fs : TFormatSettings; Begin GetLocaleFormatSettings(LOCALE_SYSTEM_DEFAULT, fs); fs.DateSeparator := '-'; fs.ShortDateFormat := fmt; result := StrToDateDef(dt, 0, fs); End; mZHIDate := Self.AnyStringToDate('yyyymmdd', mZHISplit[3]); Viele Grüße Maliko |
AW: StrToTime parst in falsches Datum
Zitat:
|
AW: StrToTime parst in falsches Datum
Das ich was falsch mache ist mir klar. Sonst hätte ich ja nicht gefragt. Ich hab nur nicht den geringsten Schimmer was ich falsch mache.
|
AW: StrToTime parst in falsches Datum
Guck dir das an dann solltest du den Fehler finden
![]() Du schmeißt 20180602 rein. Das steht wohl in mZHISplit[3]. Aber dein DateSeparator ist -. Das muss doch schief gehen. ich würde dt anhand des fmt mit den Decode-Funktionen auseinanderpflücken. Außerdem erwartet StrToDate etwas anderes. |
AW: StrToTime parst in falsches Datum
StrToDateDef(dt, 0, fs); liefert im Fehlerfalle das Datum 0 und das ist als Zeichenfolge der 30.12.1899. Das ist also absolut korrekt so.
Eventuell solltest Du erstmal nur StrToDate(dt) nehmen, Dir die daraus resultierende Fehlermeldung anschauen, den Eingabewert oder die Konfiguration von fs anpassen und erst dann, wenn kein Fehler mehr auftritt, StrToDateDef verwenden, was ja in Deiner Routine im Fehlerfalle explizit den 30.12.1899 als Rückgabewert liefern soll. |
AW: StrToTime parst in falsches Datum
Delphi-Quellcode:
und Konsorten können nur ein Datum mit Datums-Trennzeichen verarbeiten. Steht auch in der Dokumentation.
StrToDate
|
AW: StrToTime parst in falsches Datum
![]() das könnte weiterhelfen wenn es denn mit 2018-06-02....... gefüttert wird. Daß die Kurzform nicht akzeptiert wird ist schade, aber das kommt bestimmt, die lezte Ausgabe is ja erst knapp 13 Jahre alt. (oder Du programmierst das selbst) Gruß K-H |
AW: StrToTime parst in falsches Datum
Das folgende verwende ich für genau dieses Datumsformat. Du musst wahrscheinlich nur den einen oder anderen Begrenzer anpassen, je nach deinen Anforderungen.
Delphi-Quellcode:
function StrToDate(const AValue: string): TDate;
var LJahr, LMonat, LTag: Word; function DaysOfMonth(AMonat: Word; AJahr: Word = 0): Word; begin if (AMonat = 0) or (AMonat > 12) then begin Result := 0 end else begin if AMonat = 2 then begin if AJahr = 0 then begin AJahr := CurrentYear; end; Result := 28 + Byte(IsLeapYear(AJahr)); end else begin if AMonat > 7 then Dec(AMonat); Result := 30 + (AMonat mod 2); end; end; end; begin Result := 0; LJahr := StrToIntDef(Copy(AValue, 1, 4), 0); if (LJahr < 1) or (LJahr > 3000) then begin exit; end; LMonat := StrToIntDef(Copy(AValue, 5, 2), 0); if (LMonat < 1) or (LMonat > 12) then begin exit; end; LTag := StrToIntDef(Copy(AValue, 7, 2), 0); if (LTag < 1) or (LTag > DaysOfMonth(LMonat, LJahr)) then begin exit; end; if not TryEncodeDate(LJahr, LMonat, LTag, TDateTime(Result)) then begin Result := 0; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:02 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 by Thomas Breitkreuz