Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Datum anhand Format umwandeln (https://www.delphipraxis.net/174762-datum-anhand-format-umwandeln.html)

Hausmarke 8. Mai 2013 15:49

Datum anhand Format umwandeln
 
Hallo Liebe Gemeinde :)

ich habe das problem, das ich aus einer datei einen string auslese die ein Datum enthält, dazu ist auch jeweils das Format hinterlegt:
beispiel:
datum: 20130705
format: yyyymmdd

Wenn das Format immer gleich bleiben würde, könnte man das mit einer einfachen stringmanipulation handhaben.
Dem ist aber nicht so :lol: wäre ja auch langweilig.

Deshalb übergebe ich das hinterlegte Format und möchte nun anhand dessen, das datum einlesen und in einem anderen Format wieder ausgeben.

Wie könnte man dies umsetzen?

Mein ansatz ist folgender:
Delphi-Quellcode:
var datum : TDatetime;
content : string;
.
.
shortdateformat := yyyymmdd;
Datum := strtodate(content); <- hier kommt jetzt der fehler, das 20130705 kein Datum ist

DeddyH 8. Mai 2013 16:00

AW: Datum anhand Format umwandeln
 
AFAIK brauchst Du zwingend einen DateSeparator in Deinem String. Etwas umständlich, aber das hier klappt:
Delphi-Quellcode:
var
  Settings: TFormatSettings;
  d: TDate;
  s: string;
begin
  s := '20130705';
  Insert('/', s, 5);
  Insert('/', s, 8);
  Settings.ShortDateFormat := 'yyyy/mm/dd';
  Settings.DateSeparator := '/';
  d := StrToDate(s, Settings);
  ShowMessage(FormatDateTime('dd.mm.yyyy', d));
end;

Hausmarke 8. Mai 2013 16:14

AW: Datum anhand Format umwandeln
 
danke für die schnelle antwort.

leider löst das mein problem nicht ganz.
durch stringmanipulation einen separator einzufügen und dann umzuwandeln hatte ich schon durch gespielt.

Allerdings hatte ich mich nicht spezifisch dazu geäußert, dass das Format des eingelesenen Datums variieren kann.

beispiel:
datum: 20130705
format: yyyymmdd

und in einer anderen zeile/spalte steht dann
Datum: 130225
format: yymmdd

deshalb funktioniert die variante mit der Stringmanipulation hier nicht.
Im grunde könnte man jetzt diese beiden varianten statisch programmieren. Allerdings muss ich davon ausgehen, das sich das Format in einer anderen zeile/spalte ändert.
deshalb wäre meine idee:
man liest das datum in dem vorgegebenen Format ein, und gibt es dann im gewünschten format wieder aus.

ich schätze jetzt wirds noch umständlicher.

p80286 8. Mai 2013 16:14

AW: Datum anhand Format umwandeln
 
Zitat:

Zitat von Hausmarke (Beitrag 1214728)
Wenn das Format immer gleich bleiben würde, könnte man das mit einer einfachen stringmanipulation handhaben.
Dem ist aber nicht so :lol: wäre ja auch langweilig.

Ich denke umgekehrt wird ein Schuh daraus. Wenn das Datumsformat in der Datei mehrfach wechselt würde ich entsprechend der Formatangabe Jahr, Monat, Tag auslesen und dann einen gültigen Datumsstring zusammensetzen.
Dieser wird dan mit strtodate, trystrtodate oder was auch immer Du nutzen willst zu einem Datum gemacht.

Gruß
K-H

DeddyH 8. Mai 2013 16:31

AW: Datum anhand Format umwandeln
 
So hatte ich auch gedacht. Da das Format ja in dem Moment bekannt ist, muss man eben den String manipulieren und das ShortDateFormat entsprechend setzen. Etwas anderes fällt mir auch nicht ein.

p80286 8. Mai 2013 16:48

AW: Datum anhand Format umwandeln
 
Zitat:

Zitat von DeddyH (Beitrag 1214735)
... und das ShortDateFormat entsprechend setzen.

Warum? wenn ich den string schon in den Fingern habe, dann kann ich auch gleich das "richtige" Format basteln.
Jedes Mal das Datumsformat anpassen scheint mir zu aufwendig?

Gruß
k-H

DeddyH 8. Mai 2013 17:23

AW: Datum anhand Format umwandeln
 
Ob ich String-Manipulationen am Eingangsstring oder am FormatString vornehme, sollte sich im Aufwand nicht unterscheiden, oder?

Sir Rufo 8. Mai 2013 19:58

AW: Datum anhand Format umwandeln
 
Nur mal so als Hinweis: Einfach mal den Source zu Delphi-Referenz durchsuchenStrToDate anschauen und man spart sich jede Überlegung mit den FormatSettings irgendwelche exotischen Datums Formatierungen zu übergeben :mrgreen:

Hausmarke 14. Mai 2013 09:22

AW: Datum anhand Format umwandeln
 
leider habe ich nichts vordefiniertes gefunden was mein Problem lösen konnte.
Ich habe mir nun eine eigene kleine function gebastelt die mir das Ausgabeformat auseinander nimmt und das Datum dann dementsprechend zusammensetzt und umwandelt.

besten dank an alle Helfer

mkinzler 14. Mai 2013 09:45

AW: Datum anhand Format umwandeln
 
Zitat:

leider habe ich nichts vordefiniertes gefunden was mein Problem lösen konnte.
Zitat:

Zitat von Sir Rufo
Nur mal so als Hinweis: Einfach mal den Source zu Delphi-Referenz durchsuchenStrToDate anschauen und man spart sich jede Überlegung mit den FormatSettings irgendwelche exotischen Datums Formatierungen zu übergeben

Es gibt eine überladene Version von StrToDate mit dem zusätzlichen Parameter FormatSettings, in welchem man das Format übergeben kann.

Hausmarke 14. Mai 2013 10:00

AW: Datum anhand Format umwandeln
 
wenn ich das richtig verstehe kann ich bei der überladenen version das format mit angeben. Allerdings bezieht sich dies nur auf das Ausgabeformat.
Das problem liegt nicht in der Ausgabe der Daten, sondern im auslesen nach vorgegebenen Format.

korrigiert mich wenn ich das falsch interpretiert habe.


noch eine frage am rande:
wie bekomme ich eine 2 stellige jahreszahl bsp: 67 in eine 4 stellige jahreszahl bsp: 1967?

mkinzler 14. Mai 2013 10:05

AW: Datum anhand Format umwandeln
 
Das Zielformat ist immer ein Datetime. Das Format bezieht sich auf das Format im String (Input)

Hausmarke 14. Mai 2013 10:40

AW: Datum anhand Format umwandeln
 
wie muss ich die format variable deklarieren?
unten stehender quellcode bringt mir den fehler, das die eingelesene Zahl kein Datum ist.

Ich schätze das ich das format der falschen variable übergebe.

[DP]
var format : Tformatsettings;
begin
format.shortdateformat:=edit2.text;
edit3.text:= datetostr(strtodate(edit1.Text,format));
end;
[/DP]

baumina 14. Mai 2013 10:49

AW: Datum anhand Format umwandeln
 
Wie DeddyH schon erwähnte, geht Tformatsettings nicht ohne DateSeparator, deswegen ist das so für dich unbrauchbar.

Namenloser 14. Mai 2013 11:00

AW: Datum anhand Format umwandeln
 
Ungetestet und unoptimiert:
Delphi-Quellcode:
function MyStrToDate(Str, Format: String): TDate;
var
  Settings: TFormatSettings;
  i: integer;
const
  SEPARATOR = '/';
begin
  assert(length(Str) = length(Format));
  i := 2;
  while i <= length(Format) do
  begin
    if Format[i] <> Format[i-1] then
    begin
      Insert(SEPARATOR, Format, i);
      Insert(SEPARATOR, Str, i);
      inc(i);
    end;
    inc(i);
  end;
  Settings.ShortDateFormat := Format;
  Settings.DateSeparator := SEPARATOR;
  Result := StrToDate(Str, Settings);
end;

MyStrToDate('20130705', 'yyyymmdd');

Hausmarke 14. Mai 2013 11:37

AW: Datum anhand Format umwandeln
 
jepp, der fehlende separator macht mir den strich durch die rechnung.

in dem fall bleibe ich bei meiner function.


Danke für eure ideen und mühen :)


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