<!DOCTYPE html><html lang='en'><head><title>[time.zone.zonedtime.overview]</title><meta charset='UTF-8'/><link rel='stylesheet' type='text/css' href='14882.css'/><link rel='stylesheet' type='text/css' href='expanded.css' title='Notes and examples expanded'/><link rel='alternate stylesheet' type='text/css' href='colored.css' title='Notes and examples colored'/><link rel='alternate stylesheet' type='text/css' href='collapsed.css' title='Notes and examples collapsed'/><link rel='icon' href='icon.png'/></head><body><div class='wrapper'><h1 ><a class='secnum' style='min-width:73pt'>26</a> Time library <a class='abbr_ref' href='./#time'>[time]</a></h1><h2 ><a class='secnum' style='min-width:88pt'>26.10</a> Time zones <a class='abbr_ref' href='time.zone#zonedtime.overview'>[time.zone]</a></h2><h3 ><a class='secnum' style='min-width:103pt'>26.10.7</a> Class template <span class='texttt'>zoned_&shy;time</span> <a class='abbr_ref' href='time.zone.zonedtime#overview'>[time.zone.zonedtime]</a></h3><h4 ><a class='secnum' style='min-width:118pt'>26.10.7.1</a> Overview <a class='abbr_ref'>[time.zone.zonedtime.overview]</a></h4><span class='indexparent'><a class='index' id='lib:zoned_time'></a></span><pre class='codeblock'>
<span class='keyword'>namespace</span> std<span class='operator'>:</span><span class='operator'>:</span>chrono <span class='curlybracket'>{</span>
  <span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>class</span> Duration, <span class='keyword'>class</span> TimeZonePtr <span class='operator'>=</span> <span class='keyword'>const</span> time_zone<span class='operator'>*</span><span class='anglebracket'>&gt;</span>
  <span class='keyword'>class</span> zoned_time <span class='curlybracket'>{</span>
  <span class='keyword'>public</span><span class='operator'>:</span>
    <span class='keyword'>using</span> duration <span class='operator'>=</span> common_type_t<span class='anglebracket'>&lt;</span>Duration, seconds<span class='anglebracket'>&gt;</span>;

  <span class='keyword'>private</span><span class='operator'>:</span>
    TimeZonePtr        zone_;                   <span class='comment'>// <span class='textit'>exposition only</span></span>
    sys_time<span class='anglebracket'>&lt;</span>duration<span class='anglebracket'>&gt;</span> tp_;                     <span class='comment'>// <span class='textit'>exposition only</span></span>

    <span class='keyword'>using</span> traits <span class='operator'>=</span> zoned_traits<span class='anglebracket'>&lt;</span>TimeZonePtr<span class='anglebracket'>&gt;</span>;   <span class='comment'>// <span class='textit'>exposition only</span></span>

  <span class='keyword'>public</span><span class='operator'>:</span>
    zoned_time<span class='parenthesis'>(</span><span class='parenthesis'>)</span>;
    zoned_time<span class='parenthesis'>(</span><span class='keyword'>const</span> zoned_time<span class='operator'>&amp;</span><span class='parenthesis'>)</span> <span class='operator'>=</span> <span class='keyword'>default</span>;
    zoned_time<span class='operator'>&amp;</span> <span class='keyword'>operator</span><span class='operator'>=</span><span class='parenthesis'>(</span><span class='keyword'>const</span> zoned_time<span class='operator'>&amp;</span><span class='parenthesis'>)</span> <span class='operator'>=</span> <span class='keyword'>default</span>;

    zoned_time<span class='parenthesis'>(</span><span class='keyword'>const</span> sys_time<span class='anglebracket'>&lt;</span>Duration<span class='anglebracket'>&gt;</span><span class='operator'>&amp;</span> st<span class='parenthesis'>)</span>;
    <span class='keyword'>explicit</span> zoned_time<span class='parenthesis'>(</span>TimeZonePtr z<span class='parenthesis'>)</span>;
    <span class='keyword'>explicit</span> zoned_time<span class='parenthesis'>(</span>string_view name<span class='parenthesis'>)</span>;

    <span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>class</span> Duration2<span class='anglebracket'>&gt;</span>
      zoned_time<span class='parenthesis'>(</span><span class='keyword'>const</span> zoned_time<span class='anglebracket'>&lt;</span>Duration2, TimeZonePtr<span class='anglebracket'>&gt;</span><span class='operator'>&amp;</span> zt<span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;

    zoned_time<span class='parenthesis'>(</span>TimeZonePtr z,    <span class='keyword'>const</span> sys_time<span class='anglebracket'>&lt;</span>Duration<span class='anglebracket'>&gt;</span><span class='operator'>&amp;</span> st<span class='parenthesis'>)</span>;
    zoned_time<span class='parenthesis'>(</span>string_view name, <span class='keyword'>const</span> sys_time<span class='anglebracket'>&lt;</span>Duration<span class='anglebracket'>&gt;</span><span class='operator'>&amp;</span> st<span class='parenthesis'>)</span>;

    zoned_time<span class='parenthesis'>(</span>TimeZonePtr z,    <span class='keyword'>const</span> local_time<span class='anglebracket'>&lt;</span>Duration<span class='anglebracket'>&gt;</span><span class='operator'>&amp;</span> tp<span class='parenthesis'>)</span>;
    zoned_time<span class='parenthesis'>(</span>string_view name, <span class='keyword'>const</span> local_time<span class='anglebracket'>&lt;</span>Duration<span class='anglebracket'>&gt;</span><span class='operator'>&amp;</span> tp<span class='parenthesis'>)</span>;
    zoned_time<span class='parenthesis'>(</span>TimeZonePtr z,    <span class='keyword'>const</span> local_time<span class='anglebracket'>&lt;</span>Duration<span class='anglebracket'>&gt;</span><span class='operator'>&amp;</span> tp, choose c<span class='parenthesis'>)</span>;
    zoned_time<span class='parenthesis'>(</span>string_view name, <span class='keyword'>const</span> local_time<span class='anglebracket'>&lt;</span>Duration<span class='anglebracket'>&gt;</span><span class='operator'>&amp;</span> tp, choose c<span class='parenthesis'>)</span>;

    <span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>class</span> Duration2, <span class='keyword'>class</span> TimeZonePtr2<span class='anglebracket'>&gt;</span>
      zoned_time<span class='parenthesis'>(</span>TimeZonePtr z, <span class='keyword'>const</span> zoned_time<span class='anglebracket'>&lt;</span>Duration2, TimeZonePtr2<span class='anglebracket'>&gt;</span><span class='operator'>&amp;</span> zt<span class='parenthesis'>)</span>;
    <span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>class</span> Duration2, <span class='keyword'>class</span> TimeZonePtr2<span class='anglebracket'>&gt;</span>
      zoned_time<span class='parenthesis'>(</span>TimeZonePtr z, <span class='keyword'>const</span> zoned_time<span class='anglebracket'>&lt;</span>Duration2, TimeZonePtr2<span class='anglebracket'>&gt;</span><span class='operator'>&amp;</span> zt, choose<span class='parenthesis'>)</span>;

    zoned_time<span class='parenthesis'>(</span>string_view name, <span class='keyword'>const</span> zoned_time<span class='anglebracket'>&lt;</span>Duration<span class='anglebracket'>&gt;</span><span class='operator'>&amp;</span> zt<span class='parenthesis'>)</span>;
    zoned_time<span class='parenthesis'>(</span>string_view name, <span class='keyword'>const</span> zoned_time<span class='anglebracket'>&lt;</span>Duration<span class='anglebracket'>&gt;</span><span class='operator'>&amp;</span> zt, choose<span class='parenthesis'>)</span>;

    zoned_time<span class='operator'>&amp;</span> <span class='keyword'>operator</span><span class='operator'>=</span><span class='parenthesis'>(</span><span class='keyword'>const</span> sys_time<span class='anglebracket'>&lt;</span>Duration<span class='anglebracket'>&gt;</span><span class='operator'>&amp;</span> st<span class='parenthesis'>)</span>;
    zoned_time<span class='operator'>&amp;</span> <span class='keyword'>operator</span><span class='operator'>=</span><span class='parenthesis'>(</span><span class='keyword'>const</span> local_time<span class='anglebracket'>&lt;</span>Duration<span class='anglebracket'>&gt;</span><span class='operator'>&amp;</span> ut<span class='parenthesis'>)</span>;

    <span class='keyword'>operator</span> sys_time<span class='anglebracket'>&lt;</span>duration<span class='anglebracket'>&gt;</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span>;
    <span class='keyword'>explicit</span> <span class='keyword'>operator</span> local_time<span class='anglebracket'>&lt;</span>duration<span class='anglebracket'>&gt;</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span>;

    TimeZonePtr          get_time_zone<span class='parenthesis'>(</span><span class='parenthesis'>)</span>  <span class='keyword'>const</span>;
    local_time<span class='anglebracket'>&lt;</span>duration<span class='anglebracket'>&gt;</span> get_local_time<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span>;
    sys_time<span class='anglebracket'>&lt;</span>duration<span class='anglebracket'>&gt;</span>   get_sys_time<span class='parenthesis'>(</span><span class='parenthesis'>)</span>   <span class='keyword'>const</span>;
    sys_info             get_info<span class='parenthesis'>(</span><span class='parenthesis'>)</span>       <span class='keyword'>const</span>;
  <span class='curlybracket'>}</span>;

  zoned_time<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='operator'>-</span><span class='anglebracket'>&gt;</span> zoned_time<span class='anglebracket'>&lt;</span>seconds<span class='anglebracket'>&gt;</span>;

  <span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>class</span> Duration<span class='anglebracket'>&gt;</span>
    zoned_time<span class='parenthesis'>(</span>sys_time<span class='anglebracket'>&lt;</span>Duration<span class='anglebracket'>&gt;</span><span class='parenthesis'>)</span>
      <span class='operator'>-</span><span class='anglebracket'>&gt;</span> zoned_time<span class='anglebracket'>&lt;</span>common_type_t<span class='anglebracket'>&lt;</span>Duration, seconds<span class='anglebracket'>&gt;</span><span class='anglebracket'>&gt;</span>;

  <span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>class</span> TimeZonePtr, <span class='keyword'>class</span> Duration<span class='anglebracket'>&gt;</span>
    zoned_time<span class='parenthesis'>(</span>TimeZonePtr, sys_time<span class='anglebracket'>&lt;</span>Duration<span class='anglebracket'>&gt;</span><span class='parenthesis'>)</span>
      <span class='operator'>-</span><span class='anglebracket'>&gt;</span> zoned_time<span class='anglebracket'>&lt;</span>common_type_t<span class='anglebracket'>&lt;</span>Duration, seconds<span class='anglebracket'>&gt;</span>, TimeZonePtr<span class='anglebracket'>&gt;</span>;

  <span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>class</span> TimeZonePtr, <span class='keyword'>class</span> Duration<span class='anglebracket'>&gt;</span>
    zoned_time<span class='parenthesis'>(</span>TimeZonePtr, local_time<span class='anglebracket'>&lt;</span>Duration<span class='anglebracket'>&gt;</span>, choose <span class='operator'>=</span> choose<span class='operator'>:</span><span class='operator'>:</span>earliest<span class='parenthesis'>)</span>
      <span class='operator'>-</span><span class='anglebracket'>&gt;</span> zoned_time<span class='anglebracket'>&lt;</span>common_type_t<span class='anglebracket'>&lt;</span>Duration, seconds<span class='anglebracket'>&gt;</span>, TimeZonePtr<span class='anglebracket'>&gt;</span>;

  <span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>class</span> TimeZonePtr, <span class='keyword'>class</span> Duration<span class='anglebracket'>&gt;</span>
    zoned_time<span class='parenthesis'>(</span>TimeZonePtr, zoned_time<span class='anglebracket'>&lt;</span>Duration<span class='anglebracket'>&gt;</span>, choose <span class='operator'>=</span> choose<span class='operator'>:</span><span class='operator'>:</span>earliest<span class='parenthesis'>)</span>
      <span class='operator'>-</span><span class='anglebracket'>&gt;</span> zoned_time<span class='anglebracket'>&lt;</span>common_type_t<span class='anglebracket'>&lt;</span>Duration, seconds<span class='anglebracket'>&gt;</span>, TimeZonePtr<span class='anglebracket'>&gt;</span>;

  zoned_time<span class='parenthesis'>(</span>string_view<span class='parenthesis'>)</span> <span class='operator'>-</span><span class='anglebracket'>&gt;</span> zoned_time<span class='anglebracket'>&lt;</span>seconds<span class='anglebracket'>&gt;</span>;

  <span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>class</span> Duration<span class='anglebracket'>&gt;</span>
    zoned_time<span class='parenthesis'>(</span>string_view, sys_time<span class='anglebracket'>&lt;</span>Duration<span class='anglebracket'>&gt;</span><span class='parenthesis'>)</span>
      <span class='operator'>-</span><span class='anglebracket'>&gt;</span> zoned_time<span class='anglebracket'>&lt;</span>common_type_t<span class='anglebracket'>&lt;</span>Duration, seconds<span class='anglebracket'>&gt;</span><span class='anglebracket'>&gt;</span>;

  <span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>class</span> Duration<span class='anglebracket'>&gt;</span>
    zoned_time<span class='parenthesis'>(</span>string_view, local_time<span class='anglebracket'>&lt;</span>Duration<span class='anglebracket'>&gt;</span>, choose <span class='operator'>=</span> choose<span class='operator'>:</span><span class='operator'>:</span>earliest<span class='parenthesis'>)</span>
      <span class='operator'>-</span><span class='anglebracket'>&gt;</span> zoned_time<span class='anglebracket'>&lt;</span>common_type_t<span class='anglebracket'>&lt;</span>Duration, seconds<span class='anglebracket'>&gt;</span><span class='anglebracket'>&gt;</span>;

  <span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>class</span> Duration, <span class='keyword'>class</span> TimeZonePtr, <span class='keyword'>class</span> TimeZonePtr2<span class='anglebracket'>&gt;</span>
    zoned_time<span class='parenthesis'>(</span>TimeZonePtr, zoned_time<span class='anglebracket'>&lt;</span>Duration, TimeZonePtr2<span class='anglebracket'>&gt;</span>, choose <span class='operator'>=</span> choose<span class='operator'>:</span><span class='operator'>:</span>earliest<span class='parenthesis'>)</span>
      <span class='operator'>-</span><span class='anglebracket'>&gt;</span> zoned_time<span class='anglebracket'>&lt;</span>Duration, TimeZonePtr<span class='anglebracket'>&gt;</span>;
<span class='curlybracket'>}</span>
</pre><div class='para' id='1'><div class='marginalizedparent'><a class='marginalized' href='#1'>1</a></div><div class='sourceLinkParent'><a class='sourceLink' href='https://github.com/Eelis/draft73ca144c7e48612fe72742f9f6a5ec9ad6a934d2/source/time.tex#L9708'>#</a></div><div id='1.sentence-1' class='sentence'><span class='texttt'>zoned_&shy;time</span> represents a logical pairing of
a <span class='texttt'>time_&shy;zone</span> and a <span class='texttt'>time_&shy;point</span> with precision <span class='texttt'>Duration</span><a class='hidden_link' href='#1.sentence-1'>.</a></div> <div id='1.sentence-2' class='sentence'><span class='texttt'>zoned_&shy;time<span class='anglebracket'>&lt;</span>Duration<span class='anglebracket'>&gt;</span></span> maintains the invariant that
it always refers to a valid time zone and
represents a point in time that exists and is not ambiguous
in that time zone<a class='hidden_link' href='#1.sentence-2'>.</a></div></div><div class='para' id='2'><div class='marginalizedparent'><a class='marginalized' href='#2'>2</a></div><div class='sourceLinkParent'><a class='sourceLink' href='https://github.com/Eelis/draft73ca144c7e48612fe72742f9f6a5ec9ad6a934d2/source/time.tex#L9716'>#</a></div><div id='2.sentence-1' class='sentence'>If <span class='texttt'>Duration</span> is not a specialization of <span class='texttt'>chrono<span class='operator'>:</span><span class='operator'>:</span>duration</span>,
the program is ill-formed<a class='hidden_link' href='#2.sentence-1'>.</a></div></div></div></body></html>