| Localization library | |||||||||||||||||||||||||
| Regular expressions library(C++11) | |||||||||||||||||||||||||
| Formatting library(C++20) | |||||||||||||||||||||||||
| Null-terminated sequence utilities | |||||||||||||||||||||||||
| Byte strings | |||||||||||||||||||||||||
| Multibyte strings | |||||||||||||||||||||||||
| Wide strings | |||||||||||||||||||||||||
| Primitive numeric conversions | |||||||||||||||||||||||||
| |||||||||||||||||||||||||
| Text encoding identifications | |||||||||||||||||||||||||
| |||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
time_get::get_yeartime_get::do_get_year | ||||
Defined in header <locale> | ||
public: iter_type get_year( iter_type s, iter_type end,std::ios_base& str, | (1) | |
protected: virtual iter_type do_get_year( iter_type s, iter_type end,std::ios_base& str, | (2) | |
do_get_year of the most derived class.[beg, end) and parses out the year using some implementation-defined format. Depending on the locale, two-digit years may be accepted, and it is implementation-defined which century they belong to.The parsed year is stored in thestd::tm structure fieldt->tm_year.
If the end iterator is reached before a valid year is read, the function setsstd::ios_base::eofbit inerr. If a parsing error is encountered, the function setsstd::ios_base::failbit inerr.
Contents |
| beg | - | iterator designating the start of the sequence to parse |
| end | - | one past the end iterator for the sequence to parse |
| str | - | a stream object that this function uses to obtain locale facets when needed, e.g.std::ctype to skip whitespace orstd::collate to compare strings |
| err | - | stream error flags object that is modified by this function to indicate errors |
| t | - | pointer to thestd::tm object that will hold the result of this function call |
Iterator pointing one past the last character in[beg, end) that was recognized as a part of a valid year.
For two-digit input values, many implementations use the same parsing rules as the conversion specifier'%y' as used bystd::get_time,std::time_get::get(), and the POSIX functionstrptime(): two-digit integer is expected, the values in the range[69, 99] results in values 1969 to 1999, range[00, 68] results in 2000 to 2068. Four-digit inputs are typically accepted as-is.
If a parsing error is encountered, most implementations of this function leave*t unmodified.
#include <iostream>#include <iterator>#include <locale>#include <sstream> void try_get_year(conststd::string& s){std::cout<<"Parsing the year out of '"<< s<<"' in the locale "<<std::locale().name()<<'\n';std::istringstream str(s);std::ios_base::iostate err=std::ios_base::goodbit; std::tm t;std::time_get<char>const& facet=std::use_facet<std::time_get<char>>(str.getloc());std::istreambuf_iterator<char> ret= facet.get_year({str},{}, str, err,&t); str.setstate(err);std::istreambuf_iterator<char> last{}; if(str){std::cout<<"Successfully parsed, year is "<<1900+ t.tm_year; if(ret!= last){std::cout<<" Remaining content: ";std::copy(ret, last,std::ostreambuf_iterator<char>(std::cout));}elsestd::cout<<" the input was fully consumed";}else{std::cout<<"Parse failed. Unparsed string: ";std::copy(ret, last,std::ostreambuf_iterator<char>(std::cout));} std::cout<<'\n';} int main(){std::locale::global(std::locale("en_US.utf8")); try_get_year("13"); try_get_year("2013"); std::locale::global(std::locale("ja_JP.utf8")); try_get_year("2013年");}
Possible output:
Parsing the year out of '13' in the locale en_US.utf8Successfully parsed, year is 2013 the input was fully consumedParsing the year out of '2013' in the locale en_US.utf8Successfully parsed, year is 2013 the input was fully consumedParsing the year out of '2013年' in the locale ja_JP.utf8Successfully parsed, year is 2013 Remaining content: 年
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 248 | C++98 | eofbit was not set upon reaching the end iterator | setseofbit if a valid year has not been read |
(C++11) | parses a date/time value of specified format (function template)[edit] |