Aus Datums-String integer machen



  • ich habe einen String im format MM/TT/JJJJ/hh:mm und hätte gern die Zahl dazu.
    Gibt es dafür eine Funktion ?

    Derzeit behelfe ich mir damit durchzuzählen und aus der Zahl den String zu bauen, und dann zu vergleichen, das ist aber etwas umständlich. Geht es eleganter ?
    Ohne den String jetzt umständlich auseinanderzubauen ?

    Wenn nicht dann auch gerne mit umständlich...



  • Du kannst einen std::stringstream nehmen und mit operator>> auslesen.

    std::stringstream Stream("12/31/2008");
    char Dummy;
    int Month, Day, Year;
    Stream >> Month >> Dummy >> Day >> Dummy >> Year;
    

    Dabei ist Dummy nur eine char -Variable, in die die Trennzeichen eingelesen werden. Es gibt noch x andere Möglichkeiten, du kannst dich z.B. mal auf www.cplusplus.com über die C++-Streams umsehen.

    Ach ja, eine Fehlerabfrage solltest du vielleicht auch noch einbauen...


  • Administrator

    Eine Erweiterung von der Version von Nexus und eine zweite Möglichkeit:

    #include <sstream> // Für die erste Möglichkeit
    #include <iostream>
    
    #include <cstdio> // für die zweite Möglichkeit
    
    // Hilfe für die erste Möglichkeit:
    
    template<char c>
    std::istream& checkChar(std::istream& input)
    {
        char read;
        input.get(read);
    
        if(input && c != read)
        {
            input.putback(read);
            input.setstate(std::ios::badbit);
        }
    
        return input;
    }
    
    int main()
    {
        char const* const dateString = "12/05/2004/23:22";
    
        int month, day, year, hours, minutes;
        std::istringstream iss(dateString);
    
        iss >> month >> checkChar<'/'>
            >> day >> checkChar<'/'>
            >> year >> checkChar<'/'>
            >> hours >> checkChar<':'>
            >> minutes;
    
        if(iss)
        {
            // Alles korrekt gelesen.
            std::cout << "w00t" << std::endl;
        }
    
        // Zweite Möglichkeit:
        int result = sscanf("12/05/2004/23:22", "%d/%d/%d/%d:%d",
                            &month, &day, &year, &hours, &minutes);
    
        if(5 == result)
        {
            // 5 Variablen korrekt ausgelesen, also alles richtig.
            std::cout << "w00t" << std::endl;
        }
    
        return 0;
    }
    

    Die Erweiterung der ersten Möglichkeit geht hier einfach auf Nummer sicher, dass auch entsprechende Trennzeichen vorhanden waren. Wenn dem nicht der Fall ist, wird der Stream in einen ungültigen Zustand gesetzt. Weitere Leseoperationen finden dadurch nicht statt, bzw. werden einfach übersprungen.

    Die zweite Möglichkeit ist die Verwendung der C Bibliothek in C++. Im allgemeinen sollte man sehr vorsichtig damit sein, aber hier wäre wohl durchaus ein Fall, wo man sich überlegen kann, ob man sich nicht ein wenig von der C Bibliothek helfen lassen soll.

    Grüssli



  • mktime



  • das trifft es leider alles nicht,
    ich wollte gern z.B. eine Funktion haben wie

    int getTimeFromString(char* zeit)

    die mir die Sekunden seit 1970 liefert, wobei es ein nettes Feature wäre das Format mit zu übergeben.



  • Dann stelle bitte nächstes Mal deine Frage auch entsprechend.

    Schau dich doch mal auf www.cplusplus.com unter <ctime> um, dort findest du einige Funktionen, die mit der Zeit zu tun haben. Mit denen kannst du bestimmt erreichen, was du möchtest.



  • Nexus schrieb:

    Dann stelle bitte nächstes Mal deine Frage auch entsprechend.

    Hat er doch:
    "ich habe einen String im format MM/TT/JJJJ/hh:mm und hätte gern die Zahl dazu."


Log in to reply