String in Time konvertieren

kritza

Grünschnabel
Hallo Leute!

Eins vorne weg, bin Anfänger in C++!! Also nicht direkt meckern Ist wohl eher ein leichtes Problem...

Habe schon sowohl im Forum als auch mit google versucht herauszufinden, wie ich einen String in das time_t format konvertieren kann. Irgendwie habe ich dazu nix gefunden.. aber ich kann mir nicht vorstellen, dass es sowas simples nicht als Funktion gibt...

Also, ich arbeite mit Visual c++ und habe mir ein bissl was gebastelt. Jetzt wird in einem textfeld ein Datum im Format dd.mm.yyyy eingegeben, dieses möchte ich jetzt einer anderen funktion übergeben, die ein datum im format time_t erwartet.

Soweit ich das jetzt verstanden habe, ist dieses time_t format diese Sekunden Anzahl seit 1970. Ich vermute also, dass ich intern noch an das datum ne Zeit dranhängen muss.. das ist aber zu vernachlässigen für mich... würde da dann einfach 00:00 nehmen..

PS:
ich weiss, dass ein Textfeld nicht so die eleganteste lösung ist, ich könnte vllt auch ein Auswahlfeld nehmen, oder eine Kalenderfunktion, hatte ich auch vor... aber ich möchte halt erstmal klein anfangen und mit strings was rumspielen..

Danke schonma im voraus!
 
oO

Schnelle und gute Antwort!!

Kriegst ne 1 dafür... - keine 1+, weil ich das noch selber lesen musste und du mir nix gekocht hast ;)

ne... echt super! danke!

Also kann dann glaub ich schon wieder geschlossen werden ^^
 
ähm... da gibts wohl doch noch ein kleines problem...

error C3861: 'strptime': Bezeichner wurde auch mit einer argumentbezogenen Suche nicht gefunden

hab die time header hinzugefügt


aber würde das denn funktionieren?!


include "time.h"
[...]
struct tm tm;
time_t t;
t = mktime ( strptime( m_SDelivery, "%d %m %Y", &tm ) );

[...]

funktion(t);

?!
1. hab ich denn zumindest das prinzip verstanden?!
2. Wieso tut das nicht gehen tun, obwohl ich das wie wo im beispiel tat?!
 
Hi.
ähm... da gibts wohl doch noch ein kleines problem...

error C3861: 'strptime': Bezeichner wurde auch mit einer argumentbezogenen Suche nicht gefunden

hab die time header hinzugefügt


aber würde das denn funktionieren?!


include "time.h"
[...]
struct tm tm;
time_t t;
t = mktime ( strptime( m_SDelivery, "%d %m %Y", &tm ) );

[...]

funktion(t);

?!
1. hab ich denn zumindest das prinzip verstanden?!
2. Wieso tut das nicht gehen tun, obwohl ich das wie wo im beispiel tat?!
Zu 1) Ja, prinzipiell sollte es so funktionieren.

Zu 2) Hab gerade nochmal gesucht, und mußte festestellen, dass es die Funktion strptime in der Microsoft C Bibliothek nicht gibt. Die Funktion ist (noch) nicht Teil des C Standards, und Microsoft hat sich entschieden diese Funktion nicht zu implementieren.

Eine andere Funktion gibt es leider nicht. Du könntest versuchen die Struktur tm selbst zu befüllen um danach mit mktime die Sekunden seit der Epoche zu erhalten.

Gruß
 
hmm... versuche ja möglichst wenig dumme fragen zustellen, ABER!!, ich komm nicht weiter ^^:, jetzt kütt et!

Wie mach ich n dat?


Also... meine idee:

m_SDelivery = "11.10.1985";

// Diesen String will ich jetzt zerlegen in tag, monat, jahr und dann die einzelnen werte der tm structur zuzuweisen.. - ich hoffe ich hab dich richtig verstanden, weil wie gesagt... kein plan von c++ und ich programmier auch noch nicht so lange...

tag = strchr(m_SDelivery, ".");
// So dachte ich mir das... nur ich will ja nicht die position des punktes, sondern was davor steht...

tm.tm_mday = tag;
[...]

function ( mktime = (&tm) );


Also, hab ich das auch gedanklich schon mal richtig gemacht!?... und, mit welche funktion muss ich strchr ersetzten?
 
Kennt keiner eine funktion mit der ich die zeichen, vor einem gewissen zeichen kriege?

also beim datum, für einen tag die beiden werte vor dem ersten punkt?

oder noch besser, gibt es keine "elegantere" funktion dafür?


wäre wirklich dankbar für jede hilfe!!
 
Hallo,

wie wäre es denn mit sscanf?:

C:
char *datum="11.01.2007";
int day, month, year;

sscanf (datum, "%d.%d.%d", &day, &month, &year);

Gruß,
RedWing
 
Hi.

Du könntest sscanf dafür verwenden:
C++:
m_SDelivery = "11.10.1985";

if (sscanf(m_SDelivery, "%d.%d.%d", &tm.tm_mday, &tm.tm_mon, &tm.tm_year) == 3) {
  // Werte anpassen:
  tm.tm_mon -= 1;
  tm.tm_year -= 1900;

  ...
}
Gruß
 
Hallo!
Danke für die Antworten. War nicht auf der Arbeit, hab mich deswegen nicht mit dem Problem beschäftigt, sondern eher mit Geschenken.. :)

Also, ich habe die von euch vorgeschlagene Variante genommen:


Code:
  CString m_SDelivery;
  time_t    tDelivery;
  struct tm tm;

    memset ( &tm, 0,  sizeof( tm ) );
    if (sscanf(m_SDelivery, "%d.%d.%d", &tm.tm_mday, &tm.tm_mon, &tm.tm_year) == 3) 
    {  // Werte anpassen:  
      tm.tm_mon -= 1;  
      tm.tm_year -= 1900;   
    } 
    tDelivery = mktime ( &tm );

somit habe ich aus dem Format dd.mm.yyyy eine Unixzeit gemacht. (für leute die das vllt später noch interessiert.

Jetzt wird der ganze Quatsch noch in eine Datei gespeichert. Diese soll auch wieder ausgelesen werden können. Nur will ich dann aus dieser Unixzeit wieder den dd.mm.yyyy String machen. Da gibts nur ein Problem... ich bin wohl noch zu dumm :suspekt: ... HILFE

Code:
  CString   csDelivery;
  time_t    tDelivery;
  struct tm *date;

  //csDelivery = ctime( &tDelivery );                   //Konvertierung der Unix Zeit in Datums-String
  date = localtime( &tDelivery );                       //Konvertierung der Unix Zeit in tm-sruktur
  //date = gmtime( &tDelivery );                        //Konvertierung der Unix Zeit in tm-sruktur
  strftime( &csDelivery, 10, "%d.%m.%Y", date );        //Konvertierung der tm-struktur in einen formatierten Datums-String
  SetDlgItemText ( IDC_DELIVERY, csDelivery );

Wenn ich das versuche, bekomme ich die Fehlermeldung:

error C2664: 'strftime': Konvertierung des Parameters 1 von 'CString *__w64 ' in 'char *' nicht möglich
Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.


Hab, wie ihr seht, auch schon andere Funktionen ausprobiert... aber ich glaube ich brauche strftime, für mein datumsformat - also ctime() fällt schon mal weg...


Wie krieg ich denn das jetzt hin? Ist wahrscheinlich mal wieder voll das newbie problem, aber ist auch meine erste c++ Anwendung .
 
Zurück