Seite 1 von 1

time() in String konvertieren

Verfasst: Sa Jun 06, 2009 1:45 pm
von hackmack
Hi,

ich wollte die Aktuelle Uhrzeit (inlusive Datum) in einen String speichern und diesen dann testweise ausgeben. Die Form, in der das Datum im String gespeichert wird, sollte so aussehen:

Sun, 06 Nov 1994 08:49:37 GMT

Dazu jetzt mal der folgende Code:

Code: Alles auswählen

    string Date;
    time_t seconds;
    seconds = time(NULL);
    string weekday_values[] = {"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"};
    string month_values[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Ocr", "Nov", "Dec"};
    std::tm *datetimeinfo;
    datetimeinfo = std::localtime(&seconds);


    //Generate a String with the time in the format "Sat, 6 Jan 2009 08:24:56 GMT"
    Date += weekday_values[datetimeinfo->tm_wday];
    Date += " ";
    Date += datetimeinfo->tm_mday;
    Date += " ";
    Date += month_values[datetimeinfo->tm_mon];
    Date += " ";
    Date += (1990 + datetimeinfo->tm_year);
    Date != " ";
    Date += datetimeinfo->tm_hour;
    Date += ":";
    Date += datetimeinfo->tm_min;
    Date += ":";
    Date += datetimeinfo->tm_sec;
    Date += " GMT";

    cout << Date;
Der Code lässt sich soweit auch prima compilieren, bloß is die Ausgabe etwas kryptisch:

Sun ♠ Jun 3♫:▼:♣ GMT

Dies liegt meiner Vermutung nach an den Zeilen wie dieser hier "datetimeinfo->tm_sec" die ihre Werte als int übergeben, und somit das Zeichen mit dem entsprechenden Zahlenwert aus dem ASCII Zeichensatz genommen wird. Wie mach ich dies jetzt so, dass die Zahl richtig angezeigt und in den String geschrieben wird (am besten mit führenden Nullen)?

Eine Möglichkeit wäre die ganzen Zahlen in Array zu speichern, gibt es bessere?

Code: Alles auswählen

string Zahlen[] = {"01", "02", "03", ...};
Betriebsystem wäre Windows und Compiler GCC (bzw. MinGW).

Mfg.
hackmack

Re: time() in String konvertieren

Verfasst: Sa Jun 06, 2009 1:57 pm
von cloidnerux
In der Tat liegt das Problem beid er zuweisung eines Ints.
Du musst diesen in ein text konvertieren oder über den Array.
Eine führende 0 hilft dir nichts.
In der Standard Bibilothek stdio.h sind die Befehle atoi und itoa definiert.
atoi konvertiert einen Text zu einer Zahl,
ito eine Zahl zu einem Text.
Oder du bastelst dir selber eine Funktion zum umwandeln von Zalen nach Text, das ist nicht einmal so schwer.

Re: time() in String konvertieren

Verfasst: Sa Jun 06, 2009 2:08 pm
von hackmack
Da ich einen kleinen Webserver (erstmal nur zum schicken von Texten) programmieren will, sollte dies auch einigermaßen nach dem Standard sein, und dieser gibt halt nunmal die führende Null vor (für die Übertragung des Datum in den Header-Daten) :)

Re: time() in String konvertieren

Verfasst: Sa Jun 06, 2009 2:11 pm
von cloidnerux
Achso.
Dann kannst du doch einfach in ein Text konvertieren und eine "0" am anfang einfügen, aber halt nur wenns nötig ist.

Re: time() in String konvertieren

Verfasst: Sa Jun 06, 2009 2:15 pm
von hackmack
Ich schreib grad mal ne kleine Funktion, und werde sie posten, wenn sie fertig ist und funktioniert.

Re: time() in String konvertieren

Verfasst: Sa Jun 06, 2009 2:29 pm
von Kerli
hackmack hat geschrieben:ich wollte die Aktuelle Uhrzeit (inlusive Datum) in einen String speichern und diesen dann testweise ausgeben.
Warum nimmst du denn nicht strftime aus der Standardbibliothek?

Re: time() in String konvertieren

Verfasst: Sa Jun 06, 2009 2:50 pm
von hackmack
ah, danke, genau sowas habe ich gesucht

Re: time() in String konvertieren

Verfasst: So Jun 07, 2009 9:34 pm
von hackmack
habe trotzdem mal noch meine Konverterfunktion fertig geschrieben. Funktioniert auch soweit, nur für den Fall das sie jemand interessiert:

Code: Alles auswählen

string IntToString (int zahl)
{
    string data;
    int hoechst = floor(log10(zahl)); //Berechnet größten ganzen Exp. mit der 10 potenziert kann, um "zahl" zu erhalten
    int digit;
    for (int i=hoechst;i >= 0;i--)
    {
        digit = floor(zahl/(pow(10, i))); //Bestimmt die am linkesten stehende Ziffer
        data += char('0') + digit;
        zahl -= floor(pow(10,i)) * digit; //>Löscht< die am linkesten stehende Ziffer
    }
    return data;
};