Die Boost C++ Bibliotheken

Formatierte Ein- und Ausgabe

Wenn Sie die Beispiele in diesem Kapitel ausgeführt haben, haben Sie Ergebnisse wie 2014-May-12 erhalten. Möglicherweise ziehen Sie anders formatierte Ergebnisse vor. Boost.DateTime bietet mit boost::date_time::date_facet und boost::date_time::time_facet Klassen an, mit denen Sie Kalenderdaten und Zeitpunkte formatieren können.

Boost.DateTime greift auf das aus dem Standard bekannte Konzept der Locales zu. Um mit Boost.DateTime ein Kalenderdatum zu formatieren, müssen Sie ein Objekt vom Typ boost::date_time::date_facet erstellen und es in einem Locale installieren. Dem Konstruktor von boost::date_time::date_facet übergeben Sie einen String, der das neue Format beschreibt. Im Beispiel 36.20 ist %A, %d %B %Y angegeben, was bedeutet, dass der Wochentag gefolgt vom Datum mit ausgeschriebenem Monatsnamen ausgegeben wird: Monday, 12 May 2014.

Beispiel 36.20. Benutzerdefinierte Formatierung eines Datums
#include <boost/date_time/gregorian/gregorian.hpp>
#include <iostream>
#include <locale>

using namespace boost::gregorian;

int main()
{
  date d{2014, 5, 12};
  date_facet *df = new date_facet{"%A, %d %B %Y"};
  std::cout.imbue(std::locale{std::cout.getloc(), df});
  std::cout << d << '\n';
}

Boost.DateTime bietet zahlreiche Formatierungsflags an, die jeweils aus einem Prozentzeichen gefolgt von einem Buchstaben bestehen. Die Dokumentation von Boost.DateTime enthält eine vollständige Übersicht über alle unterstützten Formatierungsflags. So ist dort unter anderem angegeben, dass mit %A der Name des Wochentags ausgegeben wird.

Wenn Ihr Programm von Anwendern in Deutschland oder anderen deutschsprachigen Ländern verwendet wird, ziehen Sie es womöglich vor, wenn sowohl der Wochentag als auch der Monat in Deutsch ausgegeben wird.

Beispiel 36.21. Wochen- und Monatsnamen ändern
#include <boost/date_time/gregorian/gregorian.hpp>
#include <string>
#include <vector>
#include <locale>
#include <iostream>

using namespace boost::gregorian;

int main()
{
  std::locale::global(std::locale{"German"});
  std::string months[12]{"Januar", "Februar", "M\xe4rz", "April",
    "Mai", "Juni", "Juli", "August", "September", "Oktober",
    "November", "Dezember"};
  std::string weekdays[7]{"Sonntag", "Montag", "Dienstag",
    "Mittwoch", "Donnerstag", "Freitag", "Samstag"};
  date d{2014, 5, 12};
  date_facet *df = new date_facet{"%A, %d. %B %Y"};
  df->long_month_names(std::vector<std::string>{months, months + 12});
  df->long_weekday_names(std::vector<std::string>{weekdays,
    weekdays + 7});
  std::cout.imbue(std::locale{std::cout.getloc(), df});
  std::cout << d << '\n';
}

Sie können die Namen von Wochentagen und Monaten ändern, indem Sie Vektoren mit den entsprechenden Namen an die Methoden long_month_names() und long_weekday_names() der Klasse boost::date_time::date_facet übergeben. Beispiel 36.21 gibt daraufhin Montag, 12. Mai 2014 aus.

Anmerkung

Ersetzen Sie die Angabe German mit de_DE, wenn Sie das Beispiel auf einem POSIX-Betriebssystem ausführen möchten. Stellen Sie außerdem sicher, dass das Locale für den deutschen Sprach- und Kulturkreis installiert ist.

Boost.DateTime ist sehr flexibel, was die formatierte Datenein- und -ausgabe betrifft. So gibt es neben den beiden Klassen boost::date_time::date_facet und boost::date_time::time_facet zur Datenausgabe die Klassen boost::date_time::date_input_facet und boost::date_time::time_input_facet zur formatierten Dateneingabe. Alle vier Klassen bieten zahlreiche Methoden an, mit denen die Ein- und Ausgabe verschiedener Objekte aus Boost.DateTime konfiguriert werden kann. So ist es zum Beispiel auch möglich anzugeben, wie Zeitintervalle vom Typ boost::gregorian::date_period ein- und ausgegeben werden können. Aufgrund der vielfältigen Möglichkeiten zur formatierten Ein- und Ausgabe ist ein Blick in die Dokumentation von Bibliothek unerlässlich.