std::time_g...t_monthname,(3)
π
std::time_g...t_monthname,(3) π
Okay bestie, welcome to the C++ Standard Libary manual (yes, Libary, that's literally how the manual name is spelled on the page and I am not fixing the header π), section (3), and today's main character is std::time_get::get_monthname. It's giving niche locale-parsing queen energy and honestly? Obsessed. π
π NAME π
std::time_get::get_monthname, - std::time_get::get_monthname,
Yes, it's listed twice with that trailing comma situation. We don't make the rules, bestie, we just keep every detail. π
β¨ Synopsis β¨
Here's the whole signature setup, copied exactly because we do not mess with code on this page:
Defined in header <locale>
public:
iter_type get_monthname( iter_type beg, iter_type end, std::ios_base&
str, (1)
std::ios_base::iostate& err, std::tm* t )
const;
protected:
virtual iter_type do_get_monthname( iter_type beg, iter_type end,
std::ios_base& str,
(2)
std::ios_base::iostate& err,
std::tm* t )
const;
- Public member function, calls the protected virtual member function
do_get_monthnameof the most derived class. - Reads successive characters from the sequence
[beg, end)and parses out the month name (possibly abbreviated), using the default format for month names expected by this locale, which is the same format as"%b"as used by the functionsstd::get_time,time_get::get, and the POSIX functionstrptime().
Heads up, bestie: if it finds an abbreviated name, followed by the characters that are valid for the full name, it continues reading until it consumes all the characters for the full name or finds a character that isn't expected, in which case parsing fails even if the first few characters were a valid abbreviation. That's the plot twist. π
The parsed month is stored in the std::tm field t->tm_mon. If the end iterator is reached before a valid month name is read, the function sets std::ios_base::eofbit in err. If a parsing error is encountered, the function sets std::ios_base::failbit in err.
π¦ Parameters π¦
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::ctypeto skip whitespace orstd::collateto compare strings.errβ stream error flags object that is modified by this function to indicate errors.tβ pointer to thestd::tmobject that will hold the result of this function call.
π Return value π
Iterator pointing one past the last character in [beg, end) that was recognized as a part of a valid month name. Slay. β¨
π Notes π
This function is usually case-insensitive.
If a parsing error is encountered, most implementations of this function leave *t unmodified. Vibe check: your std::tm might just be sitting there unchanged, bestie.
π Example π
The page literally says // Run this code, so here's the whole example, fr fr:
#include <ctime>
#include <iostream>
#include <iterator>
#include <locale>
#include <sstream>
#include <string_view>
void try_get_mon(std::string_view locale_name, std::string_view source)
{
try
{
std::locale::global(std::locale(locale_name.data()));
}
catch (std::runtime_error const& ex)
{
std::cout << "Cannot setup locale: " << locale_name << "\n"
"Exception: " << ex.what() << '\n';
return;
}
std::cout << "Parsing the month out of '" << source
<< "' in the locale " << std::locale().name() << '\n';
std::istringstream str{source.data()};
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_monthname({str}, {},
str, err, &t);
str.setstate(err);
std::istreambuf_iterator<char> last{};
if (str)
{
std::cout << "Successfully parsed, month number is " <<
t.tm_mon;
if (ret != last)
{
std::cout << ". Remaining content: ";
std::copy(ret, last,
std::ostreambuf_iterator<char>(std::cout));
}
else
std::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()
{
try_get_mon("ja_JP.utf8", "2ζ");
try_get_mon("th_TH.utf8", "ΰΈΰΈ‘ΰΈ ΰΈ²ΰΈΰΈΰΈ");
try_get_mon("el_GR.utf8", "ΦΡβ");
try_get_mon("el_GR.utf8", "ΦΡβΟΞΏΟ
α½±ΟΞΉΞΏΟ");
try_get_mon("en_US.utf8", "Febrile");
}
πΈ Possible output πΈ
Parsing the month out of '2ζ' in the locale ja_JP.utf8
Successfully parsed, month number is 1. The input was fully consumed
Parsing the month out of 'ΰΈΰΈ‘ΰΈ ΰΈ²ΰΈΰΈΰΈ' in the locale th_TH.utf8
Successfully parsed, month number is 1. The input was fully consumed
Parsing the month out of 'ΦΡβ' in the locale el_GR.utf8
Successfully parsed, month number is 1. The input was fully consumed
Parsing the month out of 'ΦΡβΟΞΏΟ
α½±ΟΞΉΞΏΟ' in the locale el_GR.utf8
Successfully parsed, month number is 1. The input was fully consumed
Parsing the month out of 'Febrile' in the locale en_US.utf8
Parse failed. Unparsed string: ile
π«Ά Defect reports π«Ά
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
- DR
LWG 248β Applied to:C++98. Behavior as published:eofbitwas not set upon reaching the end iterator. Correct behavior: setseofbitif a valid month name has not been read.
β See also β
get_timeβ parses a date/time value of specified format (C++11) (function template).
And that's the whole page, bestie π«Άβ¨ Source: http://cppreference.com, version/date: 2024.06.10, footer title: std::time_g...t_monthname,(3). Byeee π
π
π¦ where this page comes from
- nixpkgs unstable: stdman 2024.07.05
- opensuse-leap 16.0: stdman 2024.07.05-bp160.1.9 Β· MIT
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms