从 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
独有行为的标志。
# 表示具有平台相关行为的标志。这些标志并非在所有地方都受支持。
! 表示目前不适用于输入的标志。
下表列出了可用的分面。
* 这些链接指向 time_facet
和 time_input_facet
参考部分。它们不是实际的类,而是类型别名。
为了实现新的 i/o 分面,date-time 库使用了一些新的解析器和格式化器。这些类可供想要实现专门的输入/输出例程的用户使用。
输出: | 输入 |
---|---|
period_formatter |
period_parser |
date_generator_formatter |
date_generator_parser |
special_values_formatter |
special_values_parser |
format_date_parser |
boost::date_time::date_facet
使您能够对日期的输出流(以及其他格里高利对象)进行显著控制。date_facet 在 gregorian
命名空间中被定义为类型别名 date_facet
和 wdate_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_facet
和 wdate_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_facet
是 boost::date_time::date_facet
的扩展。time_facet 在 posix_time
命名空间中被定义为类型别名 time_facet
和 wtime_facet
。在 local_time
命名空间中被定义为类型别名 local_time_facet
和 wlocal_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_facet
是 date_input_facet
的扩展。它在 boost::posix_time
命名空间中被定义为类型别名 time_input_facet
和 wtime_input_facet
。它在 boost::local_time
命名空间中被定义为类型别名 local_time_input_facet
和 wlocal_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_options 是 period_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_option 是 period_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 |
当调用运算符 '>>' 和 '<<' 时,分面会自动嵌入。可以进行流式传输的 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
ptime
, time_period
, time_duration
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"