Boost C++ 库

...世界上最受推崇和设计最精良的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu,《C++ 编码标准

日期时间输入/输出 - Boost C++ 函数库
PrevUpHomeNext

日期时间输入/输出

日期时间 IO 系统

流上的异常处理

从 1.33 版本开始,date_time 库使用了一个新的 IO 流系统。这个新系统为用户提供了对日期和时间表示方式的极大控制。自定义选项可以分为两类:格式标志和字符串元素。格式标志提供了日期元素顺序和类型的灵活性。自定义字符串元素允许替换内置的月份名称、星期几名称以及 IO 中使用的其他字符串。

输出系统基于 date_facet(派生自 std::facet),而输入系统基于 date_input_facet(也派生自 std::facet)。time 和 local_time 分面派生自这些基类型。输出系统使用三个格式化器对象,而输入系统使用四个解析器对象。这些格式化器和解析器对象也是可自定义的。

需要注意的是,虽然这里展示的所有示例都使用了窄流,但也提供了宽流分面(有关完整列表,请参阅 IO 对象)。

还应注意的是,并非所有编译器都能使用此 IO 系统。对于这些编译器,以前的 date_time 版本中使用的 IO 系统仍然可用。对于这些编译器,会“自动”选择“旧版 IO”,但是,可以通过定义 USE_DATE_TIME_PRE_1_33_FACET_IO 来手动选择旧版 IO 系统。有关更多信息,请参阅 构建-编译器信息

流上的异常处理

在输入流处理过程中发生错误时,流上的 std::ios_base::failbit 将(总是)被设置。当发生错误时,也可以抛出异常。要“打开”这些异常,请调用流的 exceptions 函数,并将参数设置为 std::ios_base::failbit

// "Turning on" exceptions
date d(not_a_date_time);
std::stringstream ss;
ss.exceptions(std::ios_base::failbit);
ss.str("204-Jan-01");
ss >> d; // throws bad_year exception AND sets failbit on stream
这个新系统的一个简单示例
//example to customize output to be "LongWeekday LongMonthname day, year"
//                                  "%A %b %d, %Y"
date d(2005,Jun,25);
date_facet* facet(new date_facet("%A %B %d, %Y"));
std::cout.imbue(std::locale(std::cout.getloc(), facet));
std::cout << d << std::endl;
// "Saturday June 25, 2005"

格式标志

这个新系统用于输出的许多格式标志是 strftime(...) 使用的标志,但并非全部。添加了一些新标志,另一些则被覆盖。输入系统仅支持特定标志,因此并非所有适用于输出的标志都适用于输入(我们目前正在努力纠正这种情况)。

以下表格列出了 date_time IO 和 strftime 可用的所有标志。用单星号(*)标记的格式标志具有 date_time 独有的行为。用感叹号(!)标记的标志(目前)不能用于输入。用井号(#)标记的标志由系统区域设置实现,并且已知在某些平台上缺失。第一个表是日期的,第二个表是时间的。

日期分面格式标志

格式说明符 描述
示例
%a
缩写星期名称
"Mon" => Monday
%A
完整星期名称
"Monday"
%b
缩写月份名称
"Feb" => February
%B
完整月份名称
"February"
%c !
当前区域设置首选的日期和时间表示方式。
%C !#
世纪数(年/100),显示为 2 位数字。
%d
月份,显示为 01 到 31 的十进制数字。用于解析输入时,前导零是可选的。
%D !#
等同于 %m/%d/%y
%e #
与 %d 类似,月份的十进制数字,但前导零被空格替换。用于解析输入时,前导空格是可选的。
%G !
具有与 %y 相同的格式和值,但如果 ISO 周数属于前一年或下一年,则使用该年份。
%g !
与 %G 类似,但不包含世纪。
%h !#
等同于 %b
%j
一年中的第几天,对于闰年是 001 到 366,对于非闰年是 001 - 365。
"060" => Feb-29
%m
月份名称,显示为 01 到 12 的十进制数字
"01" => January
%u !
星期几,显示为 1 到 7 的十进制数字,星期一为 1。
%U
本年度的周数,显示为 00 到 53 的十进制数字,以第一个星期日作为第 01 周的第一天。在 2005 年,1 月 1 日是星期六,因此属于 2005 年的第 00 周(第 00 周涵盖 2004 年 12 月 26 日至 2005 年 1 月 1 日。这也恰好是 2004 年的第 53 周)。
date d(2005, Jan, 1); // Saturday
// with format %U
ss << d; // "00"
d += day(1); // Sunday
ss << d; // "01" beginning of week 1
%V !#
本年度的 ISO 8601:1988 周数,显示为 01 到 53 的十进制数字,其中第 1 周是当前年份至少有 4 天的第一周,并且以星期一作为一周的第一天。
%w
星期几,显示为 0 到 6 的十进制数字
"0" => Sunday
%W
周数 00 到 53,星期一为第 1 周的第一天
date d(2005, Jan, 2); // Sunday
// with format %W
ss << d; // "00"
d += day(1); // Monday
ss << d; // "01" beginning of week 1
%x
区域设置定义的实现自定义日期格式。
date d(2005,Oct,31);
date_facet* f = new date_facet("%x");

locale loc = locale(locale("en_US"), f);
cout.imbue(loc);
cout << d; // "10/31/2005"

loc = locale(locale("de_DE"), f);
cout.imbue(loc);
cout << d; // "31.10.2005"
%y
两位数年份
"05" => 2005
%Y
四位数年份
"2005"
%Y-%b-%d
默认日期格式
"2005-Apr-01"
%Y%m%d
ISO 格式
"20050401"
%Y-%m-%d
ISO 扩展格式
"2005-04-01"

时间分面格式标志

格式说明符 描述
示例
%- *!
持续时间的符号占位符。仅当持续时间为负时显示。
"-13:15:16"
%+ *!
持续时间的符号占位符。始终显示正负号。
"+13:15:16"
%f
始终使用小数秒,即使其值为零
"13:15:16.000000"
%F *
仅当小数秒的值不为零时才使用。
"13:15:16"
"05:04:03.001234"
%H
小时,使用 24 小时制,显示为 00 到 23 的十进制数字。
 
%I !
小时,使用 12 小时制,显示为 01 到 12 的十进制数字。
 
%k !
小时(24 小时制),显示为 0 到 23 的十进制数字;个位数前面有一个空格。
 
%l !
小时(12 小时制),显示为 1 到 12 的十进制数字;个位数前面有一个空格。
 
%M
分钟,显示为 00 到 59 的十进制数字。
 
%O
时间持续的小时数,显示为 0 到最大可表示持续时间的十进制数字;个位数前面有一个零。
 
%p !
根据给定时间值,显示 'AM' 或 'PM',或者当前区域设置对应的字符串。
 
%P !#
与 %p 类似但为小写:'am' 或 'pm',或当前区域设置对应的字符串。
 
%r !#
上午/下午表示法的时间。在 POSIX 区域设置中,等同于 '%I:%M:%S %p'。
 
%R !
24 小时制的时间 (%H:%M)。
 
%s *
秒,包含小数秒。
"59.000000"
%S
仅秒。
"59"
%T !
24 小时制的时间 (%H:%M:%S)。
 
%q
ISO 时区(仅输出)。当使用 time_facet 处理 ptime 时,此标志将被忽略。
"-0700" // Mountain Standard Time
%Q
ISO 扩展时区(仅输出)。当使用 time_facet 处理 ptime 时,此标志将被忽略。
"-05:00" // Eastern Standard Time
%z *!
缩写时区(仅输出)。当使用 time_facet 处理 ptime 时,此标志将被忽略。
"MST" // Mountain Standard Time
%Z *!
完整时区名称(仅输出)。当使用 time_facet 处理 ptime 时,此标志将被忽略。
"EDT" // Eastern Daylight Time
%ZP *
POSIX 时区字符串(输入输出均可用)。当使用 time_facet 处理 ptime 时,此标志将被忽略。有关 POSIX 时区字符串的完整详细信息,请参阅 posix_time_zone 类
"EST-05EDT+01,M4.1.0/02:00,M10.5.0/02:00"
%x %X
区域设置定义的实现自定义日期/时间格式。
date d(2005,Oct,31);
ptime pt(d, hours(20));
time_facet* f = new time_facet("%x %X");

locale loc = locale(locale("en_US"), f);
cout.imbue(loc);
cout << pt; // "10/31/2005 08:00:00 PM"

loc = locale(locale("de_DE"), f);
cout.imbue(loc);
cout << pt; // "31.10.2005 20:00:00"
%Y%m%dT%H%M%S%F%q
ISO 格式
"20051015T131211-0700" // Oct 15, 2005 13:12:11 MST
%Y-%m-%d %H:%M:%S%F%Q
扩展 ISO 格式
"2005-10-15 13:12:11-07:00"
%Y-%b-%d %H:%M:%S%F %z
输出 ptime 和 local_date_time 时使用的默认格式。
"2005-Oct-15 13:12:11 MST"
%Y-%b-%d %H:%M:%S%F %ZP
输入 ptime 和 local_date_time 时使用的默认格式。
"2005-Oct-15 13:12:11 MST-07"
%-%H:%M:%S%F !
time_duration 的默认输出格式。符号仅对负持续时间显示。
"-13:14:15.003400"
%H:%M:%S%F
time_duration 的默认输入格式。
"13:14:15.003400"

* 表示具有 date_time 独有行为的标志。

# 表示具有平台相关行为的标志。这些标志并非在所有地方都受支持。

! 表示目前不适用于输入的标志。

下表列出了可用的分面。

IO 对象

* 这些链接指向 time_facettime_input_facet 参考部分。它们不是实际的类,而是类型别名。

格式化器/解析器对象

为了实现新的 i/o 分面,date-time 库使用了一些新的解析器和格式化器。这些类可供想要实现专门的输入/输出例程的用户使用。

日期分面

引言 - 构造 - 访问器

引言

boost::date_time::date_facet 使您能够对日期的输出流(以及其他格里高利对象)进行显著控制。date_facet 在 gregorian 命名空间中被定义为类型别名 date_facetwdate_facet

构造

语法 描述
date_facet()
默认构造函数
date_facet(...)
  Parameters:
    char_type* format
    input_collection_type
给定的格式将用于日期输出。所有其他格式将使用其默认值。Collection 是用于月份简称的名称集合。所有其他名称集合将使用其默认值。
date_facet(...)
  Parameters:
    char_type* format
    period_formatter_type
    special_values_formatter_type
    date_gen_formatter_type
给定的格式将用于日期输出。其余参数是格式化器对象。有关这些对象的详细信息,请在此处找到 此处。此构造函数还为除格式外的所有参数提供了默认参数。因此,date_facet("%m %d %Y") 是可行的。

访问器

语法 描述
示例
void format(char_type*)
设置日期的格式。
date_facet* f = new date_facet();
f->format("%m %d %Y");
void set_iso_format()
将日期格式设置为 ISO
f->set_iso_format();
// "%Y%m%d"
void set_iso_extended_format()
将日期格式设置为 ISO 扩展
f->set_iso_extended_format();
// "%Y-%m-%d"
void month_format(char_type*)
设置单独“输出”月份时的格式。
f->month_format("%B"); 
ss << greg_month(12); // "December"
void weekday_format(char_type*)
设置单独“输出”星期几时的格式。
f->weekday_format("%a");
ss << greg_weekday(2); // "Tue"
void period_formatter(...)
  Parameter:
    period_formatter_type
用用户创建的对象替换 period 格式化器对象。
有关完整示例,请参阅 教程
void special_values_formatter(...)
  Parameter:
    special_values_formatter_type
用用户创建的对象替换 special_values 格式化器对象。
有关完整示例,请参阅 教程
void date_gen_phrase_strings(...)
  Parameters:
    input_collection_type
    date_gen_formatter_type::
      phrase_elements
在 date_gen_formatter 中设置新的日期生成器短语字符串。输入集合是一个字符串向量(有关这些字符串的详细信息,请参阅 日期生成器格式化器/解析器文档)。phrase_elements 参数是一个枚举,定义在 date_generator_formatter 对象中,默认值为 'first'。它用于指示集合中第一个字符串的位置。
void short_weekday_names(...)
  Parameter:
    input_collection_type
替换“输出”星期几简称时使用的字符串。
有关完整示例,请参阅 教程
void long_weekday_names(...)
  Parameter:
    input_collection_type
替换“输出”星期几全称时使用的字符串。
有关完整示例,请参阅 教程
void short_month_names(...)
  Parameter:
    input_collection_type
替换“输出”月份简称时使用的字符串。
有关完整示例,请参阅 教程
void long_month_names(...)
  Parameter:
    input_collection_type
替换“输出”月份全称时使用的字符串。
有关完整示例,请参阅 教程
OutItrT put(...)
  Common parameters for all 
  'put' functions:
    OutItrT 
    ios_base
    char_type
  Unique parameter for 'put' funcs:
    gregorian object
date_facet 中有 12 个 put 函数。通用参数是:指向流中下一项的迭代器、一个 ios_base 对象以及填充字符。每个唯一的格里高利对象都有自己的 put 函数。每个唯一的 put 函数在下面进行描述。
OutItrT put(..., date)
使用 format(...) 设置的格式或默认格式将日期对象插入流。
OutItrT put(..., days)
将天数对象作为数字插入流。
OutItrT put(..., month)
使用 month_format(...) 设置的格式或默认格式将月份对象插入流。
OutItrT put(..., day)
将月份中的日期对象作为两位数插入流。
"01" // January 1st
OutItrT put(..., day_of_week)
使用 weekday_format(...) 设置的格式或默认格式将星期几对象插入流。
OutItrT put(..., date_period)
将 date_period 插入流。日期的格式将使用 format(..) 设置的格式或默认日期格式。期间的类型(开区间或闭区间)和使用的分隔符是 period_formatter 使用的。
OutItrT put(..., partial_date)
将 partial_date date_generator 对象插入流。月份格式使用 month_format(..) 设置的格式或默认格式。月份中的日期显示为两位数。
"01 Jan" // default formats
"01 January" // long month format
OutItrT put(..., date_generator)
  Date Generator Type:
    nth_day_of_the_week_in_month
将 nth_day_of_the_week_in_month 对象插入流。月份格式由 month_format(...) 设置或使用默认格式。星期几格式由 weekday_format(...) 设置或使用默认格式。其余的短语元素设置在 date_generator_formatter 中。
"third Fri in May" // defaults
OutItrT put(..., date_generator)
  Date Generator Type:
    first_day_of_the_week_in_month
将 first_day_of_the_week_in_month 对象插入流。月份格式由 month_format(...) 设置或使用默认格式。星期几格式由 weekday_format(...) 设置或使用默认格式。其余的短语元素设置在 date_generator_formatter 中。
"first Wed of Jun" // defaults
OutItrT put(..., date_generator)
  Date Generator Type:
    last_day_of_the_week_in_month
将 last_day_of_the_week_in_month 对象插入流。月份格式由 month_format(...) 设置或使用默认格式。星期几格式由 weekday_format(...) 设置或使用默认格式。其余的短语元素设置在 date_generator_formatter 中。
"last Tue of Mar" // defaults
OutItrT put(..., date_generator)
  Date Generator Type:
    first_day_of_the_week_after
将 first_day_of_the_week_after 对象插入流。星期几格式由 weekday_format(...) 设置或使用默认格式。其余的短语元素设置在 date_generator_formatter 中。
"first Sat after" // defaults
OutItrT put(..., date_generator)
  Date Generator Type:
    first_day_of_the_week_before
将 first_day_of_the_week_before 对象插入流。星期几格式由 weekday_format(...) 设置或使用默认格式。其余的短语元素设置在 date_generator_formatter 中。
"first Mon before" // defaults

日期输入分面

引言 - 构造 - 访问器

引言

boost::date_time::date_input_facet 使您能够对日期(以及其他格里高利对象)的输入流进行显著控制。date_input_facet 在 gregorian 命名空间中被定义为类型别名 date_input_facetwdate_input_facet

构造

语法 描述
date_input_facet()
默认构造函数
date_input_facet(string_type format)
给定的格式将用于日期输入。所有其他格式将使用其默认值。
date_input_facet(...)
  Parameters:
    string_type format
    format_date_parser_type
    special_values_parser_type
    period_parser_type
    date_gen_parser_type
给定的格式将用于日期输入。其余参数是解析器对象。有关这些对象的详细信息,请在此处找到 此处

访问器

语法 描述
示例
void format(char_type*)
设置日期的格式。
date_input_facet* f = 
    new date_input_facet();
f->format("%m %d %Y");
void set_iso_format()
将日期格式设置为 ISO
f->set_iso_format();
// "%Y%m%d"
void set_iso_extended_format()
将日期格式设置为 ISO 扩展
f->set_iso_extended_format();
// "%Y-%m-%d"
void month_format(char_type*)
设置单独“获取”月份时的格式。
f->month_format("%B");
ss.str("March");
ss >> m; // March
void weekday_format(char_type*)
设置“获取”星期几时的格式。
f->weekday_format("%a");
ss.str("Sun");
ss >> wd; // Sunday
void year_format(char_type*)
设置“获取”年份时的格式。
f->weekday_format("%y");
ss.str("04");
ss >> year; // 2004
void period_parser(...)
  Parameter:
    period_parser_type
用用户创建的对象替换 period 解析器对象。
有关完整示例,请参阅 教程
void special_values_parser(...)
  Parameter:
    special_values_parser_type
用用户创建的对象替换 special_values 解析器对象。
有关完整示例,请参阅 教程
void date_gen_phrase_strings(...)
  Parameters:
    input_collection_type
在 date_gen_parser 中设置新的日期生成器短语字符串。输入集合是一个字符串向量(有关这些字符串的详细信息,请参阅 日期生成器格式化器/解析器文档)。
void short_weekday_names(...)
  Parameter:
    input_collection_type
替换“获取”星期几简称时使用的字符串。
有关完整示例,请参阅 教程
void long_weekday_names(...)
  Parameter:
    input_collection_type
替换“获取”星期几全称时使用的字符串。
有关完整示例,请参阅 教程
void short_month_names(...)
  Parameter:
    input_collection_type
替换“获取”月份简称时使用的字符串。
有关完整示例,请参阅 教程
void long_month_names(...)
  Parameter:
    input_collection_type
替换“获取”月份全称时使用的字符串。
有关完整示例,请参阅 教程
InItrT get(...)
  Common parameters for all 
  'get' functions:
    InItrT from
    InItrT to
    ios_base
  Unique parameter for 'get' funcs:
    gregorian object
date_input_facet 中有 13 个 get 函数。通用参数是:指向流开头的迭代器、指向流末尾的迭代器,以及一个 ios_base 对象。每个唯一的格里高利对象都有自己的 get 函数。每个唯一的 get 函数在下面进行描述。
InItrT get(..., date)
使用 format(...) 设置的格式或默认格式从流中获取日期对象。
ss.str("2005-Jan-01");
ss >> d; // default format
InItrT get(..., month)
使用 month_format(...) 设置的格式或默认格式从流中获取月份对象。
ss.str("Feb");
ss >> m; // default format
InItrT get(..., day_of_week)
使用 weekday_format(...) 设置的格式或默认格式从流中获取星期几对象。
ss.str("Sun");
ss >> dow; // default format
InItrT get(..., day)
从流中获取月份中的日期对象,显示为两位数。
"01" // January 1st
InItrT get(..., year)
从流中获取年份对象,显示为数字。预期的位数取决于年份格式。
ss/str("2005");
ss >> y; // default format
InItrT get(..., days)
从流中获取天数对象,显示为数字。
ss.str("356");
ss >> dys; // a full year
InItrT get(..., date_period)
从流中获取 date_period。日期的格式将使用 format(..) 设置的格式或默认日期格式。期间的类型(开区间或闭区间)和使用的分隔符是 period_parser 使用的。
有关完整示例,请参阅 教程
InItrT get(..., partial_date)
从流中获取 partial_date date_generator 对象。月份格式使用 month_format(..) 设置的格式或默认格式。月份中的日期显示为两位数。
"01 Jan" // default formats
"01 January" // long month format
InItrT get(..., date_generator)
  Date Generator Type:
    nth_day_of_the_week_in_month
从流中获取 nth_day_of_the_week_in_month 对象。月份格式由 month_format(...) 设置或使用默认格式。星期几格式由 weekday_format(...) 设置或使用默认格式。其余的短语元素设置在 date_generator_parser 中。
"third Fri in May" // defaults
InItrT get(..., date_generator)
  Date Generator Type:
    first_day_of_the_week_in_month
从流中获取 first_day_of_the_week_in_month 对象。月份格式由 month_format(...) 设置或使用默认格式。星期几格式由 weekday_format(...) 设置或使用默认格式。其余的短语元素设置在 date_generator_parser 中。
"first Wed of Jun" // defaults
InItrT get(..., date_generator)
  Date Generator Type:
    last_day_of_the_week_in_month
从流中获取 last_day_of_the_week_in_month 对象。月份格式由 month_format(...) 设置或使用默认格式。星期几格式由 weekday_format(...) 设置或使用默认格式。其余的短语元素设置在 date_generator_parser 中。
"last Tue of Mar" // defaults
InItrT get(..., date_generator)
  Date Generator Type:
    first_day_of_the_week_after
从流中获取 first_day_of_the_week_after 对象。星期几格式由 weekday_format(...) 设置或使用默认格式。其余的短语元素设置在 date_generator_parser 中。
"first Sat after" // defaults
InItrT get(..., date_generator)
  Date Generator Type:
    first_day_of_the_week_before
从流中获取 first_day_of_the_week_before 对象。星期几格式由 weekday_format(...) 设置或使用默认格式。其余的短语元素设置在 date_generator_parser 中。
"first Mon before" // defaults

时间分面

引言 - 构造 - 访问器

引言

boost::date_time::time_facetboost::date_time::date_facet 的扩展。time_facet 在 posix_time 命名空间中被定义为类型别名 time_facetwtime_facet。在 local_time 命名空间中被定义为类型别名 local_time_facetwlocal_time_facet

构造

语法 描述
time_facet()
默认构造函数
time_facet(...)
  Parameters:
    char_type* format
    period_formatter_type
    special_values_formatter_type
    date_gen_formatter_type
给定的格式将用于时间输出。其余参数是格式化器对象。有关这些对象的详细信息,请在此处找到 此处。此构造函数还为除格式外的所有参数提供了默认参数。因此,time_facet("%H:%M:S %m %d %Y") 是可行的。

访问器

time_facet 继承了所有公共的 date_facet 方法。因此,此处不列出 date_facet 方法。而是可以通过点击 链接找到它们。

语法 描述
示例
void time_duration_format(...)
  Parameter:
    char_type*
设置 time_duration 格式。time_duration 格式能够显示持续时间的符号。'%+' 标志将始终显示符号。'-' 仅当符号为负时显示。目前 '-' 和 '+' 字符用于表示符号。
f->time_duration_format("%+%H:%M");
// hours and minutes only w/ sign always displayed
time_duration td1(3, 15, 56);
time_duration td2(-12, 25, 32);
ss << td1; // "+03:15:56"
ss << td2; // "-12:25:56"
            
void set_iso_format()
将日期和时间格式设置为 ISO。
f->set_iso_format();
// "%Y%m%dT%H%M%S%F%q"
void set_iso_extended_format()
将日期和时间格式设置为 ISO 扩展。
f->set_iso_extended_format();
// "%Y-%m-%d %H:%M:%S%F%Q"
OutItrT put(...)
  Common parameters for all 
  'put' functions:
    OutItrT 
    ios_base
    char_type
  Unique parameter for 'put' funcs:
    posix_time object
time_facet 中有 3 个 put 函数。通用参数是:指向流中下一项的迭代器、一个 ios_base 对象以及填充字符。每个唯一的 posix_time 对象都有其 put 函数。每个唯一的 put 函数在下面进行描述。
OutItrT put(..., ptime)
使用 format(...) 设置的格式或默认格式将 ptime 对象插入流。
OutItrT put(..., time_duration)
使用 time_duration_format(...) 设置的格式或默认格式将 time_duration 对象插入流。
OutItrT put(..., time_period)
将 time_period 插入流。日期和时间的格式将使用 format(..) 设置的格式或默认日期/时间格式。期间的类型(开区间或闭区间)和使用的分隔符是 period_formatter 使用的。

时间输入分面

引言 - 构造 - 访问器

引言

boost::date_time::time_input_facetdate_input_facet 的扩展。它在 boost::posix_time 命名空间中被定义为类型别名 time_input_facetwtime_input_facet。它在 boost::local_time 命名空间中被定义为类型别名 local_time_input_facetwlocal_time_input_facet

构造

语法 描述
time_input_facet()
默认构造函数
time_input_facet(string_type)
给定的格式将用于日期/时间输入。所有其他格式将使用其默认值。
time_input_facet(...)
  Parameters:
    string_type format
    format_date_parser_type
    special_values_parser_type
    period_parser_type
    date_gen_parser_type
给定的格式将用于日期/时间输入。其余参数是解析器对象。有关这些对象的详细信息,请在此处找到 此处

访问器

time_input_facet 继承了所有公共的 date_input_facet 方法。因此,此处不列出 date_input_facet 方法。而是可以通过点击 链接找到它们。

语法 描述
示例
void set_iso_format()
将时间格式设置为 ISO
f->set_iso_format();
// "%Y%m%dT%H%M%S%F%q"
"20051225T132536.789-0700"
void set_iso_extended_format()
将日期格式设置为 ISO 扩展
f->set_iso_extended_format();
// "%Y-%m-%d %H:%M:%S%F %Q"
"2005-12-25 13:25:36.789 -07:00"
void time_duration_format(...)
  Parameter:
    char_type*
设置 time_duration 格式。
f->time_duration_format("%H:%M");
// hours and minutes only
InItrT get(...)
  Common parameters for all 
  'get' functions:
    InItrT from
    InItrT to
    ios_base
  Unique parameter for 'get' funcs:
    gregorian object
time_input_facet 中有 3 个 get 函数。通用参数是:指向流开头的迭代器、指向流末尾的迭代器,以及一个 ios_base 对象。每个唯一的格里高利对象都有其 get 函数。每个唯一的 get 函数在下面进行描述。
InItrT get(..., ptime)
使用 format(...) 设置的格式或默认格式从流中获取 ptime 对象。
ss.str("2005-Jan-01 13:12:01");
ss >> pt; // default format
InItrT get(..., time_duration)
使用 time_duration_format(...) 设置的格式或默认格式从流中获取 time_duration 对象。
ss.str("01:25:15.000123000");
ss >> td; // default format
InItrT get(..., time_period)
从流中获取 time_period。日期/时间的格式将使用 format(..) 设置的格式或默认日期和时间格式。期间的类型(开区间或闭区间)和使用的分隔符是 period_parser 使用的。
有关完整示例,请参阅 教程

日期时间格式化器/解析器对象

日期时间格式化器/解析器对象

期间 | 日期生成器 | 特殊值 | 格式日期解析器

期间

period_formatter 和 period_parser 为 date_periods、time_periods 和(在未来版本中)local_date_time_periods 的输入和输出提供了一个统一的接口。用户可以控制分隔符、日期/时间组件的格式以及期间的形式。日期/时间组件的格式通过日期时间输入和输出分面进行控制。

期间形式

期间以开区间参数构造。第一个值是起始点,包含在期间内。结束值不包含,但紧跟在最后一个值之后:[begin/end)。但是,期间可以作为开区间或闭区间流式传输。

[2003-Jan-01/2003-Dec-31] <-- period holding 365 days
[2003-Jan-01/2004-Jan-01) <-- period holding 365 days
分隔符

有四个分隔符。默认值是

"\" - 分隔符
"[" - 起始分隔符
")" - 开区间结束分隔符
"]" - 闭区间结束分隔符

用户可以提供自定义分隔符集。自定义分隔符可以包含空格。

自定义

期间形式和分隔符可以作为构造参数设置,或通过访问器函数设置。然后,自定义期间解析器/格式化器可以用作新分面的构造参数,或者通过访问器函数在现有分面中设置。

期间格式化器/解析器参考
完整的类参考可以在此处找到:Period Formatter Doxygen Reference 和此处:Period Parser Doxygen Reference

期间格式化器构造

语法 描述
period_formatter(...)
  Parameters:
    range_display_options
    char_type*
    char_type*
    char_type*
    char_type*
注意:所有五个构造参数都有默认值,因此此构造函数也兼作默认构造函数。range_display_optionsperiod_formatter 类的一个公共类型枚举。可能的选择是 AS_OPEN_RANGE 或 AS_CLOSED_RANGE。闭区间是默认值。期间有三个重要点:开始、最后和结束。闭区间形式为 [begin,end),而开区间形式为 [begin,last)。四个 char_type* 参数是:期间分隔符、起始分隔符、开区间结束分隔符和闭区间结束分隔符。

期间格式化器访问器

语法 描述
示例
range_display_options range_option()
返回范围显示的当前设置(AS_OPEN_RANGE 或 AS_CLOSED_RANGE)。
void range_option(...)
  Parameter:
    range_display_options
设置范围显示的选项(AS_OPEN_RANGE 或 AS_CLOSED_RANGE)。
void delimiter_strings(...)
  Parameters:
    string_type
    string_type
    string_type
    string_type
在格式化器中设置新的分隔符字符串。
string beg("->| ");
string sep(" || ");
string opn(" ->|");
string clo(" |<-");
pf.delimiter_strings(beg, sep, 
                     opn, clo);
put_period_start_delimeter(...)
  Return Type:
    OutItrT
  Parameter:
    OutItrT
将起始分隔符放入由 OutItrT 参数指向的位置的流中。
put_period_sepatator(...)
  Return Type:
    OutItrT
  Parameter:
    OutItrT
将分隔符放入由 OutItrT 参数指向的位置的流中。
put_period_end_delimeter(...)
  Return Type:
    OutItrT
  Parameter:
    OutItrT
将结束分隔符放入由 OutItrT 参数指向的位置的流中。
OutItrT put_period(...)
  Parameters:
    OutItrT
    ios_base
    char_type
    period_type
    facet_type
使用为分隔符、分隔符和范围显示设置的值将期间放入流。facet 参数用于放入期间的日期(或时间)对象。

期间解析器构造

语法 描述
period_parser(...)
  Parameters:
    period_range_option
    char_type*
    char_type*
    char_type*
    char_type*
注意:所有五个构造参数都有默认值,因此此构造函数也兼作默认构造函数。period_range_optionperiod_parser 类的一个公共类型枚举。可能的选择是 AS_OPEN_RANGE 或 AS_CLOSED_RANGE。闭区间是默认值。期间有三个重要点:开始、最后和结束。闭区间形式为 [begin,end),而开区间形式为 [begin,last)。四个 char_type* 参数是:期间分隔符、起始分隔符、开区间结束分隔符和闭区间结束分隔符。
period_parser(period_parser)
复制构造函数

期间解析器访问器

语法 描述
示例
period_range_option range_option()
返回期间范围的当前设置(AS_OPEN_RANGE 或 AS_CLOSED_RANGE)。
void range_option(...)
  Parameter:
    period_range_option 
设置期间范围的选项(AS_OPEN_RANGE 或 AS_CLOSED_RANGE)。
void delimiter_strings(...)
  Parameters:
    string_type
    string_type
    string_type
    string_type
在解析器中设置新的分隔符字符串。
string beg("->| ");
string sep(" || ");
string opn(" ->|");
string clo(" |<-");
pp.delimiter_strings(beg, sep, 
                     opn, clo);
collection_type delimiter_strings()
返回解析器当前持有的分隔符字符串集。
period_type get_period(...)
  Parameters:
    stream_itr_type
    stream_itr_type
    ios_base
    period_type
    duration_type
    facet_type
从流中解析期间。迭代器参数指向流的开头和结尾。duration_type 与期间类型相关,例如:date_period 将使用 days 作为 duration_type。期间将根据 facet 参数中的格式和字符串进行解析。

_____________________________________________________

日期生成器

date_generator 格式化器和解析器通过允许用户使用自定义“短语元素”来提供灵活性。这些短语元素是 date_generators 中的“中间”词。例如,在 date_generator "March 的第二个星期一" 中,“第二个”和“的”是短语元素,而“星期一”和“March”是日期元素。日期元素的自定义通过 facet 完成。日期元素和短语元素的顺序不能改变。解析时,date_generator 短语的所有元素必须正确解析,否则将抛出 ios_base::failure 异常。

自定义

默认的“phrase_strings”是

"first" "second" "third" "fourth" "fifth" "last" "before" "after" "of"

自定义的 phrase_strings 必须保持此出现顺序(例如:“1st”、“2nd”、“3rd”、“4th”、“5th”、“last”、“prior”、“past”、“in”)。

使用默认短语字符串和默认的星期几/月份格式化分面格式的示例

"first Tue of Mar"

并使用自定义短语字符串

"1st Tue in Mar"

自定义的短语元素集可以作为构造参数设置,或通过访问器函数设置。自定义的 date_generator 解析器/格式化器然后可以用作新分面的构造参数,或通过访问器函数在现有分面中设置。

重要提示:在 1.33 版本之前,partial_date 的输出为“1 Jan”,日期为一位或两位数字。新行为是*始终*使用两位数字表示日期 - “01 Jan”。

日期生成器参考
完整的类参考可以在此处找到:Date Generator Formatter Doxygen Reference 和此处:Date Generator Parser Doxygen Reference

日期生成器格式化器构造

语法 描述
date_generator_formatter()
使用默认的日期生成器元素。
date_generator_formatter(...)
  Parameters:
    string_type first_element
    string_type second_element
    string_type third_element
    string_type fourth_element
    string_type fifth_element
    string_type last_element
    string_type before_element
    string_type after_element
    string_type of_element
使用给定的元素字符串构造一个 date_generator_formatter。

日期生成器格式化器访问器

语法 描述
示例
void elements(...)
  Parameters:
    collection_type
    phrase_elements
用一组新的元素替换当前的短语元素。phrase_elements 参数是一个枚举,指示新集合中第一个元素的类型(默认为 first)。
// col is a collection holding 
// "final", "prior", "following",
// and "in"
typedef date_generator_formatter dgf;                                  
dgf formatter();
formatter.elements(col, dgf::last);
// complete elements in dgf are now: 
"first", "second", "third", 
"fourth", "fifth", "final", 
"prior", "following", and "in"
put_partial_date(...)
  Return Type:
    facet_type::OutItrT
  Parameters:
    OutItrT next
    ios_base
    char_type fill
    partial_date
    facet_type
一个用于 partial_date 的 put 函数。这是一个模板函数,以 facet_type 作为参数。
输出 partial_date => "dd Month"。
put_nth_kday(...)
  Return Type:
    facet_type::OutItrT
  Parameters:
    OutItrT next
    ios_base
    char_type fill
    nth_kday_type
    facet_type
一个用于 nth_kday_type 的 put 函数。这是一个模板函数,以 facet_type 作为参数。
输出 nth_day_of_the_week_in_month => "nth weekday of month"。
put_first_kday(...)
  Return Type:
    facet_type::OutItrT
  Parameters:
    OutItrT next
    ios_base
    char_type fill
    first_kday_type
    facet_type
一个用于 first_kday_type 的 put 函数。这是一个模板函数,以 facet_type 作为参数。
输出 first_day_of_the_week_in_month => "first weekday of month"。
put_last_kday(...)
  Return Type:
    facet_type::OutItrT
  Parameters:
    OutItrT next
    ios_base
    char_type fill
    last_kday_type
    facet_type
一个用于 last_kday_type 的 put 函数。这是一个模板函数,以 facet_type 作为参数。
输出 last_day_of_the_week_in_month => "last weekday of month"。
put_kday_before(...)
  Return Type:
    facet_type::OutItrT
  Parameters:
    OutItrT next
    ios_base
    char_type fill
    kday_before_type
    facet_type
一个用于 kday_before_type 的 put 函数。这是一个模板函数,以 facet_type 作为参数。
输出 first_day_of_the_week_before => "weekday before"。
put_kday_after(...)
  Return Type:
    facet_type::OutItrT
  Parameters:
    OutItrT next
    ios_base
    char_type fill
    kday_after_type
    facet_type
一个用于 kday_after_type 的 put 函数。这是一个模板函数,以 facet_type 作为参数。
输出 first_day_of_the_week_after => "weekday after"。

日期生成器解析器构造

语法 描述
date_generator_parser()
使用默认的日期生成器元素。
date_generator_parser(...)
  Parameter:
    date_generator_parser
复制构造函数
date_generator_parser(...)
  Parameters:
    string_type first_element
    string_type second_element
    string_type third_element
    string_type fourth_element
    string_type fifth_element
    string_type last_element
    string_type before_element
    string_type after_element
    string_type of_element
使用给定的元素字符串构造一个 date_generator_parser。

日期生成器解析器访问器

语法 描述
示例
void element_strings(...)
  Parameter:
    collection_type
用一组新的值替换当前的日期生成器元素集。
void element_strings(...)
  Parameters:
    string_type first
    string_type second
    string_type third
    string_type fourth
    string_type fifth
    string_type last
    string_type before
    string_type after
    string_type of
用一组新的值替换日期生成器元素集。
get_partial_date_type(...)
  Return Type:
    facet_type::partial_date_type
  Parameters:
    stream_itr_type next
    stream_itr_type str_end
    ios_base
    facet_type
一个模板函数,用于从流中解析 date_generator。
解析 partial_date => "dd Month"。
get_nth_kday_type(...)
  Return Type:
    facet_type::nth_kday_type
  Parameters:
    stream_itr_type next
    stream_itr_type str_end
    ios_base
    facet_type
一个模板函数,用于从流中解析 date_generator。
解析 nth_day_of_the_week_in_month => "nth weekday of month"。
get_first_kday_type(...)
  Return Type:
    facet_type::firat_kday_type
  Parameters:
    stream_itr_type next
    stream_itr_type str_end
    ios_base
    facet_type
一个模板函数,用于从流中解析 date_generator。
解析 first_day_of_the_week_in_month => "first weekday of month"。
get_last_kday_type(...)
  Return Type:
    facet_type::last_kday_type
  Parameters:
    stream_itr_type next
    stream_itr_type str_end
    ios_base
    facet_type
一个模板函数,用于从流中解析 date_generator。
解析 last_day_of_the_week_in_month => "last weekday of month"。
get_kday_before_type(...)
  Return Type:
    facet_type::kday_before_type
  Parameters:
    stream_itr_type next
    stream_itr_type str_end
    ios_base
    facet_type
一个模板函数,用于从流中解析 date_generator。
解析 first_day_of_the_week_before => "weekday before"。
get_kday_after_type(...)
  Return Type:
    facet_type::kday_after_type
  Parameters:
    stream_itr_type next
    stream_itr_type str_end
    ios_base
    facet_type
一个模板函数,用于从流中解析 date_generator。
解析 first_day_of_the_week_after => "weekday after"。

_____________________________________________________

特殊值

date_time 库使用五个 special_values。它们是

not_a_date_time neg_infin pos_infin min_date_time max_date_time

用于表示这些类型的默认字符串集是:“not-a-date-time”、“-infinity”、“+infinity”、“minimum-date-time”、“maximum-date-time”。输出时,min_date_time 和 max_date_time 显示为正常的日期/时间表示:“1400-Jan-01”和“9999-Dec-31”。

自定义

special_values 解析器/格式化器允许用户为这些特殊值设置自定义字符串。这些字符串可以作为新分面的构造参数设置,或者通过访问器函数在现有分面中设置。

特殊值格式化器/解析器参考
完整的类参考可以在此处找到:Special Values Formatter Doxygen Reference 和此处:Special Values Parser Doxygen Reference

特殊值格式化器构造函数

语法 描述
special_values_formatter()
构造函数使用特殊值字符串的默认值。
special_values_formatter(...)
  Parameters:
    collection_type::iterator
    collection_type::iterator
使用集合中的值构造。注意:集合的前三个字符串才会被使用。minimum_date_time 和 maximum_date_time 的字符串被忽略,因为这些特殊值构造为实际日期(如上所示)。
special_values_formatter(...)
  Parameters:
    char_type*
    char_type*
从字符串数组构造特殊值格式化器。

特殊值格式化器访问器

语法 描述
示例
OutItrT put_special(...)
  Parameters:
    OutItrT next
    special_values value
将给定的特殊值放入流。
date d1(not_a_date_time);
date d2(minimum_date_time);
special_values_formatter formatter;
formatter.put_special(itr, d1); 
// Puts: "not-a-date-time"
formatter.put_special(itr, d2); 
// Puts: "1400-Jan-01"

特殊值解析器构造函数

语法 描述
special_values_parser()
 
special_values_parser(...)
  Parameters:
    collection_type::iterator
    collection_type::iterator
使用集合中的字符串构造特殊值解析器。
special_values_parser(...)
  Parameter:
    scpecial_values_parser
复制构造函数。
special_values_parser(...)
  Parameters:
    string_type nadt_str
    string_type neg_inf_str
    string_type pos_inf_str
    string_type min_dt_str
    string_type max_dt_str
使用提供的字符串构造特殊值解析器。

特殊值解析器访问器

语法 描述
示例
void sv_strings(...)
  Parameters:
    string_type nadt_str
    string_type neg_inf_str
    string_type pos_inf_str
    string_type min_dt_str
    string_type max_dt_str
用给定的字符串替换特殊值字符串集。
bool match(...)
  Parameters:
    stream_itr_type beg
    stream_itr_type end
    match_results
如果解析成功,则返回 true。成功解析后,mr.current_match 将被设置为对应特殊值的整数值。
// stream holds "maximum_date_time"
typedef special_values_parser svp;
svp parser;
svp::match_results mr;
if(parser.match(itr, str_end, mr)) {
  d = date(static_cast<special_values>(
           mr.match_results))
} else {
  // error, failed parse
}
// d == "9999-Dec-31"

_____________________________________________________

格式日期解析器

format_date_parser 是保存月份和星期几名称及其缩写的字符串的对象。自定义字符串集可以在构造时设置,或者可以通过访问器函数替换现有 format_date_parser 中的字符串。构造函数和访问器函数都接受一个字符串向量作为参数。

格式日期解析器参考
完整的类参考可以在此处找到:Doxygen Reference

格式日期解析器构造函数

语法 描述
format_date_parser(...)
                Parameters:
                string_type format
                std::locale
创建一个解析器,在没有格式参数的函数中使用给定的格式解析日期。使用的名称和缩写从给定的区域设置中提取。
format_date_parser(...)
  Parameters:
    string_type format
    input_collection_type
    input_collection_type
    input_collection_type
    input_collection_type
使用给定的组件创建解析器。input_collection_type 参数用于:月份简称、月份全称、星期几简称和星期几全称(按此顺序)。这些集合必须包含每个月份和每个星期几的值(从一月和星期日开始)。
format_date_parser(...)
  Parameters:
    format_date_parser
复制构造函数

格式日期解析器访问器

语法 描述
示例
string_type format()
返回在没有格式参数的函数中用于解析日期的格式。
void format(string_type)
设置在没有格式参数的函数中用于解析日期的格式。
void short_month_names(...)
  Parameter:
    input_collection_type names
替换解析器使用的月份简称。集合必须包含每个月份的值,从一月开始。
void long_month_names(...)
  Parameter:
    input_collection_type names
替换解析器使用的月份全称。集合必须包含每个月份的值,从一月开始。
void short_weekday_names(...)
  Parameter:
    input_collection_type names
替换解析器使用的星期几简称。集合必须包含每个星期几的值,从星期日开始。
void long_weekday_names(...)
  Parameter:
    input_collection_type names
替换解析器使用的星期几全称。集合必须包含每个星期几的值,从星期日开始。
date_type parse_date(...)
  Parameters:
    string_type input
    string_type format 
    special_values_parser
使用给定的格式从给定输入中解析日期。
string inp("2005-Apr-15");
string format("%Y-%b-%d");
date d;
d = parser.parse_date(inp, 
                      format,
                      svp);
// d == 2005-Apr-15
date_type parse_date(...)
  Parameters:
    istreambuf_iterator input
    istreambuf_iterator str_end
    special_values_parser
使用解析器的格式从流中解析日期。
date_type parse_date(...)
  Parameters:
    istreambuf_iterator input
    istreambuf_iterator str_end
    string_type format
    special_values_parser
使用给定的格式从流中解析日期。
// stream holds "2005-04-15"
string format("%Y-%m-%d");
date d;
d = parser.parse_date(itr, 
                      str_end, 
                      format,
                      svp);
// d == 2005-Apr-15
month_type parse_month(...)
  Parameters:
    istreambuf_iterator input
    istreambuf_iterator str_end
    string_type format
使用给定的格式从流中解析月份。如果无法解析,则抛出 bad_month。
// stream holds "March"
string format("%B");
greg_month m;
m = parser.parse_month(itr, 
                       str_end, 
                       format);
// m == March
day_type parse_day_of_month(...)
  Parameters:
    istreambuf_iterator input
    istreambuf_iterator str_end
从流中解析月份中的日期。日期必须显示为两位数(01-31),否则将抛出 bad_day_of_month。
// stream holds "01"
greg_day d;
d = parser.parse_day_of_month(itr, 
                       str_end);
// d == 1st
day_type parse_var_day_of_month(...)
  Parameters:
    istreambuf_iterator input
    istreambuf_iterator str_end
从流中解析月份中的日期。日期必须显示为一位或两位数(1-31),否则将抛出 bad_day_of_month。
// stream holds "1"
greg_day d;
d = parser.parse_var_day_of_month(itr, 
                       str_end);
// d == 1st
day_of_week_type parse_weekday(...)
  Parameters:
    istreambuf_iterator input
    istreambuf_iterator str_end
    string_type format
根据给定的格式从流中解析星期几。如果无法解析,则抛出 bad_weekday。
// stream holds "Tue"
string format("%a");
greg_weekday wd;
wd = parser.parse_weekday(itr, 
                          str_end, 
                          format);
// wd == Tuesday
year_type parse_year(...)
  Parameters:
    istreambuf_iterator input
    istreambuf_iterator str_end
    string_type format
根据给定的格式从流中解析年份。如果无法解析,则抛出 bad_year。
// stream holds "98"
string format("%y");
greg_year y;
y = parser.parse_year(itr, 
                      str_end, 
                      format);
// y == 1998

日期时间 IO 教程

日期时间 IO 教程

基本用法 | 格式字符串 | 内容字符串 | 特殊值 | 日期/时间周期 | 日期生成器
基本用法

当调用运算符 '>>' 和 '<<' 时,分面会自动嵌入。可以进行流式传输的 date_time 对象列表是

格里高利

date, days, date_period, greg_month, greg_weekday, greg_year, partial_date, nth_day_of_the_week_in_month, first_day_of_the_week_in_month, last_day_of_the_week_in_month, first_day_of_the_week_after, first_day_of_the_week_before

Posix_time

ptime, time_period, time_duration

Local_time

local_date_time

以下示例展示了新 IO 代码的基本用法,利用了所有默认设置。(此示例可以在 libs/date_time/example/tutorial 目录中找到)

    
  date d(2004, Feb, 29);
  time_duration td(12,34,56,789);
  stringstream ss;
  ss << d << ' ' << td;
  ptime pt(not_a_date_time);
  cout << pt << endl; // "not-a-date-time"
  ss >> pt;
  cout << pt << endl; // "2004-Feb-29 12:34:56.000789"
  ss.str("");
  ss << pt << " EDT-05EDT,M4.1.0,M10.5.0";
  local_date_time ldt(not_a_date_time);
  ss >> ldt;
  cout << ldt << endl; // "2004-Feb-29 12:34:56.000789 EDT"
    
  

此示例使用了输入和输出分面的默认设置。默认格式使得示例中所示的互操作性成为可能。注意:local_date_time 的输入流只能使用 POSIX 时区字符串。默认输出格式使用时区缩写。格式可以更改,以便输出和输入匹配(如本教程后面所示)。

格式字符串

格式字符串控制日期/时间元素的使用顺序、类型和样式。分面提供了一些预定义的格式(iso_format_specifier、iso_format_extended_specifier 和 default_date_format),但用户可以轻松创建自己的格式。

(接上一个示例)
    
  local_time_facet* output_facet = new local_time_facet();
  local_time_input_facet* input_facet = new local_time_input_facet();
  ss.imbue(locale(locale::classic(), output_facet));
  ss.imbue(locale(ss.getloc(), input_facet));
  
  output_facet->format("%a %b %d, %H:%M %z");
  ss.str("");
  ss << ldt;
  cout << ss.str() << endl; // "Sun Feb 29, 12:34 EDT"

  output_facet->format(local_time_facet::iso_time_format_specifier);
  ss.str("");
  ss << ldt;
  cout << ss.str() << endl; // "20040229T123456.000789-0500"
 
  output_facet->format(local_time_facet::iso_time_format_extended_specifier);
  ss.str("");
  ss << ldt;
  cout << ss.str() << endl; // "2004-02-29 12:34:56.000789-05:00"
    
  

格式字符串不仅限于日期/时间元素。可以在格式字符串中放置额外的文字。注意:当输入格式中存在额外文字时,正在输入的的数据也必须包含完全相同的文字。

(接上一个示例)
    
  // extra words in format
  string my_format("The extended ordinal time %Y-%jT%H:%M can also be \
  represented as %A %B %d, %Y");
  output_facet->format(my_format.c_str());
  input_facet->format(my_format.c_str());
  ss.str("");
  ss << ldt;
  cout << ss.str() << endl;

  // matching extra words in input 
  ss.str("The extended ordinal time 2005-128T12:15 can also be \
  represented as Sunday May 08, 2005");
  ss >> ldt;
  cout << ldt << endl;
    
  
内容字符串

到目前为止,我们已经展示了用户如何通过使用格式来实现相当大的自定义。可以通过用户定义的元素(即字符串)来实现进一步的自定义。可以自定义的元素是:特殊值名称、月份名称、月份缩写、星期几名称、星期几缩写、日期/时间周期的分隔符以及日期生成器的短语元素。

这些的默认值如下

特殊值

not-a-date-time, -infinity, +infinity, minimum-date-time, maximum-date-time

月份

英语日历和三字母缩写

星期几

英语日历和三字母缩写

日期生成器短语元素

first, second, third, fourth, fifth, last, before, after, of

注意:我们之前已经展示过,可以通过格式字符串重新排列日期/时间表示的组件。日期生成器的情况并非如此。元素本身可以自定义,但它们的顺序不能改变。

内容字符串

为了说明自定义的可能性,我们将使用自定义的月份和星期几字符串(在本例中,我们只使用全称,全部小写)。

(接上一个示例)
    
  // set up the collections of custom strings.
  // only the full names are altered for the sake of brevity
  string month_names[12] = { "january", "february", "march", 
                             "april", "may", "june", 
                             "july", "august", "september", 
                             "october", "november", "december" };
  vector<string> long_months(&month_names[0], &month_names[12]);
  string day_names[7] = { "sunday", "monday", "tuesday", "wednesday", 
                          "thursday", "friday", "saturday" };
  vector<string> long_days(&day_names[0], &day_names[7]);
  
  //  create date_facet and date_input_facet using all defaults
  date_facet* date_output = new date_facet();
  date_input_facet* date_input = new date_input_facet();
  ss.imbue(locale(ss.getloc(), date_output)); 
  ss.imbue(locale(ss.getloc(), date_input));

  // replace names in the output facet
  date_output->long_month_names(long_months);
  date_output->long_weekday_names(long_days);
  
  // replace names in the input facet
  date_input->long_month_names(long_months);
  date_input->long_weekday_names(long_days);
  
  // customize month, weekday and date formats
  date_output->format("%Y-%B-%d");
  date_input->format("%Y-%B-%d");
  date_output->month_format("%B"); // full name
  date_input->month_format("%B"); // full name
  date_output->weekday_format("%A"); // full name
  date_input->weekday_format("%A"); // full name

  ss.str("");
  ss << greg_month(3);
  cout << ss.str() << endl; // "march"
  ss.str("");
  ss << greg_weekday(3);
  cout << ss.str() << endl; // "tuesday"
  ss.str("");
  ss << date(2005,Jul,4);
  cout << ss.str() << endl; // "2005-july-04"
    
  
特殊值

自定义特殊值的输入和输出最好是通过创建新的 special_values_parser 和 special_values_formatter 来完成。新的字符串可以在构造时设置(如以下示例所示)。

(接上一个示例)
    
  // reset the formats to defaults
  output_facet->format(local_time_facet::default_time_format);
  input_facet->format(local_time_input_facet::default_time_input_format);

  // create custom special_values parser and formatter objects
  // and add them to the facets
  string sv[5] = {"nadt","neg_inf", "pos_inf", "min_dt", "max_dt" };
  vector<string> sv_names(&sv[0], &sv[5]);
  special_values_parser sv_parser(sv_names.begin(), sv_names.end());
  special_values_formatter sv_formatter(sv_names.begin(), sv_names.end());
  output_facet->special_values_formatter(sv_formatter);
  input_facet->special_values_parser(sv_parser);

  ss.str("");
  ldt = local_date_time(not_a_date_time);
  ss << ldt;
  cout << ss.str() << endl; // "nadt"
  
  ss.str("min_dt");
  ss >> ldt;
  ss.str("");
  ss << ldt;
  cout << ss.str() << endl; // "1400-Jan-01 00:00:00 UTC"
    
  

注意:尽管我们将 min 和 max 的字符串发送给了格式化器,但它们被忽略了,因为这些特殊值构造为实际日期(如上所示)。

日期/时间周期

自定义周期的输入和输出最好是通过创建新的 period_parser 和 period_formatter 来完成。新的字符串可以在构造时设置(如以下示例所示)。

(接上一个示例)
    
  // all formats set back to defaults (not shown for brevity)

  // create our date_period
  date_period dp(date(2005,Mar,1), days(31)); // month of march

  // custom period formatter and parser
  period_formatter per_formatter(period_formatter::AS_OPEN_RANGE, 
                                 " to ", "from ", " exclusive", " inclusive" );
  period_parser per_parser(period_parser::AS_OPEN_RANGE, 
                           " to ", "from ", " exclusive" , "inclusive" );
  
  // default output
  ss.str("");
  ss << dp;
  cout << ss.str() << endl; // "[2005-Mar-01/2005-Mar-31]"
 
  // add out custom parser and formatter to  the facets
  date_output->period_formatter(per_formatter);
  date_input->period_parser(per_parser);
  
  // custom output
  ss.str("");
  ss << dp;
  cout << ss.str() << endl; // "from 2005-Feb-01 to 2005-Apr-01 exclusive"
    
  
日期生成器

通过替换(分面中的)现有字符串来完成日期生成器的输入和输出自定义。

注意:我们之前已经展示过,可以通过格式字符串重新排列日期/时间表示的组件。日期生成器的情况并非如此。元素本身可以自定义,但它们的顺序不能改变。

(接上一个示例)
    
  // custom date_generator phrases
  string dg_phrases[9] = { "1st", "2nd", "3rd", "4th", "5th", 
                           "final", "prior to", "following", "in" };
  vector<string> phrases(&dg_phrases[0], &dg_phrases[9]);

  // create our date_generator
  first_day_of_the_week_before d_gen(Monday);

  // default output
  ss.str("");
  ss << d_gen;
  cout << ss.str() << endl; // "Mon before"
 
  // add our custom strings to the date facets
  date_output->date_gen_phrase_strings(phrases);
  date_input->date_gen_element_strings(phrases);
  
  // custom output
  ss.str("");
  ss << d_gen;
  cout << ss.str() << endl; // "Mon prior to"
    
  

PrevUpHomeNext