Template zoned_time on TimeZonePtr

This commit is contained in:
Howard Hinnant
2017-08-12 22:32:35 -04:00
parent 4ef96efa94
commit 28fa15c0ae

View File

@@ -59,6 +59,7 @@ Document number: D0355R4<br>
<h3>Changes since <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0355r3.html">R3</a></h3>
<ul>
<li>Template <code>zoned_time</code> on <code>TimeZonePtr</code>.</li>
<li>Give <code>weekday_indexed</code> a defaulted default constructor.</li>
<li>Make <code>from_stream</code> and <code>to_stream</code> customization points.</li>
<li>Make the database singleton a singly linked list of <code>tzdb</code> with
@@ -794,6 +795,7 @@ which is equal to <code>nullptr</code>.
<a href="#time.timezone.exception">[time.timezone.exception]</a>
<a href="#time.timezone.info">[time.timezone.info]</a>
<a href="#time.timezone.time_zone">[time.timezone.time_zone]</a>
<a href="#time.timezone.zoned_traits">[time.timezone.zoned_traits]</a>
<a href="#time.timezone.zoned_time">[time.timezone.zoned_time]</a>
<a href="#time.timezone.leap">[time.timezone.leap]</a>
<a href="#time.timezone.link">[time.timezone.link]</a>
@@ -1450,25 +1452,29 @@ bool operator&lt;=(const time_zone&amp; x, const time_zone&amp; y) noexcept;
bool operator&gt;=(const time_zone&amp; x, const time_zone&amp; y) noexcept;
// zoned_time
template &lt;class Duration&gt; class zoned_time;
template &lt;class Duration, class TimeZonePtr = const time_zone*&gt; class zoned_time;
using zoned_seconds = zoned_time&lt;seconds&gt;;
template &lt;class Duration1, class Duration2&gt;
template &lt;class Duration1, class Duration2, class TimeZonePtr&gt;
bool
operator==(const zoned_time&lt;Duration1&gt;&amp; x, const zoned_time&lt;Duration2&gt;&amp; y);
operator==(const zoned_time&lt;Duration1, TimeZonePtr&gt;&amp; x,
const zoned_time&lt;Duration2, TimeZonePtr&gt;&amp; y);
template &lt;class Duration1, class Duration2&gt;
template &lt;class Duration1, class Duration, class TimeZonePtr2&gt;
bool
operator!=(const zoned_time&lt;Duration1&gt;&amp; x, const zoned_time&lt;Duration2&gt;&amp; y);
operator!=(const zoned_time&lt;Duration1, TimeZonePtr&gt;&amp; x,
const zoned_time&lt;Duration2, TimeZonePtr&gt;&amp; y);
template &lt;class charT, class traits, class Duration&gt;
template &lt;class charT, class traits, class Duration, class TimeZonePtr&gt;
basic_ostream&lt;charT, traits&gt;&amp;
operator&lt;&lt;(basic_ostream&lt;charT, traits&gt;&amp; os, const zoned_time&lt;Duration&gt;& t);
operator&lt;&lt;(basic_ostream&lt;charT, traits&gt;&amp; os,
const zoned_time&lt;Duration, TimeZonePtr&gt;& t);
template &lt;class charT, class traits, class Duration&gt;
template &lt;class charT, class traits, class Duration, class TimeZonePtr&gt;
basic_ostream&lt;charT, traits&gt;&amp;
to_stream(basic_ostream&lt;charT, traits&gt;&amp; os, const charT* fmt, const zoned_time&lt;Duration&gt;&amp; tp);
to_stream(basic_ostream&lt;charT, traits&gt;&amp; os, const charT* fmt,
const zoned_time&lt;Duration, TimeZonePtr&gt;&amp; tp);
// format
@@ -9784,7 +9790,46 @@ bool operator&gt;=(const time_zone&amp; x, const time_zone&amp; y) noexcept;
</p>
</blockquote>
<a name="time.timezone.zoned_time"></a><h3>23.17.12.5 Class <code>zoned_time</code> [time.timezone.zoned_time]</h3>
<a name="time.timezone.zoned_traits"></a><h3>23.17.12.5 Class <code>zoned_traits</code> [time.timezone.zoned_traits]</h3>
<p>
<code>zoned_traits</code> provides a means for customizing the behavior of
<code>zoned_time&lt;Duration, TimeZonePtr</code> for the
<code>zoned_time</code> default constructor, and constructors taking
<code>string_view</code>. A specialization for <code>const time_zone*</code>
is provided by the implementation.
</p>
<pre>
template &lt;class T&gt; struct zoned_traits {};
template &lt;&gt;
struct zoned_traits&lt;const time_zone*&gt;
{
static const time_zone* default_zone();
static const time_zone* locate_zone(string_view name);
};
</pre>
<pre>
static const time_zone* zoned_traits&lt;const time_zone*&gt;::default_zone();
</pre>
<blockquote>
<p>
<i>Returns:</i> <code>date::locate_zone("UTC")</code>.
</p>
</blockquote>
<pre>
static const time_zone* zoned_traits&lt;const time_zone*&gt;::locate_zone(string_view name);
</pre>
<blockquote>
<p>
<i>Returns:</i> <code>date::locate_zone(name)</code>.
</p>
</blockquote>
<a name="time.timezone.zoned_time"></a><h3>23.17.12.6 Class <code>zoned_time</code> [time.timezone.zoned_time]</h3>
<p>
<code>zoned_time</code> represents a logical paring of <code>time_zone</code> and a
@@ -9792,14 +9837,14 @@ bool operator&gt;=(const time_zone&amp; x, const time_zone&amp; y) noexcept;
</p>
<pre>
template &lt;class Duration&gt;
template &lt;class Duration, class TimeZonePtr = const time_zone*&gt;
class zoned_time
{
public:
using duration = common_type_t&lt;Duration, seconds&gt;;
private:
const time_zone* zone_; // exposition only
TimeZonePtr zone_; // exposition only
sys_time&lt;duration&gt; tp_; // exposition only
public:
@@ -9808,67 +9853,85 @@ public:
zoned_time&amp; operator=(const zoned_time&amp;) = default;
zoned_time(const sys_time&lt;Duration&gt;&amp; st);
explicit zoned_time(const time_zone* z);
explicit zoned_time(TimeZonePtr z);
explicit zoned_time(string_view name);
template &lt;class Duration2&gt;
zoned_time(const zoned_time&lt;Duration2&gt;&amp; zt) noexcept;
zoned_time(const time_zone* z, const local_time&lt;Duration&gt;&amp; tp);
zoned_time(TimeZonePtr z, const sys_time&lt;Duration&gt;&amp; st);
zoned_time(string_view name, const sys_time&lt;Duration&gt;&amp; st);
zoned_time(TimeZonePtr z, const local_time&lt;Duration&gt;&amp; tp);
zoned_time(string_view name, const local_time&lt;Duration&gt;&amp; tp);
zoned_time(const time_zone* z, const local_time&lt;Duration&gt;&amp; tp, choose c);
zoned_time(TimeZonePtr z, const local_time&lt;Duration&gt;&amp; tp, choose c);
zoned_time(string_view name, const local_time&lt;Duration&gt;&amp; tp, choose c);
zoned_time(const time_zone* z, const zoned_time&lt;Duration&gt;&amp; zt);
zoned_time(TimeZonePtr z, const zoned_time&lt;Duration&gt;&amp; zt);
zoned_time(string_view name, const zoned_time&lt;Duration&gt;&amp; zt);
zoned_time(const time_zone* z, const zoned_time&lt;Duration&gt;&amp; zt, choose);
zoned_time(TimeZonePtr z, const zoned_time&lt;Duration&gt;&amp; zt, choose);
zoned_time(string_view name, const zoned_time&lt;Duration&gt;&amp; zt, choose);
zoned_time(const time_zone* z, const sys_time&lt;Duration&gt;&amp; st);
zoned_time(string_view name, const sys_time&lt;Duration&gt;&amp; st);
zoned_time&amp; operator=(const sys_time&lt;Duration&gt;&amp; st);
zoned_time&amp; operator=(const local_time&lt;Duration&gt;&amp; ut);
operator sys_time&lt;duration&gt;() const;
explicit operator local_time&lt;duration&gt;() const;
const time_zone* get_time_zone() const;
TimeZonePtr get_time_zone() const;
local_time&lt;duration&gt; get_local_time() const;
sys_time&lt;duration&gt; get_sys_time() const;
sys_info get_info() const;
};
template &lt;class Duration1, class Duration2&gt;
template &lt;class Duration1, class Duration2, class TimeZonePtr&gt;
bool
operator==(const zoned_time&lt;Duration1&gt;&amp; x, const zoned_time&lt;Duration2&gt;&amp; y);
operator==(const zoned_time&lt;Duration1, TimeZonePtr&gt;&amp; x,
const zoned_time&lt;Duration2, TimeZonePtr&gt;&amp; y);
template &lt;class Duration1, class Duration2&gt;
template &lt;class Duration1, class Duration2, class TimeZonePtr&gt;
bool
operator!=(const zoned_time&lt;Duration1&gt;&amp; x, const zoned_time&lt;Duration2&gt;&amp; y);
operator!=(const zoned_time&lt;Duration1, TimeZonePtr&gt;&amp; x,
const zoned_time&lt;Duration2, TimeZonePtr&gt;&amp; y);
template &lt;class charT, class traits, class Duration&gt;
template &lt;class charT, class traits, class Duration, class TimeZonePtr&gt;
basic_ostream&lt;charT, traits&gt;&amp;
operator&lt;&lt;(basic_ostream&lt;charT, traits&gt;&amp; os, const zoned_time&lt;Duration&gt;& t);
operator&lt;&lt;(basic_ostream&lt;charT, traits&gt;&amp; os,
const zoned_time&lt;Duration, TimeZonePtr&gt;& t);
template &lt;class charT, class traits, class Duration&gt;
template &lt;class charT, class traits, class Duration, class TimeZonePtr&gt;
basic_ostream&lt;charT, traits&gt;&amp;
to_stream(basic_ostream&lt;charT, traits&gt;&amp; os, const charT* fmt, const zoned_time&lt;Duration&gt;&amp; tp);
to_stream(basic_ostream&lt;charT, traits&gt;&amp; os, const charT* fmt,
const zoned_time&lt;Duration, TimeZonePtr&gt;&amp; tp);
zoned_time()
-&gt; zoned_time&lt;seconds&gt;;
template &lt;class Duration&gt;
zoned_time(sys_time&lt;Duration&gt;)
-&gt; zoned_time&lt;common_type_t&lt;Duration, seconds&gt;&gt;;
template &lt;class Zone, class Duration&gt;
zoned_time(Zone, sys_time&lt;Duration&gt;)
template &lt;class TimeZonePtr, class Duration&gt;
zoned_time(TimeZonePtr, sys_time&lt;Duration&gt;)
-&gt; zoned_time&lt;common_type_t&lt;Duration, seconds&gt;, TimeZonePtr&gt;;
template &lt;class TimeZonePtr, class Duration&gt;
zoned_time(TimeZonePtr, local_time&lt;Duration&gt;, choose = choose::earliest)
-&gt; zoned_time&lt;common_type_t&lt;Duration, seconds&gt;, TimeZonePtr&gt;;
template &lt;class TimeZonePtr, class Duration&gt;
zoned_time(TimeZonePtr, zoned_time&lt;Duration&gt;, choose = choose::earliest)
-&gt; zoned_time&lt;common_type_t&lt;Duration, seconds&gt;, TimeZonePtr&gt;;
zoned_time(string_view)
-&gt; zoned_time&lt;seconds&gt;;
template &lt;class Duration&gt;
zoned_time(string_view, sys_time&lt;Duration&gt;)
-&gt; zoned_time&lt;common_type_t&lt;Duration, seconds&gt;&gt;;
template &lt;class Zone, class Duration&gt;
zoned_time(Zone, local_time&lt;Duration&gt;, choose = choose::earliest)
-&gt; zoned_time&lt;common_type_t&lt;Duration, seconds&gt;&gt;;
template &lt;class Zone, class Duration&gt;
zoned_time(Zone, zoned_time&lt;Duration&gt;, choose = choose::earliest)
template &lt;class Duration&gt;
zoned_time(string_view, local_time&lt;Duration&gt;, choose = choose::earliest)
-&gt; zoned_time&lt;common_type_t&lt;Duration, seconds&gt;&gt;;
</pre>
@@ -9879,19 +9942,23 @@ and is not ambiguous.
</p>
<pre>
zoned_time&lt;Duration&gt;::zoned_time();
zoned_time&lt;Duration, TimeZonePtr&gt;::zoned_time();
</pre>
<blockquote>
<p>
<i>Effects:</i> Constructs a <code>zoned_time</code> <code>zt</code> such that
<code>zt.get_time_zone()-&gt;name() == "UTC"</code>, and
<code>zt.get_sys_time() == sys_seconds{}</code>.
<i>Remarks:</i> This constructor does not participate in overload resolution unless
the expression <code>zoned_traits&lt;TimeZonePtr&gt;::default_zone()</code> is well formed.
</p>
<p>
<i>Effects:</i> Constructs a <code>zoned_time</code> by initializing
<code>zone_</code> with <code>zoned_traits&lt;TimeZonePtr&gt;::default_zone()</code> and
default constructing <code>tp_</code>.
</p>
</blockquote>
<pre>
zoned_time&lt;Duration&gt;::zoned_time(const zoned_time&amp;) = default;
zoned_time&lt;Duration&gt;&amp; zoned_time&lt;Duration&gt;::operator=(const zoned_time&amp;) = default;
zoned_time&lt;Duration, TimeZonePtr&gt;::zoned_time(const zoned_time&amp;) = default;
zoned_time&lt;Duration, TimeZonePtr&gt;&amp; zoned_time&lt;Duration&gt;::operator=(const zoned_time&amp;) = default;
</pre>
<blockquote>
<p>
@@ -9904,45 +9971,53 @@ members.
</blockquote>
<pre>
zoned_time&lt;Duration&gt;::zoned_time(const sys_time&lt;Duration&gt;&amp; st);
zoned_time&lt;Duration, TimeZonePtr&gt;::zoned_time(const sys_time&lt;Duration&gt;&amp; st);
</pre>
<blockquote>
<p>
<i>Effects:</i> Constructs a <code>zoned_time</code> <code>zt</code> such that
<code>zt.get_time_zone()-&gt;name() == "UTC"</code>, and
<code>zt.get_sys_time() == st</code>.
<i>Remarks:</i> This constructor does not participate in overload resolution unless
the expression <code>zoned_traits&lt;TimeZonePtr&gt;::default_zone()</code> is well formed.
</p>
<p>
<i>Effects:</i> Constructs a <code>zoned_time</code> by initializing
<code>zone_</code> with <code>zoned_traits&lt;TimeZonePtr&gt;::default_zone()</code> and
<code>tp_</code> with <code>st</code>.
</p>
</blockquote>
<pre>
explicit zoned_time&lt;Duration&gt;::zoned_time(const time_zone* z);
explicit zoned_time&lt;Duration, TimeZonePtr&gt;::zoned_time(TimeZonePtr z);
</pre>
<blockquote>
<p>
<i>Requires:</i> <code>z</code> refers to a valid <code>time_zone</code>.
</p>
<p>
<i>Effects:</i> Constructs a <code>zoned_time</code> <code>zt</code> such that
<code>zt.get_time_zone() == z</code>, and
<code>zt.get_sys_time() == sys_seconds{}</code>.
<i>Effects:</i> Constructs a <code>zoned_time</code> initializing <code>zone_</code>
with <code>std::move(z)</code>.
</p>
</blockquote>
<pre>
explicit zoned_time&lt;Duration&gt;::zoned_time(string_view name);
explicit zoned_time&lt;Duration, TimeZonePtr&gt;::zoned_time(string_view name);
</pre>
<blockquote>
<p>
<i>Effects:</i> Equivalent to construction with <code>locate_zone(name)</code>.
<i>Remarks:</i> This constructor does not participate in overload resolution unless
the expression <code>zoned_traits&lt;TimeZonePtr&gt;::locate_zone(string_view{})</code>
is well formed and <code>zoned_time</code> is constructible from the return type of
<code>zoned_traits&lt;TimeZonePtr&gt;::locate_zone(string_view{})</code>.
</p>
<p>
<i>Throws:</i> Any exception propagating out of <code>locate_zone(name)</code>.
<i>Effects:</i> Constructs a <code>zoned_time</code> by initializing
<code>zone_</code> with <code>zoned_traits&lt;TimeZonePtr&gt;::locate_zone(name)</code>
and default constructing <code>tp_</code>.
</p>
</blockquote>
<pre>
template &lt;class Duration2&gt;
zoned_time&lt;Duration&gt;::zoned_time(const zoned_time&lt;Duration2&gt;&amp; y) noexcept;
template &lt;class Duration2, TimeZonePtr&gt;
zoned_time&lt;Duration&gt;::zoned_time(const zoned_time&lt;Duration2, TimeZonePtr&gt;&amp; y) noexcept;
</pre>
<blockquote>
<p>
@@ -9957,87 +10032,153 @@ template &lt;class Duration2&gt;
</blockquote>
<pre>
zoned_time&lt;Duration&gt;::zoned_time(const time_zone* z, const local_time&lt;Duration&gt;&amp; tp);
zoned_time&lt;Duration, TimeZonePtr&gt;::zoned_time(TimeZonePtr z, const sys_time&lt;Duration&gt;&amp; st);
</pre>
<blockquote>
<p>
<i>Requires:</i> <code>z</code> refers to a valid <code>time_zone</code>.
</p>
<p>
<i>Effects:</i> Constructs a <code>zoned_time</code> <code>zt</code> such that
<code>zt.get_time_zone()-&gt; == z</code>, and <code>zt.get_local_time() == tp</code>.
</p>
<p>
<i>Throws:</i> Any exception that <code>z-&gt;to_sys(tp)</code> would throw.
<i>Effects:</i> Constructs a <code>zoned_time</code> by initializing <code>zone_</code>
with <code>std::move(z)</code> and <code>tp_</code> with <code>st</code>.
</p>
</blockquote>
<pre>
zoned_time&lt;Duration&gt;::zoned_time(string_view name, const local_time&lt;Duration&gt;&amp; tp);
zoned_time&lt;Duration, TimeZonePtr&gt;::zoned_time(string_view name, const sys_time&lt;Duration&gt;&amp; st);
</pre>
<blockquote>
<p>
<i>Effects:</i> Equivalent to construction with <code>{locate_zone(name), tp}</code>.
<i>Remarks:</i> This constructor does not participate in overload resolution unless
<code>zoned_time</code> is constructible from the return type of
<code>zoned_traits&lt;TimeZonePtr&gt;::locate_zone(name)</code> and <code>st</code>.
</p>
<p>
<i>Effects:</i> Equivalent to construction with <code>{zoned_traits&lt;TimeZonePtr&gt;::locate_zone(name), st}</code>.
</p>
</blockquote>
<pre>
zoned_time&lt;Duration&gt;::zoned_time(const time_zone* z, const local_time&lt;Duration&gt;&amp; tp, choose c);
zoned_time&lt;Duration, TimeZonePtr&gt;::zoned_time(TimeZonePtr z, const local_time&lt;Duration&gt;&amp; tp);
</pre>
<blockquote>
<p>
<i>Requires:</i> <code>z</code> refers to a valid <code>time_zone</code>.
</p>
<p>
<i>Effects:</i> Constructs a <code>zoned_time</code> <code>zt</code> such that
<code>zt.get_time_zone()-&gt; == z</code>, and
<code>zt.get_sys_time() == z-&gt;to_sys(tp, c)</code>.
<i>Remarks:</i> This constructor does not participate in overload resolution unless
<code>declval&lt;TimeZonePtr&amp;&gt;()-&gt;to_sys(local_time&lt;Duration&gt;{})</code>
is convertible to <code>sys_time&lt;duration&gt;</code>.
</p>
<p>
<i>Effects:</i> Constructs a <code>zoned_time</code> by initializing <code>zone_</code>
with <code>std::move(z)</code> and <code>tp_</code> with <code>zone_-&gt;to_sys(t)</code>.
</p>
</blockquote>
<pre>
zoned_time&lt;Duration&gt;::zoned_time(string_view name, const local_time&lt;Duration&gt;&amp; tp, choose c);
zoned_time&lt;Duration, TimeZonePtr&gt;::zoned_time(string_view name, const local_time&lt;Duration&gt;&amp; tp);
</pre>
<blockquote>
<p>
<i>Effects:</i> Equivalent to construction with <code>{locate_zone(name), tp, c}</code>.
<i>Remarks:</i> This constructor does not participate in overload resolution unless
<code>zoned_time</code> is constructible from the return type of
<code>zoned_traits&lt;TimeZonePtr&gt;::locate_zone(name)</code> and <code>tp</code>.
</p>
<p>
<i>Effects:</i> Equivalent to construction with <code>{zoned_traits&lt;TimeZonePtr&gt;::locate_zone(name), tp}</code>.
</p>
</blockquote>
<pre>
zoned_time&lt;Duration&gt;::zoned_time(const time_zone* z, const zoned_time&lt;Duration&gt;&amp; y);
zoned_time&lt;Duration, TimeZonePtr&gt;::zoned_time(TimeZonePtr z, const local_time&lt;Duration&gt;&amp; tp, choose c);
</pre>
<blockquote>
<p>
<i>Requires:</i> <code>z</code> refers to a valid <code>time_zone</code>.
</p>
<p>
<i>Effects:</i> Constructs a <code>zoned_time</code> <code>zt</code> such that
<code>zt.get_time_zone()-&gt; == z</code>, and
<code>zt.get_sys_time() == y.get_sys_time()</code>.
<i>Remarks:</i> This constructor does not participate in overload resolution unless
<code>decltype(declval&lt;TimeZonePtr&amp;&gt;()-&gt;to_sys(local_time&lt;Duration&gt;{}, choose::earliest))</code>
is convertible to <code>sys_time&lt;duration&gt;</code>.
</p>
<p>
<i>Effects:</i> Constructs a <code>zoned_time</code> by initializing <code>zone_</code>
with <code>std::move(z)</code> and <code>tp_</code> with <code>zone_-&gt;to_sys(t, c)</code>.
</p>
</blockquote>
<pre>
zoned_time&lt;Duration&gt;::zoned_time(string_view name, const zoned_time&lt;Duration&gt;&amp; y);
zoned_time&lt;Duration, TimeZonePtr&gt;::zoned_time(string_view name, const local_time&lt;Duration&gt;&amp; tp, choose c);
</pre>
<blockquote>
<p>
<i>Effects:</i> Equivalent to construction with <code>{locate_zone(name), y}</code>.
<i>Remarks:</i> This constructor does not participate in overload resolution unless
<code>zoned_time</code> is constructible from the return type of
<code>zoned_traits&lt;TimeZonePtr&gt;::locate_zone(name)</code>,
<code>local_time&lt;Duration&gt;</code> and <code>choose</code>.
</p>
<p>
<i>Effects:</i> Equivalent to construction with
<code>{zoned_traits&lt;TimeZonePtr&gt;::locate_zone(name), tp, c}</code>.
</p>
</blockquote>
<pre>
zoned_time&lt;Duration&gt;::zoned_time(const time_zone* z, const zoned_time&lt;Duration&gt;&amp; y, choose);
zoned_time&lt;Duration, TimeZonePtr&gt;::zoned_time(TimeZonePtr z, const zoned_time&lt;Duration&gt;&amp; y);
</pre>
<blockquote>
<p>
<i>Requires:</i> <code>z</code> refers to a valid <code>time_zone</code>.
</p>
<p>
<i>Effects:</i> Constructs a <code>zoned_time</code> <code>zt</code> such that
<code>zt.get_time_zone()-&gt; == z</code>, and
<code>zt.get_sys_time() == y.get_sys_time()</code>.
<i>Effects:</i> Constructs a <code>zoned_time</code> by initializing <code>zone_</code>
with <code>std::move(z)</code> and <code>tp_</code> with <code>z.tp_</code>.
</p>
</blockquote>
<pre>
zoned_time&lt;Duration, TimeZonePtr&gt;::zoned_time(string_view name, const zoned_time&lt;Duration&gt;&amp; y);
</pre>
<blockquote>
<p>
<i>Remarks:</i> This constructor does not participate in overload resolution unless
<code>zoned_time</code> is constructible from the return type of
<code>zoned_traits&lt;TimeZonePtr&gt;::locate_zone(name)</code>
and <code>zoned_time</code>.
</p>
<p>
<i>Effects:</i> Equivalent to construction with
<code>{zoned_traits&lt;TimeZonePtr&gt;::locate_zone(name), y}</code>.
</p>
</blockquote>
<pre>
zoned_time&lt;Duration, TimeZonePtr&gt;::zoned_time(TimeZonePtr z, const zoned_time&lt;Duration&gt;&amp; y, choose);
</pre>
<blockquote>
<p>
<i>Requires:</i> <code>z</code> refers to a valid <code>time_zone</code>.
</p>
<p>
<i>Effects:</i> Equivalent to construction with <code>{z, y}</code>.
</p>
<i>Note:</i> The <code>choose</code> parameter is allowed here, but has no impact.
</p>
</blockquote>
<pre>
zoned_time&lt;Duration, TimeZonePtr&gt;::zoned_time(string_view name, const zoned_time&lt;Duration&gt;&amp; y, choose c);
</pre>
<blockquote>
<p>
<i>Remarks:</i> This constructor does not participate in overload resolution unless
<code>zoned_time</code> is constructible from the return type of
<code>zoned_traits&lt;TimeZonePtr&gt;::locate_zone(name)</code>, <code>zoned_time</code>,
and <code>choose</code>.
</p>
<p>
<i>Effects:</i> Equivalent to construction with <code>{locate_zone(name), y, c}</code>.
</p>
<p>
<i>Note:</i> The <code>choose</code> parameter is allowed here, but has no impact.
@@ -10045,41 +10186,7 @@ zoned_time&lt;Duration&gt;::zoned_time(const time_zone* z, const zoned_time&lt;D
</blockquote>
<pre>
zoned_time&lt;Duration&gt;::zoned_time(string_view name, const zoned_time&lt;Duration&gt;&amp; y, choose);
</pre>
<blockquote>
<p>
<i>Effects:</i> Equivalent to construction with <code>{locate_zone(name), y}</code>.
</p>
<p>
<i>Note:</i> The <code>choose</code> parameter is allowed here, but has no impact.
</p>
</blockquote>
<pre>
zoned_time&lt;Duration&gt;::zoned_time(const time_zone* z, const sys_time&lt;Duration&gt;&amp; st);
</pre>
<blockquote>
<p>
<i>Requires:</i> <code>z</code> refers to a valid <code>time_zone</code>.
</p>
<p>
<i>Effects:</i> Constructs a <code>zoned_time</code> <code>zt</code> such that
<code>zt.get_time_zone()-&gt; == z</code>, and <code>zt.get_sys_time() == st</code>.
</p>
</blockquote>
<pre>
zoned_time&lt;Duration&gt;::zoned_time(string_view name, const sys_time&lt;Duration&gt;&amp; st);
</pre>
<blockquote>
<p>
<i>Effects:</i> Equivalent to construction with <code>{locate_zone(name), st}</code>.
</p>
</blockquote>
<pre>
zoned_time&lt;Duration&gt;&amp; zoned_time&lt;Duration&gt;::operator=(const sys_time&lt;Duration&gt;&amp; st);
zoned_time&lt;Duration, TimeZonePtr&gt;&amp; zoned_time&lt;Duration, TimeZonePtr&gt;::operator=(const sys_time&lt;Duration&gt;&amp; st);
</pre>
<blockquote>
<p>
@@ -10092,7 +10199,7 @@ no effect on the return value of <code>get_time_zone()</code>.
</blockquote>
<pre>
zoned_time&lt;Duration&gt;&amp; zoned_time&lt;Duration&gt;::operator=(const local_time&lt;Duration&gt;&amp; lt);
zoned_time&lt;Duration, TimeZonePtr&gt;&amp; zoned_time&lt;Duration, TimeZonePtr&gt;::operator=(const local_time&lt;Duration&gt;&amp; lt);
</pre>
<blockquote>
<p>
@@ -10105,7 +10212,7 @@ no effect on the return value of <code>get_time_zone()</code>.
</blockquote>
<pre>
zoned_time&lt;Duration&gt;::operator sys_time&lt;duration&gt;() const;
zoned_time&lt;Duration, TimeZonePtr&gt;::operator sys_time&lt;duration&gt;() const;
</pre>
<blockquote>
<p>
@@ -10114,7 +10221,7 @@ zoned_time&lt;Duration&gt;::operator sys_time&lt;duration&gt;() const;
</blockquote>
<pre>
explicit zoned_time&lt;Duration&gt;::operator local_time&lt;duration&gt;() const;
explicit zoned_time&lt;Duration, TimeZonePtr&gt;::operator local_time&lt;duration&gt;() const;
</pre>
<blockquote>
<p>
@@ -10123,7 +10230,7 @@ explicit zoned_time&lt;Duration&gt;::operator local_time&lt;duration&gt;() const
</blockquote>
<pre>
const time_zone* zoned_time&lt;Duration&gt;::get_time_zone() const;
TimeZonePtr zoned_time&lt;Duration, TimeZonePtr&gt;::get_time_zone() const;
</pre>
<blockquote>
<p>
@@ -10132,7 +10239,7 @@ const time_zone* zoned_time&lt;Duration&gt;::get_time_zone() const;
</blockquote>
<pre>
local_time&lt;typename zoned_time&lt;Duration&gt;::duration&gt; zoned_time&lt;Duration&gt;::get_local_time() const;
local_time&lt;typename zoned_time&lt;Duration, TimeZonePtr&gt;::duration&gt; zoned_time&lt;Duration, TimeZonePtr&gt;::get_local_time() const;
</pre>
<blockquote>
<p>
@@ -10141,7 +10248,7 @@ local_time&lt;typename zoned_time&lt;Duration&gt;::duration&gt; zoned_time&lt;Du
</blockquote>
<pre>
sys_time&lt;typename zoned_time&lt;Duration&gt;::duration&gt; zoned_time&lt;Duration&gt;::get_sys_time() const;
sys_time&lt;typename zoned_time&lt;Duration, TimeZonePtr&gt;::duration&gt; zoned_time&lt;Duration, TimeZonePtr&gt;::get_sys_time() const;
</pre>
<blockquote>
<p>
@@ -10150,7 +10257,7 @@ sys_time&lt;typename zoned_time&lt;Duration&gt;::duration&gt; zoned_time&lt;Dura
</blockquote>
<pre>
sys_info zoned_time&lt;Duration&gt;::get_info() const;
sys_info zoned_time&lt;Duration, TimeZonePtr&gt;::get_info() const;
</pre>
<blockquote>
<p>
@@ -10159,9 +10266,10 @@ sys_info zoned_time&lt;Duration&gt;::get_info() const;
</blockquote>
<pre>
template &lt;class Duration1, class Duration2&gt;
template &lt;class Duration1, class Duration2, class TimeZonePtr&gt;
bool
operator==(const zoned_time&lt;Duration1&gt;&amp; x, const zoned_time&lt;Duration2&gt;&amp; y);
operator==(const zoned_time&lt;Duration1, TimeZonePtr&gt;&amp; x,
const zoned_time&lt;Duration2, TimeZonePtr&gt;&amp; y);
</pre>
<blockquote>
<p>
@@ -10170,9 +10278,10 @@ operator==(const zoned_time&lt;Duration1&gt;&amp; x, const zoned_time&lt;Duratio
</blockquote>
<pre>
template &lt;class Duration1, class Duration2&gt;
template &lt;class Duration1, class Duration2, class TimeZonePtr&gt;
bool
operator!=(const zoned_time&lt;Duration1&gt;&amp; x, const zoned_time&lt;Duration2&gt;&amp; y);
operator!=(const zoned_time&lt;Duration1, TimeZonePtr&gt;&amp; x,
const zoned_time&lt;Duration2, TimeZonePtr&gt;&amp; y);
</pre>
<blockquote>
<p>
@@ -10181,9 +10290,10 @@ operator!=(const zoned_time&lt;Duration1&gt;&amp; x, const zoned_time&lt;Duratio
</blockquote>
<pre>
template &lt;class charT, class traits, class Duration&gt;
template &lt;class charT, class traits, class Duration, class TimeZonePtr&gt;
basic_ostream&lt;charT, traits&gt;&
operator&lt;&lt;(basic_ostream&lt;charT, traits&gt;& os, const zoned_time&lt;Duration&gt;&amp; t)
operator&lt;&lt;(basic_ostream&lt;charT, traits&gt;& os,
const zoned_time&lt;Duration, TimeZonePtr&gt;&amp; t)
</pre>
<blockquote>
<p>
@@ -10196,9 +10306,10 @@ and the value returned from <code>t.get_local_time()</code>.
</blockquote>
<pre>
template &lt;class charT, class traits, class Duration&gt;
template &lt;class charT, class traits, class Duration, class TimeZonePtr&gt;
basic_ostream&lt;charT, traits&gt;&amp;
to_stream(basic_ostream&lt;charT, traits&gt;&amp; os, const charT* fmt, const zoned_time&lt;Duration&gt;&amp; tp);
to_stream(basic_ostream&lt;charT, traits&gt;&amp; os, const charT* fmt,
const zoned_time&lt;Duration, TimeZonePtr&gt;&amp; tp);
</pre>
<blockquote>
@@ -10218,12 +10329,12 @@ which for exposition purposes will be referred to as <code>info</code>. Then ca
</blockquote>
<p class = note>
Add a new section 23.17.12.10 leap [time.timezone.leap]:
Add a new section 23.17.12.7 leap [time.timezone.leap]:
</p>
<blockquote>
<a name="time.timezone.leap"></a><h3>23.17.12.10 class <code>leap</code> [time.timezone.leap]</h3>
<a name="time.timezone.leap"></a><h3>23.17.12.7 class <code>leap</code> [time.timezone.leap]</h3>
<pre>
@@ -10494,12 +10605,12 @@ template &lt;class Duration&gt; bool operator&gt;=(const sys_time&lt;Duration&gt
</blockquote>
<p class = note>
Add a new section 23.17.12.11 link [time.timezone.link]:
Add a new section 23.17.12.8 link [time.timezone.link]:
</p>
<blockquote>
<a name="time.timezone.link"></a><h3>23.17.12.11 class <code>link</code> [time.timezone.link]</h3>
<a name="time.timezone.link"></a><h3>23.17.12.8 class <code>link</code> [time.timezone.link]</h3>
<pre>
class link