Problem mit time_get-Facet



  • Hallo,

    ich habe ein Problem in Visual Studio 2003 (7.1). Daher denke ich gehört meine Frage eher hier hin. Wenn nicht, bitte ich um Entschuldigung und um Verschiebung.
    Ich will ein Datum einlesen, leider versagt die Facette. Wenn ich das Standard-Locale verwende, dann werden Monat und Tag beim einlesen verdreht und das Jahr wird nicht gelesen. Und wenn ich das Deutsche-Locale verwende, wird sogar nur noch der Tag eingelesen.

    Hier mal eine Beispielfunktion mit der ich dieses Problem gegenüber meinem echten Code nachvollziehen kann:

    typedef std::istreambuf_iterator<char, std::char_traits<char> > in_iter_type;
    
    void read(std::istream &stream, struct tm &time) {
      std::locale l;
      stream.imbue(l);
      std::time_get<char> const &tp = std::use_facet<std::time_get<char> >(l);
      std::ios::iostate state(0);
      in_iter_type begin(stream), end;
      tp.get_date(begin, end, stream, state, &tmTime); // Datumsformat: mm/dd/yy oder mm/dd/yyyy
    }
    
    // woanders; beispielhafter Aufruf:
    struct tm time;
    std::istringstream str("06/23/2005"); // oder "06/23/05"
    read(str, time);
    

    Das Schreiben mit der time_put-Facet funktioniert tadellos. Besonders dadurch konnte ich auch das Verhalten des verdrehten Monats und Tags feststellen. Enthält mein Stream beispielsweise "06/23/2005" (oder "05") erhalte ich bei der Ausgabe "00/06/1900".

    Kann jemand dieses Problem bestätigen und/oder weiß eine Lösung dazu (hab im Internet nichts gefunden)? Oder habe ich vielleicht einen Fehler im Code? Oder gibt es einen annehmbaren Workaround über eine Funktion oder so? Würde gerne vermeiden das Datum selbst zu parsen. Bevor antworten kommen, ich solle eine neuere VS-Version nutzen, diese Version ist in diesem Projekt vorgegeben (historisch und zeitlich bedingt ist eine Umstellung zur Zeit leider nicht möglich).

    Greetz


Anmelden zum Antworten