AGB  ·  Datenschutz  ·  Impressum  







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

VarToDateTime mit englischem Datum

Ein Thema von FunThomas · begonnen am 14. Jan 2012 · letzter Beitrag vom 15. Jan 2012
Antwort Antwort
FunThomas

Registriert seit: 15. Jul 2008
10 Beiträge
 
#1

VarToDateTime mit englischem Datum

  Alt 14. Jan 2012, 20:20
Hallo,

ich habe nen kleines Problem beim Einlesen eines Datums. Ich versuche ein Datum z.B '29 Dec 2011' auf einem deutschem System in einen TDateTime zu wandeln.
das klappt soweit ganz gut für Datumsangaben mit Monat Jan (ist im engl identisch) allerdings wenn ich folgendes Beispiel nehme schläg es schon fehl

Code:
var
  myDate : TDateTime;

  Datum  : string;
  neues_datumsformat : TFormatSettings;

begin
  GetLocaleFormatSettings(LOCALE_SYSTEM_DEFAULT, orginales_datumsformat);
  orginales_datumsformat.ShortDateFormat := 'dd mmm yyyy';
  orginales_datumsformat.LongDateFormat := 'dd mmm yyyy';
  orginales_datumsformat.DateSeparator := ' ';
  myDate := VarToDateTime('29 Dec 2011');
end;
Gibt es da irgendeine Möglichkeit dieses Datumsformat vernünftig einzulesen ?

Gruß,
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: VarToDateTime mit englischem Datum

  Alt 14. Jan 2012, 21:11
Du beschreibst doch schon die Ursache.

Du konvertierst immer noch mit den deutschen Monats-Abkürzungen (weil deutsches System).
Hol dir doch die englischen/amerikanischen FormatSettings und nicht die vom System.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von implementation
implementation

Registriert seit: 5. Mai 2008
940 Beiträge
 
FreePascal / Lazarus
 
#3

AW: VarToDateTime mit englischem Datum

  Alt 14. Jan 2012, 21:35
Zur Not mach's so:
Delphi-Quellcode:
function ConvertDate(const str: string): TDate;
var i: byte; d, m, y: word; mn: string;
const months: array[1..12] of string = ('jan','feb','mar','apr','may',
               'jun','jul','aug','sep','oct','nov','dec');
  procedure Next;
  begin
    Inc(i);
  end;
  function GetNum: word;
  begin
    Result := 0;
    while str[i] in ['0'..'9'] do begin
      Result := Result*10 + Ord(str[i]) - Ord('0');
      Next;
    end;
  end;
  procedure SkipWhite;
  begin
    while str[i] in [#9,#32] do Next;
  end;
  function GetName: string;
  begin
    Result := '';
    while str[i] in ['a'..'z','A'..'Z'] do begin
      if str[i] in ['a'..'z'] then
        Result := Result + str[i]
      else Result := Result + Chr(Ord(str[i])-Ord('A')+Ord('a'));
      Next;
   end;
  end;
begin
  i := 1;
  d := GetNum;
  SkipWhite;
  mn := GetName;
  SkipWhite;
  y := GetNum;
  for i := 1 to 12 do
    if months[i]=mn then
      m := i;
  if not TryEncodeDate(y,m,d,result) then
    raise EConvertError.Create('Invalid date');
end;

Geändert von implementation (14. Jan 2012 um 21:56 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.372 Beiträge
 
Delphi 12 Athens
 
#4

AW: VarToDateTime mit englischem Datum

  Alt 14. Jan 2012, 22:48
Wieso den Umweg über Delphi-Referenz durchsuchenVarToDateTime, oder hast du etwas gegen Delphi-Referenz durchsuchenStrToDateTime?

Du ließt die Systemwerte in orginales_datumsformat ein und veränderst diese Variable.
Gefunden hab ich aber nur die Deklaration für neues_datumsformat.

Außerdem setzt du nirgendwo die geänderten Werte, bzw. weißt sie nirgends zu, so daß sie verwendet werden könnten.

PS: StrToDateTime kann man die FormatSettings auch direkt mitgeben, ohne sie (programm)global ändern zu müssen.


@implementation: Man kann (zumindestens in Delphi funktioniert es ganz gut) auch vorhandene Funktionen nutzen und muß nicht unbedingt alles selber machen.
Man muß nur eben die richtigen Funktionen nutzen, bzw. den verwendeten Funktionen auch dir richtigen Einstellungen geben.

Also noch auf Sir Rufo hören oder zumindestens die FormatSettings selber befüllen.
(LOCALE_SYSTEM_DEFAULT = aktuelle Systemeinstellung, aber alternativ kann man nur was auslesen, welches auch installiert ist, also nicht unbedingt blind drauf verlassen, daß es andere Sprachen überhaupt gibt.)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (14. Jan 2012 um 22:57 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von implementation
implementation

Registriert seit: 5. Mai 2008
940 Beiträge
 
FreePascal / Lazarus
 
#5

AW: VarToDateTime mit englischem Datum

  Alt 14. Jan 2012, 23:26
@implementation: Man kann (zumindestens in Delphi funktioniert es ganz gut) auch vorhandene Funktionen nutzen und muß nicht unbedingt alles selber machen.
Kann man?

while not HinterDieOhrenGeschrieben do Writeln('Ich werde von nun an alles über die RTL machen.');

Ich benutz' normal nichtmal TList, hab 'ne eigene Alternative. So, und jetzt steinigt mich!

Geändert von implementation (14. Jan 2012 um 23:30 Uhr)
  Mit Zitat antworten Zitat
FunThomas

Registriert seit: 15. Jul 2008
10 Beiträge
 
#6

AW: VarToDateTime mit englischem Datum

  Alt 15. Jan 2012, 10:32
Hi Leute,
sorry dass ich nicht so ein Delphi-Crack bin wie Ihr
Ich probiere hier leider rum und kriege das leider nicht hin, der meckert jedesmal dass es kein gültiges Datum ist
Wenn ich z.B.
Code:
        GetLocaleFormatSettings(2057, orginales_datumsformat);
        orginales_datumsformat.ShortDateFormat := 'dd mmm yyyy';
        orginales_datumsformat.LongDateFormat := 'dd mmm yyyy';
        orginales_datumsformat.DateSeparator := ' ';
        myDate := StrToDateTime('29 Dec 2011',orginales_datumsformat);
funktioniert das ganze nicht obwohl die orginales_datumsformat.ShortMonthNames[12] = 'Dec' ist.
Falls einer nen Tip hat wieso dann würde ich mich darüber freuen.

kann mir eigentlich jemand sagen wo ich die Konstantennamen für LOCALE_SYSTEM_DEFAULT und die einzelnen Länder finde ? Die Hilfen zeigen mir nur den Typ aber die Konstanten sind leider nirgends aufgeführt. Ich habe jetzt nur bei Microsoft die LCID 2057 für en-UK gefunden, ist aber blöd eine Zahlenkonstante in seinem Progrämmchen zu verwenden.

Wenn ich jetzt über den Umweg
Code:
myDate := VarToDateTime('29 Dec 2011');
gehe passen meine lokalen Settings nicht -> mit welcher Funktion kann ich die auf z.B. en-UK ändern ?

Gruß,
Thomas
  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 06:45 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-2025 by Thomas Breitkreuz