# [C++] String in Datum konvertieren



## Snape (24. November 2004)

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:


```
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:

```
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?


----------



## LordDeath (24. November 2004)

Du kannst auch den string mit string.Copy(startstelle,endstelle) in seine Bestandteile (entsprechend des Datums) auflösen und dem Datumsobjekt zuweisen.


```
dateTimeA.Year = Jahr;
```


DarkGreetinx LordDeath


----------



## Snape (24. November 2004)

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.


```
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"


----------



## dorado (24. November 2004)

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:

```
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


----------



## Snape (24. November 2004)

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.
> ...



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.


----------



## dorado (24. November 2004)

Du kannst dir einen ANSI C string auf das Objekt holen


```
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.


----------



## RedWing (24. November 2004)

Snape hat gesagt.:
			
		

> Und ich habe keine Ahnung, was dieses std::string ist bzw. wie ich das in irgendeiner Form per Substring oder sonstwie zerlegen kann.





			
				Dorado hat gesagt.:
			
		

> Und auch sonst gibt es einige std::string Methoden zum Zerlegen des Strings.



Link zur STL 
Speziell:


Link zu std::basic_string 

Gruß

RedWing


----------



## Snape (25. November 2004)

*Die Lösung*



			
				RedWing hat gesagt.:
			
		

> Link zur STL
> Speziell:
> Link zu std::basic_string
> 
> ...



Danke für den Link, aber da verstehe ich nur Bahnhof.   
@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:


```
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!


----------

