Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Datumskonvertierung (https://www.delphipraxis.net/94728-datumskonvertierung.html)

dose 26. Jun 2007 08:16


Datumskonvertierung
 
Hallo,
Ich verzeifel jetzt hier so langsam und wende mich vorher nochmal an euch:
Ich habe ein Datum in einem String im folgenden Format:
Zitat:

02-Jun-2008 01:59:00
11-Mar-2008 16:26:23
Jetzt müßte es doch eigentlich eine einfach Lösung geben, dieses Datum nach DateTime zu konvertieren, oder?
Gibt es sonst eine Routine, mit der ich mir ohne großen Aufwand dies nach DateTime wandeln kann, od. muß ich mit einer Monatsliste und diversen Copy-Funktionieren mir jedes Element raussuchen?

Danke
Gruß
dose

mkinzler 26. Jun 2007 08:21

Re: Datumskonvertierung
 
Nimm die überladene Version von StrToDateTime und übergebe das Format

Zitat:

Zitat von Delphi-Hilfe
Delphi-Quellcode:
function StrToDateTime(const S: string; var FormatSettings: TFormatSettings): TDateTime; overload;


dose 26. Jun 2007 08:54

Re: Datumskonvertierung
 
Hallo,
Irgendwie krieg ich's trotzdem nich hin. Es scheitert schon am Datum.
Irgendeinen Tip?


Delphi-Quellcode:
var
  formatSettings : TFormatSettings;

begin
  GetLocaleFormatSettings(1033, formatSettings);
//  ShowMessage (DateToStr(StrToDateTime('02-Jun-2008 01:59:00', formatSettings)));
    formatSettings.DateSeparator := '-';
    formatSettings.LongDateFormat := 'dd/mmm/yyyy';
   ShowMessage (DateToStr(StrToDateTime('02-Jun-2008', formatSettings)));
gruß
dose

mkinzler 26. Jun 2007 09:13

Re: Datumskonvertierung
 
Manuell zerlegen

Luckie 26. Jun 2007 09:18

Re: Datumskonvertierung
 
Irgendwie passen deine FormatSettings auch nicht zum Datum oder?
Delphi-Quellcode:
formatSettings.DateSeparator := '-';
formatSettings.LongDateFormat := 'dd/mmm/yyyy';
:gruebel:

dose 26. Jun 2007 09:28

Re: Datumskonvertierung
 
geht trotzdem nicht :-(

Luckie 26. Jun 2007 09:37

Re: Datumskonvertierung
 
Was für FormatSettings hast du denn jetzt genommen?

dose 26. Jun 2007 09:49

Re: Datumskonvertierung
 
Sowohl:
Delphi-Quellcode:
formatSettings.DateSeparator := '-';
formatSettings.LongDateFormat := 'dd-mmm-yyyy';
als auch

Delphi-Quellcode:
formatSettings.DateSeparator := '/';
formatSettings.LongDateFormat := 'dd/mmm/yyyy';
als auch

Delphi-Quellcode:
formatSettings.DateSeparator := '.';
formatSettings.LongDateFormat := 'dd.mm.yyyy';
(für nur 2 stelligen Monat)

marabu 27. Jun 2007 08:53

Re: Datumskonvertierung
 
Hallo,

auch wenn man für die Ausgabe eines Datums Monatsnamen verwenden kann, so ist doch der interne Parser bei der Umwandlung von Strings alleine auf Zahlenwerte ausgelegt - lediglich die Reihenfolge von DMY wird berücksichtigt.

Delphi-Quellcode:
function StrToDateTime(s: string; fs: TFormatSettings): TDateTime;
var
  i, m: Integer;
begin
  i := Pos('mmm', fs.ShortDateFormat);
  if i > 0 then
  begin
    m := {StrUtils.}AnsiIndexText(Copy(s, i, 3), ShortMonthNames);
    s := {StrUtils.}StuffString(s, i, 3, Format('%.2d', [m + Low(ShortMonthNames)]));
  end;
  Result := SysUtils.StrToDateTime(s, fs);
end;

procedure TDemoForm.ButtonClick(Sender: TObject);
var
  fs: TFormatSettings;
  s: string;
begin
  s := '02-Juni-2008 01:59:00';
  GetLocaleFormatSettings(GetUserDefaultLCID, fs);
  fs.DateSeparator := '-';
  fs.ShortDateFormat := 'dd/mmm/yyyy';
  ShowMessage(DateTimeToStr(StrToDateTime(s, fs), fs));
end;
Ist das Datumstrennzeichen ein Blank, dann ist vielleicht dieser Thread interessant: Datum-String in Datetime wandeln.

Grüße vom marabu

mschaefer 12. Jan 2017 20:41

TimeStr im Format 'hh:mm:ss' in DateTime
 
Hier könnte auch einer meiner Routinen noch hin passen. Habe Zeitangaben in
Editfeldern die vom String in ein DateTime Format gewandelt werden*sollen.

Delphi-Quellcode:
   // Wandelt einen TimeStr im Format 'hh:mm:ss' in ein DateTime von heute
   function TimeStrToDateTime(        InStr  : String ) : TDateTime;
   var I ,j    : integer;
       LInstr  : String;
       th,tm,ts : String;
       fs      : TFormatSettings;
   begin
      // Zahlenbereiche auf Ziffern prüfen //
      j := 1; th :=''; tm :=''; ts:='';
      for i := 1 to Length(InStr) do
      begin
            If ( ((ord(InStr[i]) >= 48) and (ord(InStr[i]) <= 57 )) ) then
            begin
            case j of
             1 : th:=th+InStr[i];
             2 : tm:=tm+InStr[i];
             3 : ts:=ts+InStr[i];
            end;
            end else
            begin
               if InStr[i] <> #32 then j := j +1;
            end;
      end;

      // Mit aktuellem Datum zusammenführen im Format: 14.10.2003, 10:26:05
      LInstr := copy( FormatDateTime('dd.mm.yyyy hh:nn:ss', now) ,1,11 )
              + th + ':'
              + tm + ':'
              + ts ;
      LInstr := trim(LInstr);

      // Datums Zeit format festlegen
      fs.DateSeparator  := '.';
      fs.TimeSeparator  := ':';
      fs.ShortDateFormat := 'dd.mm.yyyy hh:nn:ss';

      // String in DatumsZeitFormat wandeln
      try
         Result := StrToDateTime( LInstr, fs );
      except
         Result := StrToDateTime('01.01.2000 00:00:01', fs );
      end;
   end;

begin

  showmessage( DateTimeToStr( TimeStrToDateTime(  '15:30:10' )));

end;
Grüße // Martin

himitsu 12. Jan 2017 21:34

AW: TimeStr im Format 'hh:mm:ss' in DateTime
 
Warum ist im DateFormat ein Time-String drin?
Sei froh, dass Delphi beim Encodieren von Datums-/Zeitwerten so schrottig arbeitet, sonst hätte es dir diesen "kaputten" Datums-String um die Ohren geworfen.

Zitat:

Delphi-Quellcode:
If ( ((ord(InStr[i]) >= 48) and (ord(InStr[i]) <= 57 )) ) then

Wozu diese komische Obfuskation?
Delphi-Quellcode:
If (InStr[i] >= '0') and (InStr[i] <= '9') then

If CharInSet(InStr[i], ['0'..'9']) then //If InStr[i] in ['0'..'9'] then
Sinnlose Kommentare, ala
Delphi-Quellcode:
// Zahlenbereiche auf Ziffern prüfen
, könnte man sich dann auch sparen. :zwinker:


Zitat:

Delphi-Quellcode:
copy( FormatDateTime('dd.mm.yyyy hh:nn:ss', now) ,1,11 )

Ähhhhhhhhh?
Delphi-Quellcode:
FormatDateTime('dd.mm.yyyy ', now)
:roll:

Zitat:

Delphi-Quellcode:
except
  ... mach hier irgendwelchen sinnlosen Scheiß, der die eigentliche Fehlermeldung zerstört ...
end;

oder
Delphi-Quellcode:
except
end;
Für sowas sollten Leute gesteinigt werden.

Kurz gefasst macht deine Funktion ausschließlich das:
Delphi-Quellcode:
function TimeStrToDateTime(InStr: String): TDateTime;
var
  i: Integer;
  fs: TFormatSettings;
begin
  for i := Length(InStr) downto 1 do
    if not CharInSet(InStr[i], ['0'..'9']) then
      InStr[i] := ':';
  fs.TimeSeparator := ':';
  //fs.ShortTimeFormat := 'hh:nn:ss'; // das ist sowieso egal, da die Delphi-Date/Time-Decodierungsfunktionen die Formatstrings fahrlässig ignorieren
  // und nur die richtigen Separatoren, sowie TimeAMString und TimePMString beachten

  //try
    Result := DateOf(Now) + StrToTime(Instr, fs);
  //except
  //  Result := 666.000001; // ein unverständlicher krumer Wert ... warum nicht einfach 0?
  //end;
 end;
Delphi-Quellcode:
DateOf(Now)
= Delphi-Referenz durchsuchenDate, aber jeder nutzt lieber Now.

Und in Wirklichkeit wolltest du wohl nur sowas machen?
Delphi-Quellcode:
function TimeStrToDateTime(InStr: String): TDateTime;
var
  fs: TFormatSettings;
begin
  fs.TimeSeparator := ':';
  InStr := ReplaceString(InStr, ' ', ''); // inkl. Trim
  InStr := ReplaceString(InStr, '/', ':'); // ein anderer bekannter TimeSeparator
  InStr := ReplaceString(InStr, '-', ':'); // ...
  Result := DateOf(Now) + StrToTime(Instr, fs);
end;
Wer "Dreck" eingibt, also z.B. irgendwelche falsche Zeichen/Buchstaben, der hat gefälligst mit der passenden Fehlermeldung zu rechnen, wo ihm gesagt wird, dass er Mist gebaut hat.

a.def 12. Jan 2017 23:10

AW: Datumskonvertierung
 
Reicht nicht eigentlich auch einfach nur ...
Delphi-Quellcode:
StrToDateTime()
?


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