从 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"