[Gelöst] Wie geht: "Datumsstring in TDatetime umwandeln"?

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
kirchfritz
Beiträge: 84
Registriert: Mo 3. Jan 2011, 13:34
OS, Lazarus, FPC: Win10 (L 2.0.2 FPC 3.2)
CPU-Target: 64Bit
Wohnort: Nürnberg

[Gelöst] Wie geht: "Datumsstring in TDatetime umwandeln"?

Beitrag von kirchfritz »

Hallo,

irgendwie stehe ich auf dem Schlauch. Mir gelingt es nicht eine Datumszeichenkette in ein TDateTime zu übersetzen.

Es geht um folgenden Ausdruck:

Code: Alles auswählen

  dt := ScanDateTime('dd mmm yyyy hh:nn:ss','14 May 2021 13:14:38');
Die Fehlermeldung ist alles andere als hilfreich:
Can't match any allowed value at pattern position 4, string position 4
Kann mir mal jemand auf die Sprünge helfen?

Fritz
Zuletzt geändert von kirchfritz am Sa 15. Mai 2021, 09:13, insgesamt 1-mal geändert.

Benutzeravatar
Winni
Beiträge: 796
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.0.12, fpc 3.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Wie geht: "Datumsstring in TDatetime umwandeln"?

Beitrag von Winni »

Hi!

Versuche es mal mit

Code: Alles auswählen

function StrToDateTime(const s: AnsiString; const FormatSettings : TFormatSettings): TDateTime;
In den Formatsettings kannst Du angeben, wie Dein Eingabe-String aussieht.

datih.inc als Teil von sysutils macht schlau.

Winni

Benutzeravatar
Winni
Beiträge: 796
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.0.12, fpc 3.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Wie geht: "Datumsstring in TDatetime umwandeln"?

Beitrag von Winni »

kirchfritz hat geschrieben:
Fr 14. Mai 2021, 16:51
Hallo,

irgendwie stehe ich auf dem Schlauch. Mir gelingt es nicht eine Datumszeichenkette in ein TDateTime zu übersetzen.

Es geht um folgenden Ausdruck:

Code: Alles auswählen

  dt := ScanDateTime('dd mmm yyyy hh:nn:ss','14 May 2021 13:14:38');
Die Fehlermeldung ist alles andere als hilfreich:
Can't match any allowed value at pattern position 4, string position 4
Kann mir mal jemand auf die Sprünge helfen?

Fritz
Hallo!

Geht bei mir problemlos! Wie ist das locale gesetzt? Steht das vielleicht auf am/pm Zeit? Weil der 4. Parameter ist ja nun die Uhrzeit!?

Winni

wp_xyz
Beiträge: 3746
Registriert: Fr 8. Apr 2011, 09:01

Re: Wie geht: "Datumsstring in TDatetime umwandeln"?

Beitrag von wp_xyz »

Vermutlich bist du auf den deutschen Formatsettings mit Monatsnamen Mai, statt May. Verwende eine Kopie deiner DefaultFormatsettings als letzten Parameter und übersetze vorher die Monatsnamen ins Englische:

Code: Alles auswählen

program Project1;
uses
  SysUtils, DateUtils;
var
  dt: TDateTime;
  fs: TFormatSettings;
begin
  fs := DefaultFormatSettings;
  fs.ShortMonthNames[1] := 'Jan';
  fs.ShortMonthNames[2] := 'Feb';
  fs.ShortMonthNames[3] := 'Mar';
  fs.ShortMonthNames[4] := 'Apr';
  fs.ShortMonthNames[5] := 'May';
  fs.ShortMonthNames[6] := 'Jun';
  fs.ShortMonthNames[7] := 'Jul';
  fs.ShortMonthNames[8] := 'Aug';
  fs.ShortMonthNames[9] := 'Sep';
  fs.ShortMonthNames[10] := 'Oct';
  fs.ShortMonthNames[11] := 'Nov';
  fs.ShortMonthNames[12] := 'Dec';

  dt := ScanDateTime('dd mmm yyyy hh:nn:ss','14 May 2021 13:14:38', fs);
  ReadLn;
end.

Benutzeravatar
Winni
Beiträge: 796
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.0.12, fpc 3.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Wie geht: "Datumsstring in TDatetime umwandeln"?

Beitrag von Winni »

Hi!

Auch ne gute Idee von wp_xyz.
Aus Erfahrung bin ich mir ziemlich sicher, dass da ein Konflikt mit den locale settings vorliegt.

Aber die Fehlerrmeldung 4 / 4 ist ja wohl Blödsinn.

Wenn man Null-basiert von hinten(!) zählt, dann ist man schon mal bei 4 für den Monat.
Aber ob nun Mai oder May - da kommt man nicht zur 4.

Wenn sie so einen Blödsinn melden, dann können sie die exception auch gleich weglassen .

Winni

wp_xyz
Beiträge: 3746
Registriert: Fr 8. Apr 2011, 09:01

Re: Wie geht: "Datumsstring in TDatetime umwandeln"?

Beitrag von wp_xyz »

Die erste 4 bezieht sich auf das 4. Zeichen im Pattern-String (String-Zählung beginnt bei 1, also auf das erste 'm'), die zweite 4 bezieht sich auf das 4. Zeichen im Datum-String (das 'M' von 'May').

Benutzeravatar
Winni
Beiträge: 796
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.0.12, fpc 3.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Wie geht: "Datumsstring in TDatetime umwandeln"?

Beitrag von Winni »

Hi!

Nachdem ich mir den Source angesehen hab, bin ich auch drauf gekommen.

Aber Fehlermeldungen sollten eigentlich kein Fall für die Enigma sein.

Winni

wp_xyz
Beiträge: 3746
Registriert: Fr 8. Apr 2011, 09:01

Re: Wie geht: "Datumsstring in TDatetime umwandeln"?

Beitrag von wp_xyz »

Winni hat geschrieben:
Fr 14. Mai 2021, 21:14
Aber Fehlermeldungen sollten eigentlich kein Fall für die Enigma sein.
Richtig. Aber nachdem ich das verstanden hatte, ist mir die Meldung eigentlich völlig klar, ich wüsste gar nicht, wie man sie anders schreiben könnte. Gut, man könnte sagen: "Teilstring 'May' passt nicht zum Pattern 'mmm'", aber ich vermute, dass es andere spezielle Pattern gibt, bei denen die Zuordnung nicht so eindeutig ist.

kirchfritz
Beiträge: 84
Registriert: Mo 3. Jan 2011, 13:34
OS, Lazarus, FPC: Win10 (L 2.0.2 FPC 3.2)
CPU-Target: 64Bit
Wohnort: Nürnberg

[Gelöst] Wie geht: "Datumsstring in TDatetime umwandeln"?

Beitrag von kirchfritz »

Danke für Eure Lösungsvorschläge.
Ich habe jetzt kapiert, wie ich mit ScanDateTime umgehen muss.

Ich habe den Lösungsvorschlag leicht abgewandelt, bin sehr zufrieden damit.

Code: Alles auswählen

program project1;
uses
  SysUtils, DateUtils;

const
  SDN : TWeekNameArray = ('Sun','Mon','Tue','Wen','Thu','Fri','Sat');
  SMN : TMonthNameArray = ('Jan','Feb','Mar','Apr','May','Jun',
                           'Jul','Aug','Sep','Oct','Nov','Dec');
var
  dt: TDateTime;
  fs: TFormatSettings;

begin
  fs := DefaultFormatSettings;
  fs.ShortMonthNames := SMN;
  fs.ShortDayNames   := SDN;

  dt := ScanDateTime('DDD"," dd mmm yyyy hh:nn:ss','Fri, 14 May 2021 13:14:38', fs);
  writeln(DateTimeToStr(dt));
  dt := ScanDateTime('DDD"+++"dd"$"mmm"§"yyyy"T"hh:nn:ss','Thu+++13$Oct§2071T13:14:38', fs);
  writeln(DateTimeToStr(dt));
  ReadLn;
end. 
Vielen Dank nochmal
Fritz

Antworten