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 parst in falsches Datum (https://www.delphipraxis.net/201073-strtotime-parst-falsches-datum.html)

Maliko 20. Jun 2019 15:28

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:
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]);
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?

Viele Grüße
Maliko

DieDolly 20. Jun 2019 15:35

AW: StrToTime parst in falsches Datum
 
Zitat:

30.12.1899
Das ist nicht irgendein Datum. Wenn man das rausbekommt, macht man was falsch. 30.12.1899 ist der Anfang des Timestamps.

Maliko 20. Jun 2019 15:36

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.

DieDolly 20. Jun 2019 15:38

AW: StrToTime parst in falsches Datum
 
Guck dir das an dann solltest du den Fehler finden
http://docs.embarcadero.com/products...TDateTime.html

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.

Delphi.Narium 20. Jun 2019 15:40

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.

Schokohase 20. Jun 2019 17:48

AW: StrToTime parst in falsches Datum
 
Delphi-Quellcode:
StrToDate
und Konsorten können nur ein Datum mit Datums-Trennzeichen verarbeiten. Steht auch in der Dokumentation.

p80286 21. Jun 2019 00:08

AW: StrToTime parst in falsches Datum
 
http://docwiki.embarcadero.com/Libra....ISO8601ToDate
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

Codehunter 21. Jun 2019 10:44

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 21:42 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