<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="generator" content="pandoc">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
  <title></title>
  <style type="text/css">code{white-space: pre;}</style>
  <style type="text/css">
div.sourceCode { overflow-x: auto; }
table.sourceCode, tr.sourceCode, td.lineNumbers, td.sourceCode {
  margin: 0; padding: 0; vertical-align: baseline; border: none; }
table.sourceCode { width: 100%; line-height: 100%; }
td.lineNumbers { text-align: right; padding-right: 4px; padding-left: 4px; color: #aaaaaa; border-right: 1px solid #aaaaaa; }
td.sourceCode { padding-left: 5px; }
code > span.kw { color: #007020; font-weight: bold; } /* Keyword */
code > span.dt { color: #902000; } /* DataType */
code > span.dv { color: #40a070; } /* DecVal */
code > span.bn { color: #40a070; } /* BaseN */
code > span.fl { color: #40a070; } /* Float */
code > span.ch { color: #4070a0; } /* Char */
code > span.st { color: #4070a0; } /* String */
code > span.co { color: #60a0b0; font-style: italic; } /* Comment */
code > span.ot { color: #007020; } /* Other */
code > span.al { color: #ff0000; font-weight: bold; } /* Alert */
code > span.fu { color: #06287e; } /* Function */
code > span.er { color: #ff0000; font-weight: bold; } /* Error */
code > span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
code > span.cn { color: #880000; } /* Constant */
code > span.sc { color: #4070a0; } /* SpecialChar */
code > span.vs { color: #4070a0; } /* VerbatimString */
code > span.ss { color: #bb6688; } /* SpecialString */
code > span.im { } /* Import */
code > span.va { color: #19177c; } /* Variable */
code > span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
code > span.op { color: #666666; } /* Operator */
code > span.bu { } /* BuiltIn */
code > span.ex { } /* Extension */
code > span.pp { color: #bc7a00; } /* Preprocessor */
code > span.at { color: #7d9029; } /* Attribute */
code > span.do { color: #ba2121; font-style: italic; } /* Documentation */
code > span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
code > span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
code > span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
  </style>
  <link href="data:text/css;charset=utf-8,body%20%7B%0Apadding%2Dleft%3A%2010px%3B%0Apadding%2Dright%3A%2010%25%3B%0A%7D%0Apre%20%7B%0Abackground%2Dcolor%3A%20%23f8f8f8%3B%0Aborder%3A%201px%20solid%20darkgray%3B%0Apadding%3A%203px%3B%0A%7D%0Atable%3Afirst%2Dof%2Dtype%20thead%20%7B%0Adisplay%3A%20none%3B%0A%7D%0Atable%20%7B%0Aborder%3A%201px%20solid%20darkgray%3B%0A%7D%0Athead%20%7B%0Abackground%2Dcolor%3A%20darkgray%3B%0Acolor%3A%20white%3B%0A%7D%0Ath%2Ctd%20%7B%0Apadding%3A%202px%3B%0Apadding%2Dright%3A%2020px%3B%0A%7D%0Atr%3Anth%2Dchild%28even%29%20%7B%0Abackground%2Dcolor%3A%20%23f8f8f8%3B%0A%7D%0A" rel="stylesheet">
  <!--[if lt IE 9]>
    <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
  <![endif]-->
</head>
<body>
<h1 id="c-standard-proposal-a-time-zone-library">C++ Standard Proposal &#8212; A Time-Zone Library</h1>
<table>
<thead>
<tr class="header">
<th style="text-align: left;">Metadata</th>
<th style="text-align: left;">Value</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td style="text-align: left;">Document number:</td>
<td style="text-align: left;">P0216R0</td>
</tr>
<tr class="even">
<td style="text-align: left;">Date:</td>
<td style="text-align: left;">2016-02-11</td>
</tr>
<tr class="odd">
<td style="text-align: left;">Reply-to:</td>
<td style="text-align: left;">Greg Miller (<script type="text/javascript">
<!--
h='&#x67;&#x6f;&#x6f;&#x67;&#108;&#x65;&#46;&#x63;&#x6f;&#x6d;';a='&#64;';n='&#106;&#x67;&#x6d;';e=n+a+h;
document.write('<a h'+'ref'+'="ma'+'ilto'+':'+e+'" clas'+'s="em' + 'ail">'+e+'<\/'+'a'+'>');
// -->
</script><noscript>jgm at google dot com</noscript>), Bradley White (<script type="text/javascript">
<!--
h='&#x67;&#x6f;&#x6f;&#x67;&#108;&#x65;&#46;&#x63;&#x6f;&#x6d;';a='&#64;';n='&#98;&#x77;&#x77;';e=n+a+h;
document.write('<a h'+'ref'+'="ma'+'ilto'+':'+e+'" clas'+'s="em' + 'ail">'+e+'<\/'+'a'+'>');
// -->
</script><noscript>bww at google dot com</noscript>)</td>
</tr>
<tr class="even">
<td style="text-align: left;">Audience:</td>
<td style="text-align: left;">Library Evolution Working Group</td>
</tr>
</tbody>
</table>
<h2 id="table-of-contents">Table of Contents</h2>
<ul>
<li><a href="#introduction">Introduction</a></li>
<li><a href="#motivation-and-scope">Motivation and Scope</a></li>
<li><a href="#the-conceptual-model-and-terminology">The Conceptual Model and Terminology</a></li>
<li><a href="#impact-on-the-standard">Impact on the Standard</a></li>
<li><a href="#design-decisions">Design Decisions</a></li>
<li><a href="#technical-specification">Technical Specification</a></li>
<li><a href="#synopsis">Synopsis</a></li>
<li><a href="#examples">Examples</a></li>
<li><a href="#references">References</a></li>
</ul>
<h2 id="introduction">Introduction</h2>
<p>Note: This proposal depends on the Civil-Time Library that is proposed in <a href="p0215r0.html">P0215R0</a>.</p>
<p>This document proposes a standard C++ library for computing with real-world time zones, such as &quot;America/New_York&quot;, &quot;Europe/London&quot;, and &quot;Australia/Sydney&quot;. The data describing the rules of each time zone are distributed separately (e.g., <a href="https://www.iana.org/time-zones" class="uri">https://www.iana.org/time-zones</a>), and are not a part of this proposal. The core of this paper proposes a single user-facing class that can represent any real-world time zone and is able to convert between the <em>absolute-time</em> and the <em>civil-time</em> domains (described below). All the complex time-zone computations will be handled by this Time-Zone Library. The exposed interface will give callers access to all the time-zone information they need, while encouraging proper time-programming practices.</p>
<h2 id="motivation-and-scope">Motivation and Scope</h2>
<p>Programming with time zones is notoriously difficult and error prone. There is no simple conceptual model to help programmers reason about this problem space, and there is very little library support. The existing C and C++ standards provide limited support for the &quot;UTC&quot; and &quot;local&quot; time zones, but there is minimal support for other arbitrary time zones.</p>
<p>Sadly, programmers must each become time-zone &quot;experts&quot; in order to accomplish their goals. In code, it is not uncommon to see the addition/subtraction of a UTC offset and a time point, preceded by volumes of commenting to explain why that operation is necessary, usually with some caveat about daylight-saving time (DST). An informal survey of such call sites in Google code showed that few of the operations were actually correct, and nearly all of the comments were misinformed. This is likely because it is impractical to expect time-zone expertise from all programmers.</p>
<p>Programmers should not need to do their own arithmetic with time-zone offsets. This is a frequent source of bugs and is an anti-pattern we call &quot;epoch shifting&quot; (CppCon 2015 talk: <a href="https://youtu.be/2rnIHsqABfM?t=12m30s" class="uri">https://youtu.be/2rnIHsqABfM?t=12m30s</a>). A proper time-zone library must do all necessary time-zone arithmetic itself, giving callers higher-level abstractions on which to build their programs. These higher-level abstractions must form an effective conceptual model about how time zones work so programmers can correctly reason about their code.</p>
<p>The Time-Zone Library proposed here has been implemented and widely used within Google for the past few years. It is actively being used daily, in real-world code, by novice and expert programmers alike.</p>
<h2 id="the-conceptual-model-and-terminology">The Conceptual Model and Terminology</h2>
<p>The concept of time zones, as described in this proposal, is just one of three concepts that comprise a complete, straightforward, and language-neutral model for reasoning about time programming: <em>absolute time</em>, <em>civil time</em>, and <em>time zone</em>.</p>
<p><em>Absolute time</em> uniquely and universally represents a specific instant in time. It has no notion of calendars, or dates, or times of day. Instead, it is a measure of the passage of real time, typically as a simple count of ticks since some epoch. Absolute times are independent of all time zones and do not suffer from human-imposed complexities such as daylight-saving time (DST). Many C++ types exist to represent absolute times, classically <code>time_t</code> and more recently <code>std::chrono::time_point</code>.</p>
<p><em>Civil time</em> is the legally recognized representation of time for ordinary affairs (cf. <a href="http://www.merriam-webster.com/dictionary/civil" class="uri">http://www.merriam-webster.com/dictionary/civil</a>). It is a human-scale representation of time that consists of the six fields &#8212; year, month, day, hour, minute, and second (sometimes shortened to &quot;YMDHMS&quot;) &#8212; and it follows the rules of the <a href="https://en.wikipedia.org/wiki/Proleptic_Gregorian_calendar">Proleptic Gregorian Calendar</a>, with 24-hour days divided into 60-minute hours and 60-second minutes. Like absolute times, civil times are also independent of all time zones and their related complexities (e.g., DST). While <code>std::tm</code> contains the six civil-time fields (YMDHMS), plus a few more, it does not have behavior to enforce the rules of civil time.</p>
<p><em>Time zones</em> are geo-political regions within which human-defined rules are shared to convert between absolute-time and civil-time domains. A time zone's rules include things like the region's offset from the <a href="https://en.wikipedia.org/wiki/Coordinated_Universal_Time">UTC</a> time standard, daylight-saving adjustments, and short abbreviation strings. Time zones often have a history of disparate rules that apply only for certain periods, because the rules may change at the whim of a region's local government. For this reason, time-zone rules are usually compiled into data snapshots that are used at runtime to perform conversions between absolute and civil times. There is currently no C++ standard library supporting arbitrary time zones.</p>
<p>The C++ standard library already has the <code>&lt;chrono&gt;</code> library, which is a good implementation of an <em>absolute time</em> library. Another paper is proposing a standard <em>Civil-Time Library</em> (<a href="p0215r0.html">P0215R0</a>). The current paper is proposing a standard <em>Time-Zone Library</em> that bridges <code>&lt;chrono&gt;</code> and the proposed Civil-Time Library, and completes the three pillars of the conceptual model just described.</p>
<h1 id="impact-on-the-standard">Impact on the Standard</h1>
<p>The Time-Zone Library proposed here depends on the existing <code>&lt;chrono&gt;</code> library with no changes. It also depends on the Civil-Time Library proposed in <a href="p0215r0.html">P0215R0</a>. This library is implementable using only C++98, and requires no language extensions.</p>
<h2 id="design-decisions">Design Decisions</h2>
<h3 id="use-separately-distributed-time-zone-data">Use separately distributed time-zone data</h3>
<p>This proposal depends on externally provided data that describes the rules for each time zone. Commonly this is distributed as data files, one for each time zone, as part of the IANA Time-Zone Database (<a href="https://www.iana.org/time-zones" class="uri">https://www.iana.org/time-zones</a>). These data may alternatively be located elsewhere on a computer (e.g., in a registry). The data source for the time zone library is implementation defined.</p>
<h3 id="leap-seconds-are-disregarded-though-could-be-supported">Leap seconds are disregarded (though could be supported)</h3>
<p>Like most places, Google <a href="https://googleblog.blogspot.com/2011/09/time-technology-and-leaping-seconds.html">disregards leap seconds</a>, and therefore the Time-Zone Library presented here will also disregard them. However, if leap second support becomes necessary, it could be added to this library with minimal modification to the interface and some additional complexity for programmers.</p>
<h2 id="technical-specification">Technical Specification</h2>
<p>Time zones are canonically identified by a string of the form &quot;<em>continent</em>/<em>city</em>&quot;, such as &quot;America/New_York&quot;, &quot;Europe/London&quot;, and &quot;Australia/Sydney&quot;. The data encapsulated by a time zone describes the offset from the <a href="https://en.wikipedia.org/wiki/Coordinated_Universal_Time">UTC</a> time standard, a short abbreviation string (e.g. &quot;EST&quot; and &quot;PDT&quot;), and information about daylight-saving time (DST). These rules are defined by local governments and they may change over time. A time zone, therefore, represents the complete history of time-zone rules and when each rule applies for a given region.</p>
<p>Conceptually, a time zone represents the rules necessary to convert any <em>absolute time</em> to a <em>civil time</em> and vice versa.</p>
<p><a href="https://en.wikipedia.org/wiki/Coordinated_Universal_Time">UTC</a> itself is naturally represented as a time zone having a constant zero offset, no DST, and an abbreviation string of &quot;UTC&quot;. Treating UTC like any other time zone enables programmers to write correct, time-zone-agnostic code without needing to special-case UTC.</p>
<p>The core of the Time-Zone Library presented here is a single class named <code>time_zone</code>, which enables converting between absolute time and civil time. Absolute times are represented by <code>std::chrono::time_point</code> (on the <code>system_clock</code>), and civil times are represented using <code>civil_second</code> as described in the proposed Civil-Time Library (<a href="p0215r0.html">P0215R0</a>). The Time-Zone Library also defines functions to format and parse absolute times as strings.</p>
<h2 id="synopsis">Synopsis</h2>
<p>The interface for the core <code>time_zone</code> class is as follows.</p>
<div class="sourceCode"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span class="ot">#include &lt;chrono&gt;</span>
<span class="ot">#include &quot;civil.h&quot;  </span><span class="co">// See proposal [P0215R0]</span>

<span class="co">// Convenience aliases. Not intended as public API points.</span>
<span class="kw">template</span> &lt;<span class="kw">typename</span> D&gt;
<span class="kw">using</span> time_point = std::chrono::time_point&lt;std::chrono::system_clock, D&gt;;
<span class="kw">using</span> sys_seconds = std::chrono::duration&lt;std::chrono::system_clock::rep,
                                          std::chrono::seconds::period&gt;;

<span class="kw">class</span> time_zone {
 <span class="kw">public</span>:
  time_zone() = <span class="kw">default</span>;  <span class="co">// Equivalent to UTC</span>
  time_zone(<span class="dt">const</span> time_zone&amp;) = <span class="kw">default</span>;
  time_zone&amp; <span class="kw">operator</span>=(<span class="dt">const</span> time_zone&amp;) = <span class="kw">default</span>;

  <span class="kw">struct</span> absolute_lookup {
    civil_second cs;
    <span class="dt">int</span> offset;        <span class="co">// seconds east of UTC</span>
    <span class="dt">bool</span> is_dst;       <span class="co">// is offset non-standard?</span>
    std::string abbr;  <span class="co">// time-zone abbreviation (e.g., &quot;PST&quot;)</span>
  };
  <span class="kw">template</span> &lt;<span class="kw">typename</span> D&gt;
  absolute_lookup lookup(<span class="dt">const</span> time_point&lt;D&gt;&amp; tp) <span class="dt">const</span>;

  <span class="kw">struct</span> civil_lookup {
    <span class="kw">enum</span> civil_kind {
      UNIQUE,    <span class="co">// the civil time was singular (pre == trans == post)</span>
      SKIPPED,   <span class="co">// the civil time did not exist</span>
      REPEATED,  <span class="co">// the civil time was ambiguous</span>
    } kind;
    time_point&lt;sys_seconds&gt; pre;    <span class="co">// Uses the pre-transition offset</span>
    time_point&lt;sys_seconds&gt; trans;  <span class="co">// Instant of civil-offset change</span>
    time_point&lt;sys_seconds&gt; post;   <span class="co">// Uses the post-transition offset</span>
  };
  civil_lookup lookup(<span class="dt">const</span> civil_second&amp; cs) <span class="dt">const</span>;

 <span class="kw">private</span>:
  <span class="co">// ...</span>
};

<span class="co">// Loads the named time zone. Returns false on error.</span>
<span class="dt">bool</span> load_time_zone(<span class="dt">const</span> std::string&amp; name, time_zone* tz);

<span class="co">// Returns a time_zone representing UTC. Cannot fail.</span>
time_zone utc_time_zone();

<span class="co">// Returns a time zone representing the local time zone.</span>
<span class="co">// Falls back to UTC.</span>
time_zone local_time_zone();</code></pre></div>
<p>Converting from an absolute time to a civil time (e.g., <code>std::chrono::time_point</code> to <code>civil_second</code>) is an exact calculation with no possible time-zone ambiguities. However, conversion from civil time to absolute time may not be exact. Conversions around UTC offset transitions may be given ambiguous civil times (e.g., the 1:00 am hour is repeated during the Autumn DST transition in the United States), and some civil times may not exist in a particular time zone (e.g., the 2:00 am hour is skipped during the Spring DST transition in the United States). The <code>time_zone::civil_lookup</code> struct gives callers all relevant information about the conversion operation, as the following diagram illustrates.</p>
<p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAxUAAAFXCAYAAADUEmNEAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABWWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgpMwidZAABAAElEQVR4Aey9DbhO1b73//OW10RLpWij2L2tdvojbBzstHHUjiMHFx4c2eoqBwc7PengSVuOuuTCiRMnHnXk4OCJYsdDG4ekhzZFm6JSVFZUQoX1H9+xjNu855r3ve73e8w5v8N1m+9zjvEZc40xv2P8xm+UK1ZBGEiABEiABEiABEiABEiABEggRQLlU7yOl5EACZAACZAACZAACZAACZCAJkBRwReBBEiABEiABEiABEiABEggLQIUFWnh48UkQAIkQAIkQAIkQAIkQAIUFXwHSIAESIAESIAESIAESIAE0iJAUZEWPl5MAiRAAiRAAiRAAiRAAiRAUcF3gARIgARIgARIgARIgARIIC0CFdO6mheTgEUEjh07JqtWrRIsK1asKE2bNpXOnTvrdRPNdevW6ePY7tmzp9SoUUMfwjU4hlCrVi25//775eDBg7J161a9L9Z/uH/dunX1Pc315lzEoUGDBlJYWKjvafZjuXDhQuemXse5N998s76f82BZ8cDzEQ8EZ/qwXb9+fbnpppv0EtsMJEACJEACJEACJJAVApingoEE/E5g1qxZxVWqVMGcK1G/xo0bF69duzaS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LFuJCIiACIiACIiACGROQNGfMi9gZe8wEZg61Yw/iQiIgAiIgAiIgAj0AAF5KnqgkJVFERABERABERABERABEegkASkVnaSre4uACIiACIiACIhAVQho6G5VSqor33NMfyFd+WZ6KREQAREQAREQAREQAREQgUoQkKeiEsWklxQBERABERABERABERCB7iWgidrdWzZ6syoTeP99M1YmxZWsCdtVLkm9uwiIgAiIgAiIQBsE5KloA5KSiMCwCaBQ9PUFxWLYF+sCERABERABERABEagWASkV1Sovva0IiIAIiIAIiIAI1Al89JHZjTeanXGG2YUXmq1cafb33/XPy/Zef93skkvKPik/x/1Wrza77DKz004L2xdeKE/7009m8+aZTZwY/tjnnCR7AlIqsi9iZfCwEFAEjcOCXQ8VAREQgZ4isGWL2bRpZp9/bnbDDWbHH292771mM2a0xoASctttw+voz5xpNneu2V9/hWt9y/lYUB4mTzZbvz4M/b344rDPOSkWMaks9xX9KctiVaZEQAREQAREQASyJkDHHq/Bscea7dxpdvTRIbtLl4bhtxs3ml1zTSOCl14KysGff5qNH2+2Z0/j52VH775rNn16UCbWrq2nmD3bbN06s+3bzS64IJznHAoF73POOeHcJ58ED8qtt5rF19fvpL1MCEipyKQglY1DJPD772a4crH2HHVUsLDcdFPzTXEB4zZmIjYV+oknmpHOK8/mKxrP7N4dnoPFhobg+uvNsOSUyaZNZlu3hudw/1mzwjVlaXVOBERABESgtwi8+qrZzTebrVljdvvt9bzTNp1wQmhb3nornKeNu+660HbR5nCMYtGOUvHMM2YrVphxrzPPrD9n2zazyy83W7XKbP78cD+eiwKyeXM9HXsMz3rjDbMDB+rKT2MKHWVAQMOfMihEZeEQCfzyS7Ci4DL++utQ6VJRUwnG8ttvwa3LZ7iPv/8+VKaTJpk99VScsnwfZeSss8yefDJcSwXLmNaFC5vT8+xrrw3P4Z14N54j93EzK50RAREQgV4ksGNHyPX55zfmHsMYhijaKReUCNoSFID33gvDpPyzdDtmTPCA+HkUBpSPWKHgsy++CClOOT7fMIEAAAZCSURBVCVsOUahKTOUcY7P8FpIsiUgpSLbolXG2iawYIEZHgQqWty4X31ltnix2YYNwavgN7rv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" alt="Diagram of civil_lookup struct" /></p>
<p>The full information provided by the <code>time_zone::absolute_lookup</code> and <code>time_zone::civil_lookup</code> structs is frequently not needed by callers. To simplify the common case of converting between <code>std::chrono::time_point</code> and <code>civil_second</code>, the Time-Zone Library provides an overloaded non-member <code>convert()</code> function that directly converts from one type to the other. These overloads are the main interface points that callers should use when converting between the absolute-time and civil-time domains, because they intelligently select a good default when time-zone uncertainties arise.</p>
<p>The implementation of these <code>convert()</code> functions must select an appropriate time point to return in cases of ambiguous/skipped civil-time conversions. The value chosen is such that the relative ordering of civil times is preserved when they are converted to absolute times. That is, given <code>civil_second a, b;</code>, if <code>a &lt; b</code>, then <code>convert(a, tz) &lt;= convert(b, tz)</code>.</p>
<div class="sourceCode"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span class="kw">template</span> &lt;<span class="kw">typename</span> D&gt;
<span class="kw">inline</span> civil_second convert(<span class="dt">const</span> time_point&lt;D&gt;&amp; tp, <span class="dt">const</span> time_zone&amp; tz) {
  <span class="kw">return</span> tz.lookup(tp).cs;
}

<span class="kw">inline</span> time_point&lt;sys_seconds&gt; convert(<span class="dt">const</span> civil_second&amp; cs, <span class="dt">const</span> time_zone&amp; tz) {
  <span class="dt">const</span> time_zone::civil_lookup lookup = tz.lookup(cs);
  <span class="kw">if</span> (lookup.kind == time_zone::civil_lookup::SKIPPED)
    <span class="kw">return</span> lookup.trans;
  <span class="kw">return</span> lookup.pre;
}</code></pre></div>
<p>Finally, the Time-Zone Library provides functions for formatting and parsing absolute times with respect to a given time zone. These functions use <code>strftime()</code>-like format specifiers, with the following extensions:</p>
<table style="width:33%;">
<colgroup>
<col style="width: 15%"></col>
<col style="width: 18%"></col>
</colgroup>
<thead>
<tr class="header">
<th style="text-align: left;">Specifier</th>
<th style="text-align: left;">Description</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td style="text-align: left;"><code>%Ez</code></td>
<td style="text-align: left;">RFC3339-compatible numeric time-zone offset (+hh:mm or -hh:mm)</td>
</tr>
<tr class="even">
<td style="text-align: left;"><code>%E#S</code></td>
<td style="text-align: left;">Seconds with # digits of fractional precision</td>
</tr>
<tr class="odd">
<td style="text-align: left;"><code>%E*S</code></td>
<td style="text-align: left;">Seconds with full fractional precision (a literal '*') <code>%E4Y</code> | Four-character years (-999 ... -001, 0000, 0001 ... 9999)</td>
</tr>
</tbody>
</table>
<div class="sourceCode"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span class="kw">template</span> &lt;<span class="kw">typename</span> D&gt;
std::string format(<span class="dt">const</span> std::string&amp; format, <span class="dt">const</span> time_point&lt;D&gt;&amp; tp,
                   <span class="dt">const</span> time_zone&amp; tz);
<span class="co">// Uses a format string of &quot;%Y-%m-%dT%H:%M:%E*S%Ez&quot;</span>
<span class="kw">template</span> &lt;<span class="kw">typename</span> D&gt;
std::string format(<span class="dt">const</span> time_point&lt;D&gt;&amp; tp, <span class="dt">const</span> time_zone&amp; tz);

<span class="kw">template</span> &lt;<span class="kw">typename</span> D&gt;
<span class="dt">bool</span> parse(<span class="dt">const</span> std::string&amp; format, <span class="dt">const</span> std::string&amp; input,
           <span class="dt">const</span> time_zone&amp; tz, time_point&lt;D&gt;* tpp);</code></pre></div>
<h2 id="examples">Examples</h2>
<h3 id="creating-a-time_zone">Creating a <code>time_zone</code></h3>
<p>Time zones are created by passing the time zone's name to the <code>load_time_zone()</code> function along with a pointer to a <code>time_zone</code>. The function will return <code>false</code> if the named zone fails to load.</p>
<p>Additionally, callers may get time zones representing UTC, or the process's local time zone, through convenience functions that cannot fail and return the time zone by value.</p>
<div class="sourceCode"><pre class="sourceCode cpp"><code class="sourceCode cpp">time_zone nyc;
<span class="kw">if</span> (!load_time_zone(<span class="st">&quot;America/New_York&quot;</span>, &amp;nyc)) { <span class="co">/* error */</span> }

<span class="dt">const</span> time_zone utc = utc_time_zone();
<span class="dt">const</span> time_zone local = local_time_zone();</code></pre></div>
<h3 id="creating-a-time_point-from-a-civil_second">Creating a <code>time_point</code> from a <code>civil_second</code></h3>
<p>Converting from the civil-time domain to the absolute-time domain is one of the two fundamental operations of a time zone.</p>
<div class="sourceCode"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span class="dt">const</span> time_zone utc = utc_time_zone();
<span class="dt">const</span> civil_second cs(<span class="dv">2015</span>, <span class="dv">2</span>, <span class="dv">3</span>, <span class="dv">4</span>, <span class="dv">5</span>, <span class="dv">6</span>);  <span class="co">// 2015-02-03 04:05:06</span>

<span class="dt">const</span> <span class="kw">auto</span> tp1 = convert(cs, utc);  <span class="co">// Civil -&gt; Absolute</span>

time_zone nyc;
<span class="kw">if</span> (!load_time_zone(<span class="st">&quot;America/New_York&quot;</span>, &amp;nyc)) { <span class="co">/* error */</span> }

<span class="dt">const</span> <span class="kw">auto</span> tp2 = convert(cs, nyc);  <span class="co">// Civil -&gt; Absolute</span>
<span class="co">// tp1 != tp2</span></code></pre></div>
<h3 id="creating-a-civil_second-from-a-time_point">Creating a <code>civil_second</code> from a <code>time_point</code></h3>
<p>Converting from the absolute-time domain to the civil-time domain is one of the two fundamental operations of a time zone.</p>
<div class="sourceCode"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span class="dt">const</span> time_zone utc = utc_time_zone();
<span class="dt">const</span> time_t tt = <span class="dv">1234567890</span>;
<span class="dt">const</span> <span class="kw">auto</span> tp = std::chrono::system_clock::from_time_t(tt);

<span class="dt">const</span> civil_second cs1 = convert(tp, utc);  <span class="co">// Absolute -&gt; Civil</span>

time_zone nyc;
<span class="kw">if</span> (!load_time_zone(<span class="st">&quot;America/New_York&quot;</span>, &amp;nyc)) { <span class="co">/* error */</span> }

<span class="dt">const</span> civil_second cs2 = convert(tp, nyc);  <span class="co">// Absolute -&gt; Civil</span>
<span class="co">// cs1 != cs2</span></code></pre></div>
<h3 id="handling-daylight-saving-time">Handling daylight-saving time</h3>
<p>As mentioned above, converting from an absolute time to a civil time is never affected by time-zone complexities like DST. On the other hand, conversions going in the other direction could be specified as either skipped or repeated civil times. The <code>convert()</code> function used thus far will always work, either returning the exact answer or a good alternative if no exact answer exists. Most users will simply want to use <code>convert()</code>. However, if a programmer would like to handle possibly inexact conversions explicitly, they may do so by calling the <code>time_zone::lookup()</code> member functions directly as the following examples show. (Note: It may help to consult <a href="https://raw.githubusercontent.com/devjgm/papers/master/resources/struct-civil_lookup.png">this diagram</a> while reading these examples.)</p>
<p>The following example considers 2015-03-08 02:30:00, which did not exist in New York, USA. This example illustrates a civil time that is &quot;skipped&quot; when the civil-time offset changes by +1 hours from UTC-0500 to UTC-0400.</p>
<div class="sourceCode"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span class="dt">const</span> civil_second cs(<span class="dv">2015</span>, <span class="dv">3</span>, <span class="dv">8</span>, <span class="dv">2</span>, <span class="dv">30</span>, <span class="dv">0</span>);  <span class="co">// 2015-03-08 02:30:00</span>
time_zone nyc;
<span class="kw">if</span> (!load_time_zone(<span class="st">&quot;America/New_York&quot;</span>, &amp;nyc)) { <span class="co">/* error */</span> }

<span class="dt">const</span> <span class="kw">auto</span> tp = convert(cs, nyc);  <span class="co">// tp == 2015-03-08 03:00:00 -0400</span>

<span class="dt">const</span> time_zone::civil_lookup lookup = nyc.lookup(cs);
<span class="co">// lookup.kind  == time_zone::civil_lookup::SKIPPED</span>
<span class="co">// lookup.pre   == 2015-03-08 03:30:00 -0400 (== 2015-03-08 02:30:00 -0500)</span>
<span class="co">// lookup.trans == 2015-03-08 03:00:00 -0400 (== 2015-03-08 02:00:00 -0500)</span>
<span class="co">// lookup.post  == 2015-03-08 01:30:00 -0500 (== 2015-03-08 02:30:00 -0400)</span></code></pre></div>
<p>The next example considers 2015-11-01 01:30:00, which was repeated in New York, USA. This example illustrates a civil time that is &quot;repeated&quot; when the civil-time offset changes by -1 hours from UTC-0400 to UTC-0500.</p>
<div class="sourceCode"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span class="dt">const</span> civil_second cs(<span class="dv">2015</span>, <span class="dv">11</span>, <span class="dv">1</span>, <span class="dv">1</span>, <span class="dv">30</span>, <span class="dv">0</span>);  <span class="co">// 2015-11-01 01:30:00</span>
time_zone nyc;
<span class="kw">if</span> (!load_time_zone(<span class="st">&quot;America/New_York&quot;</span>, &amp;nyc)) { <span class="co">/* error */</span> }

<span class="dt">const</span> <span class="kw">auto</span> tp = convert(cs, nyc);  <span class="co">// tp == 2015-11-01 01:30:00 -0400</span>

<span class="dt">const</span> time_zone::civil_lookup lookup = nyc.lookup(cs);
<span class="co">// lookup.kind  == time_zone::civil_lookup::REPEATED</span>
<span class="co">// lookup.pre   == 2015-11-01 01:30:00 -0400</span>
<span class="co">// lookup.trans == 2015-11-01 01:00:00 -0500 (== 2015-11-01 02:00:00 -0400)</span>
<span class="co">// lookup.post  == 2015-11-01 01:30:00 -0500</span></code></pre></div>
<h3 id="flight-example">Flight example</h3>
<p>This <a href="http://howardhinnant.github.io/tz.html#flightexample1">good example</a> is borrowed from Howard Hinnant.</p>
<blockquote>
<p>There's nothing like a real-world example to help demonstrate things. Imagine a plane flying from New York, New York, USA to Tehran, Iran. To make it more realistic, lets say this flight occurred before the hostage crisis, right at the end of 1978. Flight time for a non-stop one way trip is 14 hours and 44 minutes.</p>
<p>Given that the departure is one minute past noon on Dec. 30, 1978, local time, what is the local arrival time?</p>
</blockquote>
<div class="sourceCode"><pre class="sourceCode cpp"><code class="sourceCode cpp">time_zone nyc;
<span class="kw">if</span> (!load_time_zone(<span class="st">&quot;America/New_York&quot;</span>, &amp;nyc)) { <span class="co">/* error */</span> }
<span class="dt">const</span> <span class="kw">auto</span> departure = convert(civil_second(<span class="dv">1978</span>, <span class="dv">12</span>, <span class="dv">30</span>, <span class="dv">12</span>, <span class="dv">1</span>, <span class="dv">0</span>), nyc);
<span class="dt">const</span> <span class="kw">auto</span> flight_length = std::chrono::hours(<span class="dv">14</span>) + std::chrono::minutes(<span class="dv">44</span>);
<span class="dt">const</span> <span class="kw">auto</span> arrival = departure + flight_length;
time_zone teh;
<span class="kw">if</span> (!load_time_zone(<span class="st">&quot;Asia/Tehran&quot;</span>, &amp;teh)) { <span class="co">/* error */</span> }
<span class="co">// format(departure, nyc) == 1978-12-30T12:01:00-05:00</span>
<span class="co">// format(arrival, teh)   == 1978-12-31T11:45:00+04:00</span></code></pre></div>
<h2 id="references">References</h2>
<ul>
<li><a href="https://en.wikipedia.org/wiki/Coordinated_Universal_Time" class="uri">https://en.wikipedia.org/wiki/Coordinated_Universal_Time</a></li>
<li><a href="https://en.wikipedia.org/wiki/Proleptic_Gregorian_calendar" class="uri">https://en.wikipedia.org/wiki/Proleptic_Gregorian_calendar</a></li>
<li><a href="https://en.wikipedia.org/wiki/Tz_database" class="uri">https://en.wikipedia.org/wiki/Tz_database</a></li>
<li><a href="http://howardhinnant.github.io/tz.html" class="uri">http://howardhinnant.github.io/tz.html</a>.</li>
<li><a href="https://github.com/google/cctz" class="uri">https://github.com/google/cctz</a></li>
</ul>
</body>
</html>
