首页 理论教育 时间/日期格式化技巧的实用指南

时间/日期格式化技巧的实用指南

时间:2023-10-25 理论教育 版权反馈
【摘要】:时间/日期的解析和格式化工作是由time类型中的两个刻面完成的。fmt的其他标识对解析过程的影响目前没有明确规定。表12-23 dateorder的枚举值2.时间和日期的格式化time_get刻面用于格式化时间和日期。表12-24中的第二个put函数()的后两个参数是字符,此版本将t所指向的tm对象格式化,并将参数cvt视为转换指示符传给strftime()。

时间/日期格式化技巧的实用指南

时间/日期的解析和格式化工作是由time类型中的两个刻面完成的。这两个刻面分别是time_get和time_put。其成员函数凭借操作型别为tm的对象完成该项工作。型别tm定义于头文件<ctime>中。tm对象是不会被直接传递的,而是以其地址为参数进行传递的。

time类型中两个刻面的行为均和strftime()函数有关系。该函数会根据一个含有转换规格的字符串,从一个tm对象中生成一个字符串。转换规则同样适用于time_put刻面。转换规则详见表12-21。

12-21 函数strftime()的转换规则

978-7-111-51399-5-Chapter12-240.jpg

当然,strftime()函数产生的具体字符串要根据“C”locale来确定。

1.时间和日期的解析

time_get刻面是一个模板,以一个字符型别charT和一个输入型迭代器型别作为模板参数。该输入型迭代器的默认型别为istreambuf_ iterator<charT>。除了date_ order()之外,所有成员均对字符串进行解析,并将结果存储于参数t所指的tm对象中。若字符串不能被正确解析,就不汇报错误;反之,就在tm对象中存储一个未定值。程序产生的时间会被正确地解析,而用户输入的时间就未必了。通过参数fmt可以决定解析过程中使用哪些刻面。fmt的其他标识对解析过程的影响目前没有明确规定。

全部函数均返回一个迭代器。该迭代器指向最后一个读取字符的下一位置。当解析结束或发生错误时,解析动作需要立刻停止。读取星期和月份时,函数可以使用缩写,也可使用全名。若缩写后面跟着字母,且恰好是全名中的某个有效字母,则函数试图读取全名。若读取失败,将无视“缩写名称曾解析成功过”的事实,声明解析失败。

date_order()返回日期字符串中的年月日顺序。对日期来说,这是有必要的。因为仅从字符串表示式来看,很难搞清楚顺序。例如,2003年2月的第一天可以写成3/2/1,也可写成1/2/3。time_get刻面的基类time_base针对所有可能的年月日次序定义了枚举型别dateorder。

C++标准要求每个类locale必须有time_get<char>和time_get<wchar_t>两个具体实例化对象。此外,C++标准程序库要求支持以下形式的具体实体:以char或wchar_t作为第一个模板参数,以相应的输入型迭代器作为第二个模板参数。time_get刻面的成员函数详见表12-22。

12-22 time_get刻面的成员函数

978-7-111-51399-5-Chapter12-241.jpg

dateorder的枚举值详见表12-23。(www.xing528.com)

12-23 dateorder的枚举值

978-7-111-51399-5-Chapter12-242.jpg

2.时间和日期的格式化

time_get刻面用于格式化时间和日期。它是一个模板,接受一个字符型别charT作为模板参数,另一个可有可无的模板参数是输出型迭代器型别,即Outit。后者默认为ostreambuf_it-erator。time_put刻面定义了两个put()函数,均被用于将“储存于tm对象中的日期信息”转化为一个字符序列,并写至输出型迭代器中。表12-24列出了timeput刻面的两个成员函数。

12-24 time_put刻面的成员函数

978-7-111-51399-5-Chapter12-243.jpg

这两个函数的结果均可写至输出型迭代器中。该输出型迭代器返回最后一个被写出的字符的下一位置。参数fmt的型别是ios_ base,用于存取其他刻面及可能会有的附加信息。若需要填充字符,则可使用fill。参数t指向一个tm对象,其中存放即将被格式化的日期。

表12-24中的第二个put函数()的后两个参数是字符,此版本将t所指向的tm对象格式化,并将参数cvt视为转换指示符传给strftime()。put()函数仅能执行一次转换,即由字符cvt指示的转换。当有转换指示符被发现时,函数被另一个put()函数调用。例如,以“X”作为转换指示符,会导致储存于∗t内的时间信息被写至输出型迭代器。C++标准没有对参数mod的意义进行强制定义。其主要目的是作为修饰符,即针对strftime()函数的多个实作版本之间的转换进行修饰。

第一种形式的put()函数接受由[cbeg,cend]定义的字符串,其转换行为和strftime()非常相似,即扫描字符串,并将任何“不隶属转换指示符”的字符直接写至输出型迭代器。若遇到由“%”引导的转换指示符,则会从中提炼修饰符和转换指示符。函数将转换指示符和修饰符作为最后两个参数,并调用另一版本的put()函数,直到处理完一个转换指示符后,put()继续扫描字符串。

此刻面还提供了一个非虚拟成员函数——“以一个字符串作为转换指示符”的put()函数。time_put派生类别无法对此函数进行改写,只能改写其他put()函数。

C++标准要求每个类locale中都必须有两个实例化对象:time_put<char>和time_put<wchar_t>。另外,C++标准程序库还支持所有“第一个模板参数为char或wchar_t,第二个模板参数为相应之输入型迭代器”的time_put<>实例化对象。C++标准不能够保证支持以“char和wchar_t以外的字符型别”作为第一个模板参数的实例化对象,也不能保证locale对象在默认情况下包含time_put<char>和time_put<wchar_t>之外的任何实例化对象。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈