10.5. 格式化输入输出

本章中的所有例子在执行后都提供形如 2009-Jan-07 这样的输出结果。 有的人可能更喜欢用其它格式来显示结果。 Boost.DateTime 允许 boost::date_time::date_facetboost::date_time::time_facet 类来格式化历法日期和时间。

  1. #include <boost/date_time/gregorian/gregorian.hpp>
  2. #include <iostream>
  3. #include <locale>
  4.  
  5. int main()
  6. {
  7. boost::gregorian::date d(2009, 1, 7);
  8. boost::gregorian::date_facet *df = new boost::gregorian::date_facet("%A, %d %B %Y");
  9. std::cout.imbue(std::locale(std::cout.getloc(), df));
  10. std::cout << d << std::endl;
  11. }

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 表示星期几的全名。

如果应用程序的基本用户是位于德国或德语国家,最好可以用德语而不是英语来显示星期几和月份。

  1. #include <boost/date_time/gregorian/gregorian.hpp>
  2. #include <iostream>
  3. #include <locale>
  4. #include <string>
  5. #include <vector>
  6.  
  7. int main()
  8. {
  9. std::locale::global(std::locale("German"));
  10. std::string months[12] = { "Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember" };
  11. std::string weekdays[7] = { "Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag" };
  12. boost::gregorian::date d(2009, 1, 7);
  13. boost::gregorian::date_facet *df = new boost::gregorian::date_facet("%A, %d. %B %Y");
  14. df->long_month_names(std::vector<std::string>(months, months + 12));
  15. df->long_weekday_names(std::vector<std::string>(weekdays, weekdays + 7));
  16. std::cout.imbue(std::locale(std::cout.getloc(), df));
  17. std::cout << d << std::endl;
  18. }

星期几和月份的名字可以通过分别传入两个数组给 boost::date_time::date_facet 类的 long_month_names()long_weekday_names() 方法来修改,这两个数组分别包含了相应的名字。 以上例子现在将打印 Mittwoch, 07. Januar 2009 到标准输出流。

Boost.DateTime 在格式化输入输出方面是非常灵活的。 除了输出类 boost::date_time::date_facetboost::date_time::time_facet 以外,类 boost::date_time::date_input_facetboost::date_time::time_input_facet 可用于格式化输入。 所有这四个类都提供了许多方法,来为 Boost.DateTime 所提供的各种不同对象配置输入和输出的方式。 例如,可以指定 boost::gregorian::date_period 类型的时间长度如何输入和输出。 要弄清楚各种格式化输入输出的可能性,请参考 Boost.DateTime 的文档。