std::time_get<CharT,InputIt>::get_monthname, std::time_get<CharT,InputIt>::do_get_monthname

来自cppreference.com
< cpp‎ | locale‎ | time get
 
 
本地化库
本地环境与平面
本地环境
平面类别基类
ctype(字符类别)平面
numeric(数值)平面
collate(对照比较)平面
time(时间)平面
monetary(货币)平面
messages(消息)平面
字符分类与转换
字符分类
转换
编码转换平面
(C++11)    
C 本地环境
 
 
在标头 <locale> 定义
public:

iter_type get_monthname( iter_type beg, iter_type end, std::ios_base& str,

                         std::ios_base::iostate& err, std::tm* t ) const;
(1)
protected:

virtual iter_type do_get_monthname( iter_type beg, iter_type end, std::ios_base& str,

                                    std::ios_base::iostate& err, std::tm* t ) const;
(2)
1) 公开成员函数,调用最终派生类的受保护虚成员函数 do_get_monthname
2) 从字符序列 [beg, end) 读取出相继字符,并按与为函数 std::get_timetime_get::get 和 POSIX 函数 strptime() 所用的此本地环境所期待的月名默认格式 "%b" 解析出月名(可能是缩写)。

如果它找到缩写名,那么它会持续读取,直到消耗尽完整名的字符,或找到不是期待的字符,后一情况下即使首段字符是合法缩写解析也会失败。

将解析出的的月名存储到 std::tmt->tm_mon

如果在读到合法月名之前抵达尾迭代器,那么函数会设置 err 中的 std::ios_base::eofbit。如果遇到解析错误,那么函数会设置 err 中的 std::ios_base::failbit

参数

beg - 指代要分析的序列起始的迭代器
end - 要分析的序列的尾后一位置迭代器
str - 此函数在需要时用以获得本地环境平面的流对象,例如用 std::ctype 跳过空白符或用 std::collate 比较字符串
err - 此函数所修改以指示错误的流错误标志对象
t - 指向 std::tm 对象的指针,该对象将保有此函数调用结果

返回值

指向 [beg, end) 中辨识为合法月名部分的末字符后一位置的迭代器。

注意

此函数通常不区别大小写。

如果遇到解析错误,那么此函数的大多数实现保留 *t 不修改。

示例

#include <iostream>
#include <locale>
#include <sstream>
#include <iterator>
#include <ctime>
 
void try_get_mon(const std::string& s)
{
    std::cout << "在本地环境 " << std::locale().name()
              << " 中从 '" << s << "' 解析月名\n";
    std::istringstream str(s);
    std::ios_base::iostate err = std::ios_base::goodbit;
 
    std::tm t;
    std::time_get<char> facet = std::use_facet<std::time_get<char>>(str.getloc())
    std::istreambuf_iterator<char> ret = facet.get_monthname({str}, {}, str, err, &t);
    str.setstate(err);
    std::istreambuf_iterator<char> last{};
 
    if (str)
    {
        std::cout << "解析成功,月份序数是 " << t.tm_wday;
 
        if (ret != last)
        {
            std::cout << ",剩余内容:";
            std::copy(ret, last, std::ostreambuf_iterator<char>(std::cout));
        }
        else
            std::cout << ",输入已全部消耗";
    }
    else
    {
        std::cout << "解析失败。尚未解析的字符串:";
        std::copy(ret, last, std::ostreambuf_iterator<char>(std::cout));
    }
 
    std::cout << '\n';
}
 
int main()
{
    std::locale::global(std::locale("ja_JP.utf8"));
    try_get_mon("2月");
    std::locale::global(std::locale("th_TH.utf8"));
    try_get_mon("กุมภาพันธ์");
    std::locale::global(std::locale("el_GR.utf8"));
    try_get_mon("Φεβ");
    try_get_mon("Φεβρουάριος");
    std::locale::global(std::locale("en_US.utf8"));
    try_get_mon("Febrile");
}

输出:

在本地环境 ja_JP.utf8 中从 '2月' 解析月名
解析成功,月份序数是 1,输入已全部消耗
在本地环境 th_TH.utf8 中从 'กุมภาพันธ์' 解析月名
解析成功,月份序数是 1,输入已全部消耗
在本地环境 el_GR.utf8 中从 'Φεβ' 解析月名
解析成功,月份序数是 1,输入已全部消耗
在本地环境 el_GR.utf8 中从 'Φεβρουάριος' 解析月名
解析成功,月份序数是 1,输入已全部消耗
在本地环境 en_US.utf8 中从 'Febrile' 解析月名
解析失败。尚未解析的字符串:ile

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
LWG 248 C++98 在抵达尾迭代器时不会设置 eofbit 在没有读取到合法月名的情况下会设置 eofbit

参阅

(C++11)
剖析指定格式的日期/时间值
(函数模板)