AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

strftime für Delphi ?

Ein Thema von myicq · begonnen am 11. Jan 2019 · letzter Beitrag vom 12. Jan 2019
Antwort Antwort
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.029 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: strftime für Delphi ?

  Alt 12. Jan 2019, 09:45
Danke für das Antwort. Klar kenne ich die Formatcodes von Delphi.

In dieser Fall brauche ich aber die formatcodes von strftime() zu behandeln.

Ich kann das wenn notwendig selbst umsetzen. Aber hätte jemand das schon gemacht..
Wie wäre es denn, vor dem FormatDateTime durch StringReplace die Formatcodes umzuwandeln? So viele sind es ja nicht...
Michael Kübler
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#2

AW: strftime für Delphi ?

  Alt 12. Jan 2019, 10:32
Wie wäre es denn, vor dem FormatDateTime durch StringReplace die Formatcodes umzuwandeln? So viele sind es ja nicht...
Nicht so gut, wenn du dir diesen gültigen format-String anschaust
Code:
Aus %%Y wird %Y
rauskommen müsste durch strftime
Code:
Aus %Y wird 2019
Der passende Format-String für Delphi wäre
Code:
"Aus %Y wird "yyyy
Meine Einschätzung: Es ist einfacher den Formatstring so wie er ist zu parsen und direkt die Werte zu ersetzen als diesen erst umzuformen (da muss man auch parsen) und dann durch FormatDateTime zu jagen.

Geändert von Schokohase (12. Jan 2019 um 10:35 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.029 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: strftime für Delphi ?

  Alt 12. Jan 2019, 10:37
Wie wäre es denn, vor dem FormatDateTime durch StringReplace die Formatcodes umzuwandeln? So viele sind es ja nicht...
Nicht so gut, wenn du dir diesen gültigen format-String anschaust
Code:
Aus %%Y wird %Y
rauskommen müsste durch strftime
Code:
Aus %Y wird 2019
Der passende Format-String für Delphi wäre
Code:
"Aus %Y wird "yyyy
Meine Einschätzung: Es ist einfacher den Formatstring so wie er ist zu parsen und direkt die Werte zu ersetzen als diesen erst umzuformen (da muss man auch parsen) und dann durch FormatDateTime zu jagen.
Vielleicht verstehen ich das ganze auch gerade falsch. Aber wenn ich beispielsweise %Y mit StringReplace in YYYY umwandle dann kommt doch bei FormatDateTime 2019 als Beispiel raus.

EDIT: Klar, direkt parsen ist natürlich besser
Michael Kübler
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#4

AW: strftime für Delphi ?

  Alt 12. Jan 2019, 10:53
Wenn du bei
Code:
Aus %%Y wird %Y
alle %Y durch YYYY ersetzt, dann erhälst du
Code:
Aus %YYYY wird YYYY
Du brauchst aber für die korrekte Formatierung
Code:
"Aus %Y wird "YYYY
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.029 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: strftime für Delphi ?

  Alt 12. Jan 2019, 12:41
Wenn du bei
Code:
Aus %%Y wird %Y
alle %Y durch YYYY ersetzt, dann erhälst du
Code:
Aus %YYYY wird YYYY
Du brauchst aber für die korrekte Formatierung
Code:
"Aus %Y wird "YYYY
Ah, alles klar. Klingt irgendwie logisch
Michael Kübler
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#6

AW: strftime für Delphi ?

  Alt 12. Jan 2019, 13:48
Es ist auch relativ simpel so einen Parser zu basteln.

Hier ein Anfang
Delphi-Quellcode:
function strftime(const Format: string; Value: TDateTime; const FormatSettings: TFormatSettings): string; overload;
var
  controlChar: Boolean;
  current: Char;
begin
  Result := string.Empty;
  controlChar := false;
  for current in Format do
  begin
    if controlChar then
    begin
      case current of
        // ---
        // Tag
        // ---
        'd':
          // Tag des Monats als zweistellige Zahl (ggf. mit vorangestellten Nullen)
          // 01 bis 31
          Result := Result + FormatDateTime('dd', Value, FormatSettings);
        // -----
        // Monat
        // -----
        'm':
          // Zweistellige numerische Darstellung des Monats
          // 01 (für Januar) bis 12 (für Dezember)
          Result := Result + FormatDateTime('mm', Value, FormatSettings);
        // ----
        // Jahr
        // ----
        'Y':
          // Vierstellige numerische Darstellung des Jahres
          // Beispiel: 2038
          Result := Result + FormatDateTime('yyyy', Value, FormatSettings);
        // -------------
        // Verschiedenes
        // -------------
        'n':
          // Ein Zeilenvorschubzeichen ("\n")
          Result := Result + sLineBreak;
        't':
          // Ein Tabulatorzeichen ("\t")
          Result := Result + #9;
        '%':
          // Ein Tabulatorzeichen ("\t")
          Result := Result + '%';
      else
        Result := Result + '%' + current;
      end;
      controlChar := False;
    end
    else
    begin
      if current <> '%then
      begin
        Result := Result + current;
      end
      else
        controlChar := true;
    end;
  end;
  if controlChar then
    Result := Result + '%';
end;

function strftime(const Format: string; Value: TDateTime): string; overload;
begin
  Result := strftime(Format, Value, System.SysUtils.FormatSettings);
end;

function strftime(const Format: string): string; overload;
begin
  Result := strftime(Format, System.SysUtils.Now());
end;
Man braucht jetzt nur nach den Case-Teil um die anderen Zeichen ergänzen und fertig ist es.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:10 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