Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   StringToDate Problem (https://www.delphipraxis.net/192626-stringtodate-problem.html)

gee21 6. Mai 2017 10:08

StringToDate Problem
 
Hallo

Ich habe eine Textdatei die so aufgebaut ist

Name1
25.03.1986
Name2
12.05.2017
Name3
19.01.2000


Ich lade dieses Text File in eine TStringlist und muss nun alle Namen in eine Checklistbox übertragen.

Ich habe das so versucht.

Delphi-Quellcode:
 function IsDate(str: string): Boolean;
var
  dt: TDateTime;
begin
  Result := True;
  try
    dt := StrToDate(str);
  except
    Result := False;
  end;

end;


Delphi-Quellcode:
      for I := 39 to 78 do
      if isdate(server.Strings[i])=false then if server.Strings[i]='Nothing'=false then checklistbox1.items.add(server.Strings[i]);
      end;


Bei mir und den meisten Leuten in Deutschland funktioniert das. Aber in gewissen anderen Sprachen/Ländern/Systemsprachen? funktioniert dieser Code nicht weil das Datum nicht als Datum erkannt wird und somit fälschlicherweise in die checklistbox Liste kommt.

Ich dachte dann, ich kann ganz einfach die "." durch "/" ersetzen und dann wird es als Datum erkannt. Das funktioniert aber nur halbwegs. Ich vermute es liegt daran das TAG und Monat evt noch getauscht werden müssten. Weil sonst nur Datum bis zum 12.Tag/Monat korrekt erkannt werden?


Es gibt doch bestimmt eine Möglichkeit wie ich mein "EUROPA Standart Datum" aus der Textdatei also zB 17.02.1990 auf jedem Computer system als gültiges Datum prüfen kann?

himitsu 6. Mai 2017 10:17

AW: StringToDate Problem
 
RegEx ?

Warum fällt dir nicht auf, dass StrToDate und Co. noch einen weiteren Parameter besitzen?
Delphi-Referenz durchsuchenStrToDate

Und keine Ahnung, warum viele Entwickler fahrlässig Exceptions zur Steuerung missbrauchen.
Vorallem beim Debuggen macht so ein Code absolut keinen Spaß. So könnte man fast auf die Idee kommen, dass Viele auch niemals den Debugger benutzen. :shock:
Delphi-Referenz durchsuchenTryStrToDate

HolgerX 6. Mai 2017 10:41

AW: StringToDate Problem
 
Hmm..

Eine Frage:
Wer erstellt diese Textdatei?

Ich kenne das Problem mit String -> Date, gerade wenn die Dateien von irgendeiner Maschine kommen, welche eine andere Sprache eingestellt hat (z.B. EN) und der PC, welcher die Datei einließt z.B. auf DE steht.

Wenn Du Einfluss auf das Erstellen der Textdatei hast, dann würde ich empfehlen entweder ein festes Format (FormatDate mit z.B. immer YYYY-MM-DD) oder direkt das ISO Format zu verwenden.
Dann ist das Konvertieren immer gleich, egal welche Sprache auf dem System/User eingestellt ist.

gee21 6. Mai 2017 11:09

AW: StringToDate Problem
 
Zitat:

Zitat von himitsu (Beitrag 1370403)
RegEx ?

Warum fällt dir nicht auf, dass StrToDate und Co. noch einen weiteren Parameter besitzen?
Delphi-Referenz durchsuchenStrToDate

Und keine Ahnung, warum viele Entwickler fahrlässig Exceptions zur Steuerung missbrauchen.
Vorallem beim Debuggen macht so ein Code absolut keinen Spaß. So könnte man fast auf die Idee kommen, dass Viele auch niemals den Debugger benutzen. :shock:
Delphi-Referenz durchsuchenTryStrToDate

Ich war mir eben nicht sicher ob dies der parameter ist den ich brauche das es klappt. da ich nicht mal 100% sicher bin was dieser parameter macht. und ebenfalls war ich mir nicht sicher was überhaupt das problem war. Du hast natürlich bestimmt mit allem recht betreffend Debuggen und so. Aber ich bringe mir Delphi schritt für schritt selbst bei und deshalb fehlen mir dann so grundlegende sachen die für euch halt "ganz logisch / normal sind).



Zitat:

Zitat von HolgerX (Beitrag 1370405)
Hmm..

Eine Frage:
Wer erstellt diese Textdatei?

Ich kenne das Problem mit String -> Date, gerade wenn die Dateien von irgendeiner Maschine kommen, welche eine andere Sprache eingestellt hat (z.B. EN) und der PC, welcher die Datei einließt z.B. auf DE steht.

Wenn Du Einfluss auf das Erstellen der Textdatei hast, dann würde ich empfehlen entweder ein festes Format (FormatDate mit z.B. immer YYYY-MM-DD) oder direkt das ISO Format zu verwenden.
Dann ist das Konvertieren immer gleich, egal welche Sprache auf dem System/User eingestellt ist.


Aha... Ja ich glaube das klingt nach meinem Problem :)
Ich mache diese Textdatei und kann das Format beliebig schreiben.
Dann versuche ich mal mit FormatDate aber bis jetzt klappts nnoch nicht.

himitsu 6. Mai 2017 11:14

AW: StringToDate Problem
 
Aus diesem Grund, haben fast alle Funktionen einen Format-Parameter.
XxxToStr/StrToXxx/Format/FormatDateTime

Da gibt man die "Landesspezifikationen" dieses Strings an.
. oder ,
: oder /
usw.

Außerdem hat FormatDateTime ein paar Formatspezifische Steuerzeichen.

Delphi-Quellcode:
'jjjj.mm.dd'
is nicht das Selbe, wie
Delphi-Quellcode:
'jjjj"."mm"."dd'
, außer man gibt in den FormatSettings vor, dass das Steuerzeichen
Delphi-Quellcode:
.
auch ein
Delphi-Quellcode:
.
ist.

Und gerade "externe" Werte sollten "immer" in einem fest definierten Format gespeichert werden.
extern = Dateien und Datenübertragungen aus der EXE heraus (IPC, Netzerk usw.)

gee21 6. Mai 2017 11:41

AW: StringToDate Problem
 
Danke für die Hilfe. Hab mal was versucht.

Wäre es so ungefähr korrekt? Bei mir gehts zumindest. Aber bei mir gings ja bis jetzt auch immer. Kann es schlecht testen, oder?


Delphi-Quellcode:
 function IsDate(str: string): Boolean;
var
  dt: TDateTime;
  DateOne: TDate;
  LocalFormatSettings: TFormatSettings;
  s: string;
begin
  Result := True;
  try

     GetLocaleFormatSettings(LOCALE_SYSTEM_DEFAULT, LocalFormatSettings);
      LocalFormatSettings.DateSeparator := '.';
      s := FormatDateTime('dd.mm.yyyy', strtodate(str), LocalFormatSettings);

    dt := StrToDate(s);
  except
    Result := False;
  end;

  end;


Delphi-Quellcode:
    for I := 39 to 78 do begin

     s := server.Strings[i];  //Datum zB: 17.03.2017    aus der textdatei

      if isdate(s)=false then begin
         if server.Strings[i]='Nothing'=false then cat1.add(server.Strings[i]);
      end;

    end;

NormanNG 6. Mai 2017 11:58

AW: StringToDate Problem
 
Hi,

mal ein anderer Ansatz:
Wenn jede zweite Zeile ein Datum ist, dann kann man z.B. auch auf un-/geraden Index prüfen.

... if odd(i) then ...

oder gleich eine while-Schleife und einen Index mit Schrittweite 2

gee21 6. Mai 2017 12:12

AW: StringToDate Problem
 
Zitat:

Zitat von NormanNG (Beitrag 1370412)
Hi,

mal ein anderer Ansatz:
Wenn jede zweite Zeile ein Datum ist, dann kann man z.B. auch auf un-/geraden Index prüfen.

... if odd(i) then ...

oder gleich eine while-Schleife und einen Index mit Schrittweite 2


Lol. Ja ich machs einfach so ;) Danke dir :)

Dalai 6. Mai 2017 12:25

AW: StringToDate Problem
 
Noch ein anderer Ansatz: Wenn du die Textdatei eh selbst schreibst und das Format selbst definieren kannst, dann setze Datum und Name in dieselbe Zeile, getrennt durch ein Zeichen deiner Wahl - z.B. die Pipe | oder Sternchen * oder sowas, irgendetwas, das garantiert nicht im Namen und Datum vorkommen kann.

Der Ansatz geht natürlich davon aus, dass Datum und Name zueinander gehören.

Grüße
Dalai

Bernhard Geyer 6. Mai 2017 12:29

AW: StringToDate Problem
 
Zitat:

Zitat von gee21 (Beitrag 1370402)
Ich dachte dann, ich kann ganz einfach die "." durch "/" ersetzen und dann wird es als Datum erkannt. Das funktioniert aber nur halbwegs.

Vor allem ist die Formatierung mit "/" nicht eindeutig.
Da gibt den US-Raum der "Monat/Tag/Jahr" verwendet und den "Restraum" der Welt der Tag/Monat/Jahr" verwendet.

Zitat:

Zitat von HolgerX (Beitrag 1370405)
...(FormatDate mit z.B. immer YYYY-MM-DD) oder direkt das ISO Format zu verwenden.

YYYY-MM-DD ist ja schon das (erweiterte/lange) ISO-Format (https://de.wikipedia.org/wiki/ISO_8601


Zitat:

Zitat von gee21 (Beitrag 1370408)
Ich mache diese Textdatei und kann das Format beliebig schreiben.

Dann sollte man immer (wenn die Datei elektronisch verarbeitet werden soll) immer das ISO-Format verwenden.

HolgerX 6. Mai 2017 13:08

AW: StringToDate Problem
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1370416)
Zitat:

Zitat von HolgerX (Beitrag 1370405)
...(FormatDate mit z.B. immer YYYY-MM-DD) oder direkt das ISO Format zu verwenden.

YYYY-MM-DD ist ja schon das (erweiterte/lange) ISO-Format (https://de.wikipedia.org/wiki/ISO_8601

( ;) )

@Gee21

Du solltes nicht deine 'Prüfroutine' umschreiben, sondern die Stelle, an der Du die Text-Datei schreibst!

Dort solltest du das Datum nicht einfach mit DateToStr in deine Textdatei schreiben, sondern mit FormatDate bei Verwendung von z.B. 'YYYY-MM-DD' als Formatstring.

Dann haben alle Datumsangaben immer das gleiche Format, egal welche Sprache auf dem QuellPC eingestellt ist! ;)

zeras 6. Mai 2017 13:36

AW: StringToDate Problem
 
Zitat:

Zitat von gee21 (Beitrag 1370411)


Delphi-Quellcode:
    for I := 39 to 78 do begin

     s := server.Strings[i];  //Datum zB: 17.03.2017    aus der textdatei

      if isdate(s)=false then begin
         if server.Strings[i]='Nothing'=false then cat1.add(server.Strings[i]);
      end;

    end;

Auch sollte nicht "=false" schreiben, sondern

Delphi-Quellcode:
    for I := 39 to 78 do begin

     s := server.Strings[i];  //Datum zB: 17.03.2017    aus der textdatei

      if not isdate(s) then begin
         if server.Strings[i]='Nothing'=false then cat1.add(server.Strings[i]);
      end;

    end;
[/QUOTE]

HolgerX 6. Mai 2017 19:16

AW: StringToDate Problem
 
Hmm..

dann aber auch gleich statt


Zitat:

Zitat von zeras (Beitrag 1370419)
Delphi-Quellcode:
    for I := 39 to 78 do begin

     s := server.Strings[i];  //Datum zB: 17.03.2017    aus der textdatei

      if not isdate(s) then begin
         if server.Strings[i]='Nothing'=false then cat1.add(server.Strings[i]);
      end;

    end;


das 2. =false auch entfernen ;)

Delphi-Quellcode:
    for I := 39 to 78 do begin

     s := server.Strings[i];  //Datum zB: 17.03.2017    aus der textdatei

      if not isdate(s) then begin
         if not(server.Strings[i]='Nothing') then cat1.add(server.Strings[i]);
      end;

    end;

p80286 7. Mai 2017 09:55

AW: StringToDate Problem
 
Das Problem würde nicht existieren, würde das sog. ISO-Datum (YYYY-MM-DD) verwendet. Das ist allerdings eine Norm aus dem letzten Jahrhundert.:evil:

Gruß
K-H

himitsu 7. Mai 2017 10:23

AW: StringToDate Problem
 
Aus dem letzten Jahrtausend, aber sie wird vermutlich auch noch die nächsten 7982 Jahre funktionieren, oder bis zur nächsten Zombieapokalypse.

sko1 7. Mai 2017 11:01

AW: StringToDate Problem
 
Wenn man die Textdatei selbst erstellt und diese dann selbst verarbeitet, kann man doch jedes x-beliebige Format nehmen?

FormatDateTime(meinDatum,'YYYYMMDD')

und dann entsprechend "auseinandernehmen', Zeichen 1-4=Datum, 5 und 6 = Monat, 7 und 8 = Tag

und sortieren kann man so ein Format auch wunderbar und dann ist egal welche internationalen Datumsformate da existieren und ggf. verändert werden.

Ciao
Stefan


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