10.5. 格式化输入输出
本章中的所有例子在执行后都提供形如 2009-Jan-07
这样的输出结果。 有的人可能更喜欢用其它格式来显示结果。 Boost.DateTime 允许 boost::date_time::date_facet
和 boost::date_time::time_facet
类来格式化历法日期和时间。
- #include <boost/date_time/gregorian/gregorian.hpp>
- #include <iostream>
- #include <locale>
- int main()
- {
- boost::gregorian::date d(2009, 1, 7);
- boost::gregorian::date_facet *df = new boost::gregorian::date_facet("%A, %d %B %Y");
- std::cout.imbue(std::locale(std::cout.getloc(), df));
- std::cout << d << std::endl;
- }
Boost.DateTime 使用了 locales 的概念,它来自于 C++ 标准,在 第 5 章 字符串处理 中有概括的介绍。 要格式化一个历法日期,必须创建一个 boost::date_time::date_facet
类型的对象并安装在一个 locale 内。 一个描述新格式的字符串被传递给 boost::date_time::date_facet
的构造函数。 上面的例子传递的是 %A, %d %B %Y
,指定格式为:星期几后跟日月年全名: Wednesday, 07 January 2009
。
Boost.DateTime 提供了多个格式化标志,标志由一个百分号后跟一个字符组成。 Boost.DateTime 的文档中对于所支持的所有标志有一个完整的介绍。 例如,%A 表示星期几的全名。
如果应用程序的基本用户是位于德国或德语国家,最好可以用德语而不是英语来显示星期几和月份。
- #include <boost/date_time/gregorian/gregorian.hpp>
- #include <iostream>
- #include <locale>
- #include <string>
- #include <vector>
- int main()
- {
- std::locale::global(std::locale("German"));
- std::string months[12] = { "Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember" };
- std::string weekdays[7] = { "Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag" };
- boost::gregorian::date d(2009, 1, 7);
- boost::gregorian::date_facet *df = new boost::gregorian::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 << std::endl;
- }
星期几和月份的名字可以通过分别传入两个数组给 boost::date_time::date_facet
类的 long_month_names()
和 long_weekday_names()
方法来修改,这两个数组分别包含了相应的名字。 以上例子现在将打印 Mittwoch, 07. Januar 2009
到标准输出流。
Boost.DateTime 在格式化输入输出方面是非常灵活的。 除了输出类 boost::date_time::date_facet
和 boost::date_time::time_facet
以外,类 boost::date_time::date_input_facet
和 boost::date_time::time_input_facet
可用于格式化输入。 所有这四个类都提供了许多方法,来为 Boost.DateTime 所提供的各种不同对象配置输入和输出的方式。 例如,可以指定 boost::gregorian::date_period
类型的时间长度如何输入和输出。 要弄清楚各种格式化输入输出的可能性,请参考 Boost.DateTime 的文档。