Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - StrToDate Ausgangsformat?? 02072008 => 02.07.2008


rob87 - Mi 02.07.08 13:40
Titel: StrToDate Ausgangsformat?? 02072008 => 02.07.2008
Hallo zusammen,

ich hab einen String der Art: '02072008'. Und ich will den String als Datum in einer DB abspeichern: 02.07.2008

Mach ich das nicht mit der Funktion StrToDate?? Braucht die unbedingt einen Separator. Denn bisher schreibt mir das System das nicht richtig rein???


g1o2k4 - Mi 02.07.08 13:44

also bei der uhrzeit gehts so:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var
  a: TDateTime;
  s: string;

  a := Time(); // Systemzeit auslesen.
  s := FormatDateTime('hh:nn:ss:zzz', a);


vermutlich ist das mit dem datum soetwas wie:

Delphi-Quelltext
1:
s := FormatDateTime('dd:mm:yy', a);                    


aber ich brauchte es bisher nie, deswegen keine garantie.


rob87 - Mi 02.07.08 13:45

user profile icong1o2k4 hat folgendes geschrieben:
also bei der uhrzeit gehts so:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var
  a: TDateTime;
  s: string;

  a := Time(); // Systemzeit auslesen.
  s := FormatDateTime('hh:nn:ss:zzz', a);


vermutlich ist das mit dem datum soetwas wie:

Delphi-Quelltext
1:
s := FormatDateTime('dd:mm:yy', a);                    


aber ich brauchte es bisher nie, deswegen keine garantie.


Stimmt. Die Funktion kenn ich auch. Des test ich gleich mal.


rob87 - Mi 02.07.08 14:00

Haut irgendwie no ned so hin. Steh glaub ich grad auf der Leitung.....


Bergmann89 - Mi 02.07.08 14:16

HI,

das Datum muss mit Punkte im String stehen, also "02.07.2008"
dann kannst du StrToDate aufrufen und dann is der String ein Datum.
Und damit kannst du dann arbeiten: z.B kannst du dann einfach einen
Tag dazu zählen oder sowas...
Wenn du jetzt aus deinem String ein Datum machen willst, dann musst
du dir da selbst ne Funktion schreiben. Bsp:


Delphi-Quelltext
1:
StringNeu := StrAlt[1]+StrAlt[2]+'.'+StrAlt[3]+StrAlt[4]+'.'+copy(StrAlt,5,4);                    


oder so irgendwie ^^

MfG Bergmann.


Miri - Mi 02.07.08 14:25

Was für ne DB ist's denn?
Unter Oracle könnte man z.B. sowas machen:

Quelltext
1:
TO_DATE('02072008','ddmmyyyy')                    


rob87 - Mi 02.07.08 14:29

user profile iconMiri hat folgendes geschrieben:
Was für ne DB ist's denn?
Unter Oracle könnte man z.B. sowas machen:

Quelltext
1:
TO_DATE('02072008','ddmmyyyy')                    


MS SQL Server. Aber so wie Bergmann89 es beschrieben hat funktionierts. ;-)


g1o2k4 - Mi 02.07.08 14:34

schau mal hier:
http://www.delphibasics.co.uk/RTL.asp?Name=FormatDateTime
(formatdatetime)
ich glaub das ist das was du suchst.

ansonsten hier:
http://www.delphibasics.co.uk/RTL.asp?Name=DateTimeToString

bzw hier:
http://www.delphibasics.co.uk/ByFunction.asp?Main=DatesAndTimes

da muss was dabei sein... ^^


rob87 - Mi 02.07.08 14:47

user profile icong1o2k4 hat folgendes geschrieben:
schau mal hier:
http://www.delphibasics.co.uk/RTL.asp?Name=FormatDateTime
(formatdatetime)
ich glaub das ist das was du suchst.

ansonsten hier:
http://www.delphibasics.co.uk/RTL.asp?Name=DateTimeToString

bzw hier:
http://www.delphibasics.co.uk/ByFunction.asp?Main=DatesAndTimes

da muss was dabei sein... ^^


Danke, aber so hats schon funktioniert. Mein String war ja ned zulang ;-)


baka0815 - Mi 27.08.08 15:32

Ich hab' ein ähnliches Problem.

Ich habe einen String, den ich nach einem bestimmten Muster in ein Datum umwandeln möchte. Das Muster ist nicht fix, kann also z.B. MM/DD/YYYY, DD.MM.YYYY oder DDMMYYYY sein.

Die ersten beiden funktionieren wunderbar wie folgt:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
function GetDatum(Datum, Format: string, Trenner: Char): TDateTime;
var
  FormatSettings: TFormatSettings;
begin
  FormatSettings.ShortDateFormat := Format;
  FormatSettings.LongDateFormat := Format;
  FormatSettings.DateSeparator := Trenner;

  Result := StrToDateTime(Datum, FormatSettings);
end;

[...]

GetDatum('10/30/2008''MM/DD/YYYY''/');
GetDatum('24.12.2007''DD.MM.YYYY''.');
GetDatum('24122007''DDMMYYYY'#0);


Nur das letzte Beispiel ohne Trenner schlägt fehl.

Gibt es irgendetwas, dass ich für den Trenner eingeben muss, damit es funktioniert? Gibt es eine andere Funktion, die damit klar kommt oder muss ich etwa selber einen Parser basteln?


baka0815 - Do 28.08.08 17:01

Sooo, 24 Stunden sind rum: *push*

Hat keiner 'ne Idee?


elundril - Do 28.08.08 17:05

probiers mal so:


Delphi-Quelltext
1:
GetDatum('24122007''DDMMYYYY''');                    


#0 ist nämlich schon ein zeichen aber du willst kein zeichen oder?

lg elundril


baka0815 - Do 28.08.08 17:19

Richtig, '' geht aber nicht, da das Feld ein Char ist und somit keinen Leerstring akzeptiert.


Sinspin - Do 28.08.08 18:17

Arbeite doch einfach mit einem beliebigen Trenner und entferne den danach via StringReplace.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
function GetDatum(Datum, Format: string, Trenner: Char): TDateTime;
var
  FormatSettings: TFormatSettings;
begin
  FormatSettings.ShortDateFormat := Format;
  FormatSettings.LongDateFormat := Format;
  FormatSettings.DateSeparator := Trenner;

  Result := StrToDateTime(Datum, FormatSettings);
  Result := StringReplace(result, Trenner, '', [rfReplaceAll]); // <-- trenner entfernen
end;


baka0815 - Fr 29.08.08 13:11

Ich habe hier eine universelle Schnittstelle, die Daten in verschiedenen Formaten einliest.
Beim einen Kunden ist's "DD.MM.YYYY", beim anderen "MM/DD/YYYY" und bei wieder anderen halt "MMDDYYYY".

Nun würde ich das Format gerne im Programm konfigurierbar halten und eine generische Methode zum Umwandeln verwenden. Wenn ich einen Trenner habe, funktioniert es ja auch ohne weiteres.

Wie gesagt, ich bekomme das Datum bereits in "DDMMYYYY" und möchte es nicht in dieses Format, sondern in ein TDateTime, umwandeln.

Trotzdem schon mal Danke für eure Ideen.


Yogu - Fr 29.08.08 13:20

Wie wär's denn damit:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
function GetDatum(Datum, Format: string, Trenner: Char): TDateTime;
var
  FormatSettings: TFormatSettings;
begin
  if (Trenner = #0and (Length(Datum) >= 4then
  begin
    Datum := Datum[1]+Datum[2] + '.' + Datum[3]+Datum[4] + '.' + Copy(Datum, 5, Length(Datum);
    Trenner := '.';
  end;

  FormatSettings.ShortDateFormat := Format;
  FormatSettings.LongDateFormat := Format;
  FormatSettings.DateSeparator := Trenner;

  Result := StrToDateTime(Datum, FormatSettings);
end;

Die Lösung stand doch schon oben im Thread, du musst einfach die Trenner nachträglich einfügen. ;)


baka0815 - Fr 29.08.08 13:25

Dann kann ich auch mit Encode-Date arbeiten.

Nur kann ich nicht entscheiden was "01022008" ist, ob "DDMMYYYY" oder "MMDDYYYY". Dann müsste ich (wie ich schon geschrieben habe) einen eigenen Parser für das Datum basteln, was ich nach Möglichkeit vermeiden möchte.

Dass ich den Format-String nach "D", "M" und "Y" parsen kann und dann das ganze "zu Fuß" programmieren kann, ist klar. Dachte nur, dass es in Delphi evtl. schon was dafür gibt (was ja auch stimmt, sofern man einen Trenner hat).


iKilledKenny - Fr 29.08.08 13:53

Auch ein Parser kann den Unterschied zwischen "DDMMYYYY" oder "MMDDYYYY" bei einem Datum von "01022008" nicht erkennen. Das geht nämlich gar nicht... Wenn du solch einen String bekommst, muss dir irgendjemand schon sagen, wie das zusammengebaut wurde.


baka0815 - Fr 29.08.08 16:34

Den Format-String (also "DDMMYYYY" bzw. "MMDDYYYY") habe ich ja und dazu auch das Datum als String.

Was ich nur eben (mit Delphi-Mitteln) nicht hin bekomme ist aus diesen zwei Strings ein TDateTime Objekt zu erzeugen.


Yogu - Fr 29.08.08 16:48

Du könntest beide Strings parallel durchgehen, aus dem Format-String holst du dir den Typ des Zeichens und aus dem Datums-String das Zeichen selber. Dann brauchst du noch drei Variablen für Tag, Monat und Jahr, in die du dann schreibst. Zeichen außer D, M und Y im Format-String werden einfach ignoriert.


baka0815 - Mo 01.09.08 09:24

Ja und dann sind wir wieder beim Parser.

Gut, dann werd' ich das wohl "zu Fuß" basteln müssen. Schade, ich hatte gehofft, so eine Funktion bereits in Delphi zu finden. Aber, dann ist das Thema hier (für mich) vorerst erledigt.

Danke euch!