Ich versuche ein std::string
in ein boost::gregorian::date
wie folgt umzuwandeln:
Wenn die Zeichenfolge jedoch "01 Mär 2012" enthält, ist die Konvertierung erfolgreich.
Wie kann ich Strings wie "1. März 2012" in das äquivalente boost::gregorian::date
konvertieren?
Dies scheint ein Problem mit der Verwendung von %e
in Ihrer Eingabe-Facette zu sein.
Die Boost.Gregorian-Dokumentation gibt dies an :
% d Tag des Monats als Dezimalzahl 01 bis 31
% e # Wie% d, der Tag des Monats als Dezimalzahl, aber eine führende Null wird durch ein Leerzeichen ersetzt
Das Problem ist, dass Sie, wenn Sie sich den oberen Teil der Dokumentation ansehen, diese Warnung bemerken:
Die mit einem Rautenzeichen (#) markierten Flags werden vom Systemgebietsschema implementiert und sind auf einigen Plattformen bekannt.
Ich habe die folgenden Fälle ausprobiert:
%Vor% Es scheint also, dass dies eine Einschränkung der Boost-Implementierung ist (oder zumindest die Tatsache, dass es für das Parsen von %e
auf ein bestimmtes Gebietsschema angewiesen ist): Die Analyse schlägt fehl, wenn %e
das erste Element in ist Die Eingabezeichenfolge und ein Leerzeichen werden anstelle eines führenden 0
verwendet.
Meine (blinde) Vermutung wäre, dass das Problem von Stringstreams Tendenz zum Überspringen von Leerräumen herrührt. Ich habe versucht, eine Lösung mit dem std::noskipws
zu finden, konnte jedoch nichts finden, was funktionierte.
Als Workaround würde ich empfehlen, eine führende Null hinzuzufügen oder, falls möglich, ein anderes Datumsformat zu verwenden.
Eine andere Problemumgehung wäre, den Raum manuell hinzuzufügen und die Reihenfolge der "Wörter" in der Zeichenfolge umzukehren. Ich habe eine funktionierende Lösung wie folgt erreicht:
%Vor%Viel Glück,
Tags und Links c++ boost boost-date-time