[C++] String in Datum konvertieren

Snape

Erfahrenes Mitglied
Tach,
da ich keine große Leuchte in C++ bin (und vermutlich niemals werde[n will]), scheitere ich oftmals schon an (vermeintlich?) einfachen Umsetzungen. :(

Wie konvertiere ich einen String in ein Datum? Ziel: (Datum-)Strings liegen vor und sollen sortiert werden.
Was ich bisher habe:

Code:
struct sortNachDatum
{
  int operator()(const sIndex &a, const sIndex &b)
    {
      TDateTime dateTimeA = StrToDateTime(a.Datum);
      TDateTime dateTimeB = StrToDateTime(b.Datum);
      return (dateTimeA < dateTimeB);
    }
};

Das meckert der Compiler an mit:
"Cannot convert 'const std::string' to 'AnsiString'"

Diese a.Datum und b.Datum kommen aus einem struct:
Code:
struct sIndex
{
  std::string Maschine;
  std::string Breite;
  std::string Status;
  std::string Datum;
};

Wie komme ich an ein TDateTime o.ä., um die Datumsstrings a la "01.01.2005" sortieren zu können? Oder gibt es eine andere Möglichkeit der Sortierung?
 
Du kannst auch den string mit string.Copy(startstelle,endstelle) in seine Bestandteile (entsprechend des Datums) auflösen und dem Datumsobjekt zuweisen.

Code:
  dateTimeA.Year = Jahr;


DarkGreetinx LordDeath
 
Hy,
klingt plausibel, aber da ich wie gesagt C++ Dummie bin und die C++ API *self-censored* ist, bin ich fast genauso weit wie vorher.

Code:
struct sort_Datum {
  int operator()(const sIndex &a, const sIndex &b)
    {
     String TagA = a.Datum.copy( 0, 1);
     String TagB = b.Datum.copy( 0, 1);
     TDateTime dateTimeA;
     TDateTime dateTimeB;
     dateTimeA.Day = TagA;
     dateTimeB.Day = TagB;
     return (dateTimeA < dateTimeB);
    }
};

"Day is not a member of TDateTime"
 
Soviel ich weiss, gibt es keine Standardfunktion um einen String in ein Datum (time_t oder dergleichen) zu wandeln.
Das musst du selbst schreiben. Es ist ja auch vom Format abhängig, in dem das Stringdatum vorliegt "12.5.2001" oder "MAY 15 2004" oder "16/3/2002" oder "3/16/2003" oder ...

Auf jeden Fall musst du den String zerlegen anhand des Formats, dass du dort hast.
z.B. so:
Code:
char pszDate = "12.4.2003";
int d, m, y;
int nCnt = sscanf(pszDate, "%d.%d.%d", &d, &m, &y);
if(nCnt != 3)
{
  // Datumsformat entspricht nicht dem erwarteten
}
Die Variablen d, m, und y enthalten danach den Tag, Monat und Jahr
Wenn das Format anders ist, muss der Format String eben entsprechend sein. Oder wenn die Uhrzeit mit drin ist.


Was ist überhaupt TDateTime für ein Datentyp. Ist das Borland?

Gruss
Dora
 
dorado hat gesagt.:
Soviel ich weiss, gibt es keine Standardfunktion um einen String in ein Datum (time_t oder dergleichen) zu wandeln.
Das musst du selbst schreiben. Es ist ja auch vom Format abhängig, in dem das Stringdatum vorliegt "12.5.2001" oder "MAY 15 2004" oder "16/3/2002" oder "3/16/2003" oder ...

Auf jeden Fall musst du den String zerlegen anhand des Formats, dass du dort hast.
z.B. so:
Code:
char pszDate = "12.4.2003";
int d, m, y;
int nCnt = sscanf(pszDate, "%d.%d.%d", &d, &m, &y);
if(nCnt != 3)
{
  // Datumsformat entspricht nicht dem erwarteten
}
Die Variablen d, m, und y enthalten danach den Tag, Monat und Jahr
Wenn das Format anders ist, muss der Format String eben entsprechend sein. Oder wenn die Uhrzeit mit drin ist.


Was ist überhaupt TDateTime für ein Datentyp. Ist das Borland?

Gruss
Dora

TDateTime ist wohl Borland, dazu bekomme ich die Hilfe angezeigt.
Die Datumstrings sehen alle gleich aus: dd.mm.yyyy
Ich kann nur mit der Fehlermeldung nichts anfangen:
"Cannot convert 'const std::string' to 'AnsiString'"
Und ich habe keine Ahnung, was dieses std::string ist bzw. wie ich das in irgendeiner Form per Substring oder sonstwie zerlegen kann. :(
 
Du kannst dir einen ANSI C string auf das Objekt holen

Code:
const char *pszDate = a.Datum.c_str();
int d, m, y;
int nCnt = sscanf(pszDate, "%d.%d.%d", &d, &m, &y);

Und auch sonst gibt es einige std::string Methoden zum Zerlegen des Strings.
Wenn du aber mit C-string Methoden arbeiten willst, musst du den string mit c_str() erst zu einem C-string Typ machen.
 
Die Lösung

RedWing hat gesagt.:

Danke für den Link, aber da verstehe ich nur Bahnhof. :rolleyes:
@dorado: Wie gesagt, ich kann kaum mit dem ganzen Zeigerkram umgehen, de facto verstehe ich die Verwendung von Zeigern immer noch nicht.

Einer unserer Azubis ist ein ganz fähiger Typ und konnte die Sache einfacher lösen, als ich durch die Anregungen befürchtet hatte:

Code:
struct sort_Datum {
  int operator()(const sIndex &a, const sIndex &b)
    {
      try {
        TDateTime Date1 = StrToDate(a.Datum.c_str());
        TDateTime Date2 = StrToDate(b.Datum.c_str());
      }
      catch (...) {
      }
      return Date1 < Date2;
    }
};

Danke trotzdem!
 
Zurück