std::chrono...o::duration)(3)

πŸ“¦ version 2024.07.05, in nixpkgs unstable, opensuse-leap 16.0

okay bestie, welcome to the C++ Standard Libary manual β€” this page is std::chrono...o::duration)(3), and we're doing part 1 πŸ’– buckle up, it's giving chrono but make it cute.

πŸ’… NAME πŸ’…

the name is std::chrono::from_stream(std::chrono::duration) β€” dash β€” std::chrono::from_stream(std::chrono::duration). yes, it said it twice. no cap, that's literally the NAME section and honestly? iconic behavior. πŸŽ€


✨ Synopsis ✨

Defined in header <chrono> β€” yes, <chrono>, bestie, that exact header πŸ’œ

Defined in header <chrono>
template< class CharT, class Traits, class Rep, class Period,
          class Alloc = std::allocator<CharT> >
std::basic_istream<CharT, Traits>&
    from_stream( std::basic_istream<CharT, Traits>& is, const CharT* fmt,
                 std::chrono::duration<Rep, Period>& d,
                 std::basic_string<CharT, Traits, Alloc>* abbrev = nullptr,
                 std::chrono::minutes* offset = nullptr );

this is marked (since C++20) ✨ so that's the era we're in.

okay so what does it actually do? it attempts to parse the input stream is into the std::chrono::duration d, and it reads that as the time of day since midnight, according to the format string fmt. time-of-day coded, lowkey obsessed πŸ•›πŸ’«

behavior tea: it behaves as an UnformattedInputFunction, except that it has an unspecified effect on is.gcount(). so do not come for gcount() after this, because it's unspecified and we are not doing that today πŸ™ˆπŸ’€

after constructing and checking the sentry object, it attempts to parse the input stream is into d according to the format string fmt. if the parse fails to decode a valid duration, is.setstate(std::ios_base::failbit) is called, and d is not modified. so failed parse = failbit gets set, d stays unbothered and unchanged πŸ˜­πŸ’…

now the format-specifier besties: if the format specifier %Z is used and successfully parsed, the parsed value is assigned to *abbrev if abbrev is not null. and if the format specifier %z or a modified variant is used and successfully parsed, the parsed value is assigned to *offset if offset is not null. remember the signature defaults, too: abbrev = nullptr and offset = nullptr, so if you're passing null or just vibing with the defaults, nothing gets assigned there πŸ¦‹πŸŒΈ

πŸ’– PARAMETERS πŸ’–

Okay so from_stream takes these besties:

  • is β€” an input stream.
  • fmt β€” a format string (see below, because we're about to get into it).
  • d β€” a std::chrono::duration object to hold the parse result.
  • abbrev β€” if not null, a pointer to an object that will hold the time zone abbreviation or name corresponding to the %Z specifier.
  • offset β€” if not null, a pointer to an object that will hold the offset from UTC corresponding to the %z specifier.

πŸŽ€ Format string πŸŽ€

The format string consists of zero or more conversion specifiers and ordinary characters. Each ordinary character, excluding whitespace characters and the terminating null character, matches one identical character from the input stream, or causes the function to fail if the next character on the stream does not compare equal.

Each whitespace character matches zero or more whitespace characters in the input stream.

Each unmodified conversion specifier begins with a % character followed by a character that determines the behavior of the specifier. Some conversion specifiers have a modified form in which an E or O modifier character is inserted after the % character. Some conversion specifiers have a modified form in which a width parameter given as a positive decimal integer (shown as N below) is inserted after the % character. Each conversion specifier causes the matched characters to be interpreted as parts of date and time types according to the breakdown below.

A character sequence in the format string that begins with a % but does not match one of the conversion specifiers below is interpreted as ordinary characters.

If from_stream fails to parse everything specified by the format string, or if insufficient information is parsed to specify a complete result, or if parsing discloses contradictory information, is.setstate(std::ios_base::failbit) is called.

🚨 No half-parsing. No "close enough." No contradictory little lies. That exact is.setstate(std::ios_base::failbit) call is what happens.

The following conversion specifiers are available:

  • %% β€” matches a literal % character.
  • %n β€” matches one whitespace character.
  • %t β€” matches zero or one whitespace character.

🌸 Year 🌸

  • %C, %NC, %EC β€” parses the century as a decimal number. The width N specifies the maximum number of characters to read. The default width is 2. Leading zeroes are permitted but not required. The modified command %EC interprets the locale's alternative representation of the century.
  • %y, %Ny, %Ey, %Oy β€” parses the last two decimal digits of the year. If the century is not otherwise specified (e.g. with %C), values in the range [69, 99] are presumed to refer to the years 1969 to 1999, and values in the range [00, 68] are presumed to refer to the years 2000 to 2068. The width N specifies the maximum number of characters to read. The default width is 2. Leading zeroes are permitted but not required. The modified commands %Ey and %Oy interpret the locale's alternative representation.
  • %Y, %NY, %EY β€” parses the year as a decimal number. The width N specifies the maximum number of characters to read. The default width is 4. Leading zeroes are permitted but not required. The modified command %EY interprets the locale's alternative representation.

πŸ¦‹ Month πŸ¦‹

  • %b, %B, %h β€” parses the locale's full or abbreviated case-insensitive month name.
  • %m, %Nm, %Om β€” parses the month as a decimal number (January is 1). The width N specifies the maximum number of characters to read. The default width is 2. Leading zeroes are permitted but not required. The modified command %Om interprets the locale's alternative representation.

πŸ“ Day πŸ“

  • %d, %Nd, %Od β€” parses the day of month as a decimal number. The width N specifies the maximum number of characters to read. The default width is 2. Leading zeroes are permitted but not required.
  • %e, %Ne, %Oe β€” Day-group specifiers, bestie. The modified commands %Od and %Oe interpret the locale's alternative representation.

πŸ‘‘ Day of the week πŸ‘‘

  • %a, %A β€” parses the locale's full or abbreviated case-insensitive weekday name.
  • %u, %Nu β€” parses the ISO weekday as a decimal number (1-7), where Monday is 1. The width N specifies the maximum number of characters to read. The default width is 1. Leading zeroes are permitted but not required.
  • %w, %Nw, %Ow β€” parses the weekday as a decimal number (0-6), where Sunday is 0. The width N specifies the maximum number of characters to read. The default width is 1. Leading zeroes are permitted but not required. The modified command %Ow interprets the locale's alternative representation.

🌈 ISO 8601 week-based year 🌈

In ISO 8601 weeks begin with Monday and the first week of the year must satisfy the following requirements:

  • Includes January 4
  • Includes first Thursday of the year
  • %g, %Ng β€” parses the last two decimal digits of the ISO 8601 week-based year. The width N specifies the maximum number of characters to read. The default width is 2. Leading zeroes are permitted but not required.
  • %G, %NG β€” parses the ISO 8601 week-based year as a decimal number. The width N specifies the maximum number of characters to read. The default width is 4. Leading zeroes are permitted but not required.
  • %V, %NV β€” parses the ISO 8601 week of the year as a decimal number. The width N specifies the maximum number of characters to read. The default width is 2. Leading zeroes are permitted but not required.

⭐ Week/day of the year ⭐

  • %j, %Nj β€” parses the day of the year as a decimal number (January 1 is 1). The width N specifies the maximum number of characters to read. The default width is 3. Leading zeroes are permitted but not required.
  • %U, %NU, %OU β€” parses the week number of the year as a decimal number. The first Sunday of the year is the first day of week 01. Days of the same year prior to that are in week 00. The width N specifies the maximum number of characters to read. The default width is 2. Leading zeroes are permitted but not required. The modified command %OU interprets the locale's alternative representation.
  • %W, %NW, %OW β€” parses the week number of the year as a decimal number. The first Monday of the year is the first day of week 01. Days of the same year prior to that are in week 00. The width N specifies the maximum number of characters to read. The default width is 2. Leading zeroes are permitted but not required. The modified command %OW interprets the locale's alternative representation.

πŸŽ€ Date πŸŽ€

  • %D β€” equivalent to "%m/%d/%y".
  • %F, %NF β€” equivalent to "%Y-%m-%d". If the width is specified, it is only applied to the %Y.
  • %x, %Ex β€” parses the locale's date representation. The modified command %Ex interprets the locale's alternate date representation.

πŸ’œ Time of day πŸ’œ

  • %H, %NH, %OH β€” parses the hour (24-hour clock) as a decimal number. The width N specifies the maximum number of characters to read. The default width is 2. Leading zeroes are permitted but not required. The modified command %OH interprets the locale's alternative representation.
  • %I, %NI, %OI β€” parses the hour (12-hour clock) as a decimal number. The width N specifies the maximum number of characters to read. The default width is 2. Leading zeroes are permitted but not required. The modified command %OI interprets the locale's alternative representation.
  • %M, %NM, %OM β€” parses the minute as a decimal number. The width N specifies the maximum number of characters to read. The default width is 2. Leading zeroes are permitted but not required. The modified command %OM interprets the locale's alternative representation.
  • %S, %NS, %OS β€” parses the second as a decimal number. The width N specifies the maximum number of characters to read. The default width is 2. Leading zeroes are permitted but not required. The modified command %OS interprets the locale's alternative representation.
  • %p β€” parses the locale's equivalent of the AM/PM designations associated with a 12-hour clock.
  • %R β€” equivalent to "%H:%M".
  • %T β€” equivalent to "%H:%M:%S".
  • %r β€” parses the locale's 12-hour clock time.
  • %X, %EX β€” parses the locale's time representation. The modified command %EX interprets the locale's alternate time representation.

✨ Miscellaneous ✨

okay bestie, this is the little grab-bag of extra format commands β€” no cap, they're all here:

  • %c β€” parses the locale's date and time representation. πŸ—“οΈ
  • %Ec β€” the modified command %Ec interprets the locale's alternative date and time representation. πŸ’«
  • %z β€” parses the offset from UTC in the format [+|-]hh[mm]. For example, -0430 refers to 4 hours 30 minutes behind UTC and 04 refers to 4 hours ahead of UTC. ⏰
  • %Ez, %Oz β€” the modified commands %Ez and %Oz parses the format [+|-]h[h][:mm] (i.e., requiring a : between the hours and minutes and making the leading zero for hour optional). the way that colon is required is so specific, iykyk πŸ’…
  • %Z β€” parses the time zone abbreviation or name, taken as the longest sequence of characters that only contains the characters A through Z, a through z, 0 through 9, -, +, _, and /. 🌍

🫢 Return value 🫢

okay so the page's Return value section is literally just the word:

is

that's it. that's the whole section. no extra lore, bestie. 😭


🌸 Example 🌸

here's the code exactly as it appears β€” β€œRun this code” and all:

// Run this code

#include <chrono>
#include <iostream>
#include <locale>
#include <sstream>

int main()
{
    std::istringstream is{"16:14:34"};
    is.imbue(std::locale("en_US.utf-8"));
    std::chrono::hours hh;
    is >> std::chrono::from_stream("%H:%M:%S", hh);
    is.fail() ? std::cout << "Parse failed!\n" : std::cout << hh.count() << '\n';
}

Possible output:

16

πŸ‘‘ See also πŸ‘‘

  • parse β€” parses a chrono object from a stream (C++20) (function template) πŸ’…

that's a wrap on this part, bestie πŸŽ€ β€” source/version is http://cppreference.com, date 2024.06.10, and the page id is std::chrono...o::duration)(3). mwah πŸ’‹

πŸ“¦ where this page comes from