1*9356374aSAndroid Build Coastguard Worker // Copyright 2017 The Abseil Authors.
2*9356374aSAndroid Build Coastguard Worker //
3*9356374aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*9356374aSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*9356374aSAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*9356374aSAndroid Build Coastguard Worker //
7*9356374aSAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0
8*9356374aSAndroid Build Coastguard Worker //
9*9356374aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*9356374aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*9356374aSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*9356374aSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*9356374aSAndroid Build Coastguard Worker // limitations under the License.
14*9356374aSAndroid Build Coastguard Worker //
15*9356374aSAndroid Build Coastguard Worker // -----------------------------------------------------------------------------
16*9356374aSAndroid Build Coastguard Worker // File: time.h
17*9356374aSAndroid Build Coastguard Worker // -----------------------------------------------------------------------------
18*9356374aSAndroid Build Coastguard Worker //
19*9356374aSAndroid Build Coastguard Worker // This header file defines abstractions for computing with absolute points
20*9356374aSAndroid Build Coastguard Worker // in time, durations of time, and formatting and parsing time within a given
21*9356374aSAndroid Build Coastguard Worker // time zone. The following abstractions are defined:
22*9356374aSAndroid Build Coastguard Worker //
23*9356374aSAndroid Build Coastguard Worker // * `absl::Time` defines an absolute, specific instance in time
24*9356374aSAndroid Build Coastguard Worker // * `absl::Duration` defines a signed, fixed-length span of time
25*9356374aSAndroid Build Coastguard Worker // * `absl::TimeZone` defines geopolitical time zone regions (as collected
26*9356374aSAndroid Build Coastguard Worker // within the IANA Time Zone database (https://www.iana.org/time-zones)).
27*9356374aSAndroid Build Coastguard Worker //
28*9356374aSAndroid Build Coastguard Worker // Note: Absolute times are distinct from civil times, which refer to the
29*9356374aSAndroid Build Coastguard Worker // human-scale time commonly represented by `YYYY-MM-DD hh:mm:ss`. The mapping
30*9356374aSAndroid Build Coastguard Worker // between absolute and civil times can be specified by use of time zones
31*9356374aSAndroid Build Coastguard Worker // (`absl::TimeZone` within this API). That is:
32*9356374aSAndroid Build Coastguard Worker //
33*9356374aSAndroid Build Coastguard Worker // Civil Time = F(Absolute Time, Time Zone)
34*9356374aSAndroid Build Coastguard Worker // Absolute Time = G(Civil Time, Time Zone)
35*9356374aSAndroid Build Coastguard Worker //
36*9356374aSAndroid Build Coastguard Worker // See civil_time.h for abstractions related to constructing and manipulating
37*9356374aSAndroid Build Coastguard Worker // civil time.
38*9356374aSAndroid Build Coastguard Worker //
39*9356374aSAndroid Build Coastguard Worker // Example:
40*9356374aSAndroid Build Coastguard Worker //
41*9356374aSAndroid Build Coastguard Worker // absl::TimeZone nyc;
42*9356374aSAndroid Build Coastguard Worker // // LoadTimeZone() may fail so it's always better to check for success.
43*9356374aSAndroid Build Coastguard Worker // if (!absl::LoadTimeZone("America/New_York", &nyc)) {
44*9356374aSAndroid Build Coastguard Worker // // handle error case
45*9356374aSAndroid Build Coastguard Worker // }
46*9356374aSAndroid Build Coastguard Worker //
47*9356374aSAndroid Build Coastguard Worker // // My flight leaves NYC on Jan 2, 2017 at 03:04:05
48*9356374aSAndroid Build Coastguard Worker // absl::CivilSecond cs(2017, 1, 2, 3, 4, 5);
49*9356374aSAndroid Build Coastguard Worker // absl::Time takeoff = absl::FromCivil(cs, nyc);
50*9356374aSAndroid Build Coastguard Worker //
51*9356374aSAndroid Build Coastguard Worker // absl::Duration flight_duration = absl::Hours(21) + absl::Minutes(35);
52*9356374aSAndroid Build Coastguard Worker // absl::Time landing = takeoff + flight_duration;
53*9356374aSAndroid Build Coastguard Worker //
54*9356374aSAndroid Build Coastguard Worker // absl::TimeZone syd;
55*9356374aSAndroid Build Coastguard Worker // if (!absl::LoadTimeZone("Australia/Sydney", &syd)) {
56*9356374aSAndroid Build Coastguard Worker // // handle error case
57*9356374aSAndroid Build Coastguard Worker // }
58*9356374aSAndroid Build Coastguard Worker // std::string s = absl::FormatTime(
59*9356374aSAndroid Build Coastguard Worker // "My flight will land in Sydney on %Y-%m-%d at %H:%M:%S",
60*9356374aSAndroid Build Coastguard Worker // landing, syd);
61*9356374aSAndroid Build Coastguard Worker
62*9356374aSAndroid Build Coastguard Worker #ifndef ABSL_TIME_TIME_H_
63*9356374aSAndroid Build Coastguard Worker #define ABSL_TIME_TIME_H_
64*9356374aSAndroid Build Coastguard Worker
65*9356374aSAndroid Build Coastguard Worker #if !defined(_MSC_VER)
66*9356374aSAndroid Build Coastguard Worker #include <sys/time.h>
67*9356374aSAndroid Build Coastguard Worker #else
68*9356374aSAndroid Build Coastguard Worker // We don't include `winsock2.h` because it drags in `windows.h` and friends,
69*9356374aSAndroid Build Coastguard Worker // and they define conflicting macros like OPAQUE, ERROR, and more. This has the
70*9356374aSAndroid Build Coastguard Worker // potential to break Abseil users.
71*9356374aSAndroid Build Coastguard Worker //
72*9356374aSAndroid Build Coastguard Worker // Instead we only forward declare `timeval` and require Windows users include
73*9356374aSAndroid Build Coastguard Worker // `winsock2.h` themselves. This is both inconsistent and troublesome, but so is
74*9356374aSAndroid Build Coastguard Worker // including 'windows.h' so we are picking the lesser of two evils here.
75*9356374aSAndroid Build Coastguard Worker struct timeval;
76*9356374aSAndroid Build Coastguard Worker #endif
77*9356374aSAndroid Build Coastguard Worker #include <chrono> // NOLINT(build/c++11)
78*9356374aSAndroid Build Coastguard Worker
79*9356374aSAndroid Build Coastguard Worker #ifdef __cpp_impl_three_way_comparison
80*9356374aSAndroid Build Coastguard Worker #include <compare>
81*9356374aSAndroid Build Coastguard Worker #endif // __cpp_impl_three_way_comparison
82*9356374aSAndroid Build Coastguard Worker
83*9356374aSAndroid Build Coastguard Worker #include <cmath>
84*9356374aSAndroid Build Coastguard Worker #include <cstdint>
85*9356374aSAndroid Build Coastguard Worker #include <ctime>
86*9356374aSAndroid Build Coastguard Worker #include <limits>
87*9356374aSAndroid Build Coastguard Worker #include <ostream>
88*9356374aSAndroid Build Coastguard Worker #include <ratio> // NOLINT(build/c++11)
89*9356374aSAndroid Build Coastguard Worker #include <string>
90*9356374aSAndroid Build Coastguard Worker #include <type_traits>
91*9356374aSAndroid Build Coastguard Worker #include <utility>
92*9356374aSAndroid Build Coastguard Worker
93*9356374aSAndroid Build Coastguard Worker #include "absl/base/attributes.h"
94*9356374aSAndroid Build Coastguard Worker #include "absl/base/config.h"
95*9356374aSAndroid Build Coastguard Worker #include "absl/base/macros.h"
96*9356374aSAndroid Build Coastguard Worker #include "absl/strings/string_view.h"
97*9356374aSAndroid Build Coastguard Worker #include "absl/time/civil_time.h"
98*9356374aSAndroid Build Coastguard Worker #include "absl/time/internal/cctz/include/cctz/time_zone.h"
99*9356374aSAndroid Build Coastguard Worker
100*9356374aSAndroid Build Coastguard Worker namespace absl {
101*9356374aSAndroid Build Coastguard Worker ABSL_NAMESPACE_BEGIN
102*9356374aSAndroid Build Coastguard Worker
103*9356374aSAndroid Build Coastguard Worker class Duration; // Defined below
104*9356374aSAndroid Build Coastguard Worker class Time; // Defined below
105*9356374aSAndroid Build Coastguard Worker class TimeZone; // Defined below
106*9356374aSAndroid Build Coastguard Worker
107*9356374aSAndroid Build Coastguard Worker namespace time_internal {
108*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr Time FromUnixDuration(Duration d);
109*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr Duration ToUnixDuration(Time t);
110*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr int64_t GetRepHi(Duration d);
111*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr uint32_t GetRepLo(Duration d);
112*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr Duration MakeDuration(int64_t hi,
113*9356374aSAndroid Build Coastguard Worker uint32_t lo);
114*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr Duration MakeDuration(int64_t hi,
115*9356374aSAndroid Build Coastguard Worker int64_t lo);
116*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION inline Duration MakePosDoubleDuration(double n);
117*9356374aSAndroid Build Coastguard Worker constexpr int64_t kTicksPerNanosecond = 4;
118*9356374aSAndroid Build Coastguard Worker constexpr int64_t kTicksPerSecond = 1000 * 1000 * 1000 * kTicksPerNanosecond;
119*9356374aSAndroid Build Coastguard Worker template <std::intmax_t N>
120*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr Duration FromInt64(int64_t v,
121*9356374aSAndroid Build Coastguard Worker std::ratio<1, N>);
122*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr Duration FromInt64(int64_t v,
123*9356374aSAndroid Build Coastguard Worker std::ratio<60>);
124*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr Duration FromInt64(int64_t v,
125*9356374aSAndroid Build Coastguard Worker std::ratio<3600>);
126*9356374aSAndroid Build Coastguard Worker template <typename T>
127*9356374aSAndroid Build Coastguard Worker using EnableIfIntegral = typename std::enable_if<
128*9356374aSAndroid Build Coastguard Worker std::is_integral<T>::value || std::is_enum<T>::value, int>::type;
129*9356374aSAndroid Build Coastguard Worker template <typename T>
130*9356374aSAndroid Build Coastguard Worker using EnableIfFloat =
131*9356374aSAndroid Build Coastguard Worker typename std::enable_if<std::is_floating_point<T>::value, int>::type;
132*9356374aSAndroid Build Coastguard Worker } // namespace time_internal
133*9356374aSAndroid Build Coastguard Worker
134*9356374aSAndroid Build Coastguard Worker // Duration
135*9356374aSAndroid Build Coastguard Worker //
136*9356374aSAndroid Build Coastguard Worker // The `absl::Duration` class represents a signed, fixed-length amount of time.
137*9356374aSAndroid Build Coastguard Worker // A `Duration` is generated using a unit-specific factory function, or is
138*9356374aSAndroid Build Coastguard Worker // the result of subtracting one `absl::Time` from another. Durations behave
139*9356374aSAndroid Build Coastguard Worker // like unit-safe integers and they support all the natural integer-like
140*9356374aSAndroid Build Coastguard Worker // arithmetic operations. Arithmetic overflows and saturates at +/- infinity.
141*9356374aSAndroid Build Coastguard Worker // `Duration` should be passed by value rather than const reference.
142*9356374aSAndroid Build Coastguard Worker //
143*9356374aSAndroid Build Coastguard Worker // Factory functions `Nanoseconds()`, `Microseconds()`, `Milliseconds()`,
144*9356374aSAndroid Build Coastguard Worker // `Seconds()`, `Minutes()`, `Hours()` and `InfiniteDuration()` allow for
145*9356374aSAndroid Build Coastguard Worker // creation of constexpr `Duration` values
146*9356374aSAndroid Build Coastguard Worker //
147*9356374aSAndroid Build Coastguard Worker // Examples:
148*9356374aSAndroid Build Coastguard Worker //
149*9356374aSAndroid Build Coastguard Worker // constexpr absl::Duration ten_ns = absl::Nanoseconds(10);
150*9356374aSAndroid Build Coastguard Worker // constexpr absl::Duration min = absl::Minutes(1);
151*9356374aSAndroid Build Coastguard Worker // constexpr absl::Duration hour = absl::Hours(1);
152*9356374aSAndroid Build Coastguard Worker // absl::Duration dur = 60 * min; // dur == hour
153*9356374aSAndroid Build Coastguard Worker // absl::Duration half_sec = absl::Milliseconds(500);
154*9356374aSAndroid Build Coastguard Worker // absl::Duration quarter_sec = 0.25 * absl::Seconds(1);
155*9356374aSAndroid Build Coastguard Worker //
156*9356374aSAndroid Build Coastguard Worker // `Duration` values can be easily converted to an integral number of units
157*9356374aSAndroid Build Coastguard Worker // using the division operator.
158*9356374aSAndroid Build Coastguard Worker //
159*9356374aSAndroid Build Coastguard Worker // Example:
160*9356374aSAndroid Build Coastguard Worker //
161*9356374aSAndroid Build Coastguard Worker // constexpr absl::Duration dur = absl::Milliseconds(1500);
162*9356374aSAndroid Build Coastguard Worker // int64_t ns = dur / absl::Nanoseconds(1); // ns == 1500000000
163*9356374aSAndroid Build Coastguard Worker // int64_t ms = dur / absl::Milliseconds(1); // ms == 1500
164*9356374aSAndroid Build Coastguard Worker // int64_t sec = dur / absl::Seconds(1); // sec == 1 (subseconds truncated)
165*9356374aSAndroid Build Coastguard Worker // int64_t min = dur / absl::Minutes(1); // min == 0
166*9356374aSAndroid Build Coastguard Worker //
167*9356374aSAndroid Build Coastguard Worker // See the `IDivDuration()` and `FDivDuration()` functions below for details on
168*9356374aSAndroid Build Coastguard Worker // how to access the fractional parts of the quotient.
169*9356374aSAndroid Build Coastguard Worker //
170*9356374aSAndroid Build Coastguard Worker // Alternatively, conversions can be performed using helpers such as
171*9356374aSAndroid Build Coastguard Worker // `ToInt64Microseconds()` and `ToDoubleSeconds()`.
172*9356374aSAndroid Build Coastguard Worker class Duration {
173*9356374aSAndroid Build Coastguard Worker public:
174*9356374aSAndroid Build Coastguard Worker // Value semantics.
Duration()175*9356374aSAndroid Build Coastguard Worker constexpr Duration() : rep_hi_(0), rep_lo_(0) {} // zero-length duration
176*9356374aSAndroid Build Coastguard Worker
177*9356374aSAndroid Build Coastguard Worker // Copyable.
178*9356374aSAndroid Build Coastguard Worker #if !defined(__clang__) && defined(_MSC_VER) && _MSC_VER < 1930
179*9356374aSAndroid Build Coastguard Worker // Explicitly defining the constexpr copy constructor avoids an MSVC bug.
Duration(const Duration & d)180*9356374aSAndroid Build Coastguard Worker constexpr Duration(const Duration& d)
181*9356374aSAndroid Build Coastguard Worker : rep_hi_(d.rep_hi_), rep_lo_(d.rep_lo_) {}
182*9356374aSAndroid Build Coastguard Worker #else
183*9356374aSAndroid Build Coastguard Worker constexpr Duration(const Duration& d) = default;
184*9356374aSAndroid Build Coastguard Worker #endif
185*9356374aSAndroid Build Coastguard Worker Duration& operator=(const Duration& d) = default;
186*9356374aSAndroid Build Coastguard Worker
187*9356374aSAndroid Build Coastguard Worker // Compound assignment operators.
188*9356374aSAndroid Build Coastguard Worker Duration& operator+=(Duration d);
189*9356374aSAndroid Build Coastguard Worker Duration& operator-=(Duration d);
190*9356374aSAndroid Build Coastguard Worker Duration& operator*=(int64_t r);
191*9356374aSAndroid Build Coastguard Worker Duration& operator*=(double r);
192*9356374aSAndroid Build Coastguard Worker Duration& operator/=(int64_t r);
193*9356374aSAndroid Build Coastguard Worker Duration& operator/=(double r);
194*9356374aSAndroid Build Coastguard Worker Duration& operator%=(Duration rhs);
195*9356374aSAndroid Build Coastguard Worker
196*9356374aSAndroid Build Coastguard Worker // Overloads that forward to either the int64_t or double overloads above.
197*9356374aSAndroid Build Coastguard Worker // Integer operands must be representable as int64_t. Integer division is
198*9356374aSAndroid Build Coastguard Worker // truncating, so values less than the resolution will be returned as zero.
199*9356374aSAndroid Build Coastguard Worker // Floating-point multiplication and division is rounding (halfway cases
200*9356374aSAndroid Build Coastguard Worker // rounding away from zero), so values less than the resolution may be
201*9356374aSAndroid Build Coastguard Worker // returned as either the resolution or zero. In particular, `d / 2.0`
202*9356374aSAndroid Build Coastguard Worker // can produce `d` when it is the resolution and "even".
203*9356374aSAndroid Build Coastguard Worker template <typename T, time_internal::EnableIfIntegral<T> = 0>
204*9356374aSAndroid Build Coastguard Worker Duration& operator*=(T r) {
205*9356374aSAndroid Build Coastguard Worker int64_t x = r;
206*9356374aSAndroid Build Coastguard Worker return *this *= x;
207*9356374aSAndroid Build Coastguard Worker }
208*9356374aSAndroid Build Coastguard Worker
209*9356374aSAndroid Build Coastguard Worker template <typename T, time_internal::EnableIfIntegral<T> = 0>
210*9356374aSAndroid Build Coastguard Worker Duration& operator/=(T r) {
211*9356374aSAndroid Build Coastguard Worker int64_t x = r;
212*9356374aSAndroid Build Coastguard Worker return *this /= x;
213*9356374aSAndroid Build Coastguard Worker }
214*9356374aSAndroid Build Coastguard Worker
215*9356374aSAndroid Build Coastguard Worker template <typename T, time_internal::EnableIfFloat<T> = 0>
216*9356374aSAndroid Build Coastguard Worker Duration& operator*=(T r) {
217*9356374aSAndroid Build Coastguard Worker double x = r;
218*9356374aSAndroid Build Coastguard Worker return *this *= x;
219*9356374aSAndroid Build Coastguard Worker }
220*9356374aSAndroid Build Coastguard Worker
221*9356374aSAndroid Build Coastguard Worker template <typename T, time_internal::EnableIfFloat<T> = 0>
222*9356374aSAndroid Build Coastguard Worker Duration& operator/=(T r) {
223*9356374aSAndroid Build Coastguard Worker double x = r;
224*9356374aSAndroid Build Coastguard Worker return *this /= x;
225*9356374aSAndroid Build Coastguard Worker }
226*9356374aSAndroid Build Coastguard Worker
227*9356374aSAndroid Build Coastguard Worker template <typename H>
AbslHashValue(H h,Duration d)228*9356374aSAndroid Build Coastguard Worker friend H AbslHashValue(H h, Duration d) {
229*9356374aSAndroid Build Coastguard Worker return H::combine(std::move(h), d.rep_hi_.Get(), d.rep_lo_);
230*9356374aSAndroid Build Coastguard Worker }
231*9356374aSAndroid Build Coastguard Worker
232*9356374aSAndroid Build Coastguard Worker private:
233*9356374aSAndroid Build Coastguard Worker friend constexpr int64_t time_internal::GetRepHi(Duration d);
234*9356374aSAndroid Build Coastguard Worker friend constexpr uint32_t time_internal::GetRepLo(Duration d);
235*9356374aSAndroid Build Coastguard Worker friend constexpr Duration time_internal::MakeDuration(int64_t hi,
236*9356374aSAndroid Build Coastguard Worker uint32_t lo);
Duration(int64_t hi,uint32_t lo)237*9356374aSAndroid Build Coastguard Worker constexpr Duration(int64_t hi, uint32_t lo) : rep_hi_(hi), rep_lo_(lo) {}
238*9356374aSAndroid Build Coastguard Worker
239*9356374aSAndroid Build Coastguard Worker // We store `rep_hi_` 4-byte rather than 8-byte aligned to avoid 4 bytes of
240*9356374aSAndroid Build Coastguard Worker // tail padding.
241*9356374aSAndroid Build Coastguard Worker class HiRep {
242*9356374aSAndroid Build Coastguard Worker public:
243*9356374aSAndroid Build Coastguard Worker // Default constructor default-initializes `hi_`, which has the same
244*9356374aSAndroid Build Coastguard Worker // semantics as default-initializing an `int64_t` (undetermined value).
245*9356374aSAndroid Build Coastguard Worker HiRep() = default;
246*9356374aSAndroid Build Coastguard Worker
247*9356374aSAndroid Build Coastguard Worker HiRep(const HiRep&) = default;
248*9356374aSAndroid Build Coastguard Worker HiRep& operator=(const HiRep&) = default;
249*9356374aSAndroid Build Coastguard Worker
HiRep(const int64_t value)250*9356374aSAndroid Build Coastguard Worker explicit constexpr HiRep(const int64_t value)
251*9356374aSAndroid Build Coastguard Worker : // C++17 forbids default-initialization in constexpr contexts. We can
252*9356374aSAndroid Build Coastguard Worker // remove this in C++20.
253*9356374aSAndroid Build Coastguard Worker #if defined(ABSL_IS_BIG_ENDIAN) && ABSL_IS_BIG_ENDIAN
254*9356374aSAndroid Build Coastguard Worker hi_(0),
255*9356374aSAndroid Build Coastguard Worker lo_(0)
256*9356374aSAndroid Build Coastguard Worker #else
257*9356374aSAndroid Build Coastguard Worker lo_(0),
258*9356374aSAndroid Build Coastguard Worker hi_(0)
259*9356374aSAndroid Build Coastguard Worker #endif
260*9356374aSAndroid Build Coastguard Worker {
261*9356374aSAndroid Build Coastguard Worker *this = value;
262*9356374aSAndroid Build Coastguard Worker }
263*9356374aSAndroid Build Coastguard Worker
Get()264*9356374aSAndroid Build Coastguard Worker constexpr int64_t Get() const {
265*9356374aSAndroid Build Coastguard Worker const uint64_t unsigned_value =
266*9356374aSAndroid Build Coastguard Worker (static_cast<uint64_t>(hi_) << 32) | static_cast<uint64_t>(lo_);
267*9356374aSAndroid Build Coastguard Worker // `static_cast<int64_t>(unsigned_value)` is implementation-defined
268*9356374aSAndroid Build Coastguard Worker // before c++20. On all supported platforms the behaviour is that mandated
269*9356374aSAndroid Build Coastguard Worker // by c++20, i.e. "If the destination type is signed, [...] the result is
270*9356374aSAndroid Build Coastguard Worker // the unique value of the destination type equal to the source value
271*9356374aSAndroid Build Coastguard Worker // modulo 2^n, where n is the number of bits used to represent the
272*9356374aSAndroid Build Coastguard Worker // destination type."
273*9356374aSAndroid Build Coastguard Worker static_assert(
274*9356374aSAndroid Build Coastguard Worker (static_cast<int64_t>((std::numeric_limits<uint64_t>::max)()) ==
275*9356374aSAndroid Build Coastguard Worker int64_t{-1}) &&
276*9356374aSAndroid Build Coastguard Worker (static_cast<int64_t>(static_cast<uint64_t>(
277*9356374aSAndroid Build Coastguard Worker (std::numeric_limits<int64_t>::max)()) +
278*9356374aSAndroid Build Coastguard Worker 1) ==
279*9356374aSAndroid Build Coastguard Worker (std::numeric_limits<int64_t>::min)()),
280*9356374aSAndroid Build Coastguard Worker "static_cast<int64_t>(uint64_t) does not have c++20 semantics");
281*9356374aSAndroid Build Coastguard Worker return static_cast<int64_t>(unsigned_value);
282*9356374aSAndroid Build Coastguard Worker }
283*9356374aSAndroid Build Coastguard Worker
284*9356374aSAndroid Build Coastguard Worker constexpr HiRep& operator=(const int64_t value) {
285*9356374aSAndroid Build Coastguard Worker // "If the destination type is unsigned, the resulting value is the
286*9356374aSAndroid Build Coastguard Worker // smallest unsigned value equal to the source value modulo 2^n
287*9356374aSAndroid Build Coastguard Worker // where `n` is the number of bits used to represent the destination
288*9356374aSAndroid Build Coastguard Worker // type".
289*9356374aSAndroid Build Coastguard Worker const auto unsigned_value = static_cast<uint64_t>(value);
290*9356374aSAndroid Build Coastguard Worker hi_ = static_cast<uint32_t>(unsigned_value >> 32);
291*9356374aSAndroid Build Coastguard Worker lo_ = static_cast<uint32_t>(unsigned_value);
292*9356374aSAndroid Build Coastguard Worker return *this;
293*9356374aSAndroid Build Coastguard Worker }
294*9356374aSAndroid Build Coastguard Worker
295*9356374aSAndroid Build Coastguard Worker private:
296*9356374aSAndroid Build Coastguard Worker // Notes:
297*9356374aSAndroid Build Coastguard Worker // - Ideally we would use a `char[]` and `std::bitcast`, but the latter
298*9356374aSAndroid Build Coastguard Worker // does not exist (and is not constexpr in `absl`) before c++20.
299*9356374aSAndroid Build Coastguard Worker // - Order is optimized depending on endianness so that the compiler can
300*9356374aSAndroid Build Coastguard Worker // turn `Get()` (resp. `operator=()`) into a single 8-byte load (resp.
301*9356374aSAndroid Build Coastguard Worker // store).
302*9356374aSAndroid Build Coastguard Worker #if defined(ABSL_IS_BIG_ENDIAN) && ABSL_IS_BIG_ENDIAN
303*9356374aSAndroid Build Coastguard Worker uint32_t hi_;
304*9356374aSAndroid Build Coastguard Worker uint32_t lo_;
305*9356374aSAndroid Build Coastguard Worker #else
306*9356374aSAndroid Build Coastguard Worker uint32_t lo_;
307*9356374aSAndroid Build Coastguard Worker uint32_t hi_;
308*9356374aSAndroid Build Coastguard Worker #endif
309*9356374aSAndroid Build Coastguard Worker };
310*9356374aSAndroid Build Coastguard Worker HiRep rep_hi_;
311*9356374aSAndroid Build Coastguard Worker uint32_t rep_lo_;
312*9356374aSAndroid Build Coastguard Worker };
313*9356374aSAndroid Build Coastguard Worker
314*9356374aSAndroid Build Coastguard Worker // Relational Operators
315*9356374aSAndroid Build Coastguard Worker
316*9356374aSAndroid Build Coastguard Worker #ifdef __cpp_impl_three_way_comparison
317*9356374aSAndroid Build Coastguard Worker
318*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr std::strong_ordering operator<=>(
319*9356374aSAndroid Build Coastguard Worker Duration lhs, Duration rhs);
320*9356374aSAndroid Build Coastguard Worker
321*9356374aSAndroid Build Coastguard Worker #endif // __cpp_impl_three_way_comparison
322*9356374aSAndroid Build Coastguard Worker
323*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr bool operator<(Duration lhs,
324*9356374aSAndroid Build Coastguard Worker Duration rhs);
325*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr bool operator>(Duration lhs,
326*9356374aSAndroid Build Coastguard Worker Duration rhs) {
327*9356374aSAndroid Build Coastguard Worker return rhs < lhs;
328*9356374aSAndroid Build Coastguard Worker }
329*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr bool operator>=(Duration lhs,
330*9356374aSAndroid Build Coastguard Worker Duration rhs) {
331*9356374aSAndroid Build Coastguard Worker return !(lhs < rhs);
332*9356374aSAndroid Build Coastguard Worker }
333*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr bool operator<=(Duration lhs,
334*9356374aSAndroid Build Coastguard Worker Duration rhs) {
335*9356374aSAndroid Build Coastguard Worker return !(rhs < lhs);
336*9356374aSAndroid Build Coastguard Worker }
337*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr bool operator==(Duration lhs,
338*9356374aSAndroid Build Coastguard Worker Duration rhs);
339*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr bool operator!=(Duration lhs,
340*9356374aSAndroid Build Coastguard Worker Duration rhs) {
341*9356374aSAndroid Build Coastguard Worker return !(lhs == rhs);
342*9356374aSAndroid Build Coastguard Worker }
343*9356374aSAndroid Build Coastguard Worker
344*9356374aSAndroid Build Coastguard Worker // Additive Operators
345*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr Duration operator-(Duration d);
346*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION inline Duration operator+(Duration lhs,
347*9356374aSAndroid Build Coastguard Worker Duration rhs) {
348*9356374aSAndroid Build Coastguard Worker return lhs += rhs;
349*9356374aSAndroid Build Coastguard Worker }
350*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION inline Duration operator-(Duration lhs,
351*9356374aSAndroid Build Coastguard Worker Duration rhs) {
352*9356374aSAndroid Build Coastguard Worker return lhs -= rhs;
353*9356374aSAndroid Build Coastguard Worker }
354*9356374aSAndroid Build Coastguard Worker
355*9356374aSAndroid Build Coastguard Worker // IDivDuration()
356*9356374aSAndroid Build Coastguard Worker //
357*9356374aSAndroid Build Coastguard Worker // Divides a numerator `Duration` by a denominator `Duration`, returning the
358*9356374aSAndroid Build Coastguard Worker // quotient and remainder. The remainder always has the same sign as the
359*9356374aSAndroid Build Coastguard Worker // numerator. The returned quotient and remainder respect the identity:
360*9356374aSAndroid Build Coastguard Worker //
361*9356374aSAndroid Build Coastguard Worker // numerator = denominator * quotient + remainder
362*9356374aSAndroid Build Coastguard Worker //
363*9356374aSAndroid Build Coastguard Worker // Returned quotients are capped to the range of `int64_t`, with the difference
364*9356374aSAndroid Build Coastguard Worker // spilling into the remainder to uphold the above identity. This means that the
365*9356374aSAndroid Build Coastguard Worker // remainder returned could differ from the remainder returned by
366*9356374aSAndroid Build Coastguard Worker // `Duration::operator%` for huge quotients.
367*9356374aSAndroid Build Coastguard Worker //
368*9356374aSAndroid Build Coastguard Worker // See also the notes on `InfiniteDuration()` below regarding the behavior of
369*9356374aSAndroid Build Coastguard Worker // division involving zero and infinite durations.
370*9356374aSAndroid Build Coastguard Worker //
371*9356374aSAndroid Build Coastguard Worker // Example:
372*9356374aSAndroid Build Coastguard Worker //
373*9356374aSAndroid Build Coastguard Worker // constexpr absl::Duration a =
374*9356374aSAndroid Build Coastguard Worker // absl::Seconds(std::numeric_limits<int64_t>::max()); // big
375*9356374aSAndroid Build Coastguard Worker // constexpr absl::Duration b = absl::Nanoseconds(1); // small
376*9356374aSAndroid Build Coastguard Worker //
377*9356374aSAndroid Build Coastguard Worker // absl::Duration rem = a % b;
378*9356374aSAndroid Build Coastguard Worker // // rem == absl::ZeroDuration()
379*9356374aSAndroid Build Coastguard Worker //
380*9356374aSAndroid Build Coastguard Worker // // Here, q would overflow int64_t, so rem accounts for the difference.
381*9356374aSAndroid Build Coastguard Worker // int64_t q = absl::IDivDuration(a, b, &rem);
382*9356374aSAndroid Build Coastguard Worker // // q == std::numeric_limits<int64_t>::max(), rem == a - b * q
383*9356374aSAndroid Build Coastguard Worker int64_t IDivDuration(Duration num, Duration den, Duration* rem);
384*9356374aSAndroid Build Coastguard Worker
385*9356374aSAndroid Build Coastguard Worker // FDivDuration()
386*9356374aSAndroid Build Coastguard Worker //
387*9356374aSAndroid Build Coastguard Worker // Divides a `Duration` numerator into a fractional number of units of a
388*9356374aSAndroid Build Coastguard Worker // `Duration` denominator.
389*9356374aSAndroid Build Coastguard Worker //
390*9356374aSAndroid Build Coastguard Worker // See also the notes on `InfiniteDuration()` below regarding the behavior of
391*9356374aSAndroid Build Coastguard Worker // division involving zero and infinite durations.
392*9356374aSAndroid Build Coastguard Worker //
393*9356374aSAndroid Build Coastguard Worker // Example:
394*9356374aSAndroid Build Coastguard Worker //
395*9356374aSAndroid Build Coastguard Worker // double d = absl::FDivDuration(absl::Milliseconds(1500), absl::Seconds(1));
396*9356374aSAndroid Build Coastguard Worker // // d == 1.5
397*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION double FDivDuration(Duration num, Duration den);
398*9356374aSAndroid Build Coastguard Worker
399*9356374aSAndroid Build Coastguard Worker // Multiplicative Operators
400*9356374aSAndroid Build Coastguard Worker // Integer operands must be representable as int64_t.
401*9356374aSAndroid Build Coastguard Worker template <typename T>
402*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION Duration operator*(Duration lhs, T rhs) {
403*9356374aSAndroid Build Coastguard Worker return lhs *= rhs;
404*9356374aSAndroid Build Coastguard Worker }
405*9356374aSAndroid Build Coastguard Worker template <typename T>
406*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION Duration operator*(T lhs, Duration rhs) {
407*9356374aSAndroid Build Coastguard Worker return rhs *= lhs;
408*9356374aSAndroid Build Coastguard Worker }
409*9356374aSAndroid Build Coastguard Worker template <typename T>
410*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION Duration operator/(Duration lhs, T rhs) {
411*9356374aSAndroid Build Coastguard Worker return lhs /= rhs;
412*9356374aSAndroid Build Coastguard Worker }
413*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION inline int64_t operator/(Duration lhs,
414*9356374aSAndroid Build Coastguard Worker Duration rhs) {
415*9356374aSAndroid Build Coastguard Worker return IDivDuration(lhs, rhs,
416*9356374aSAndroid Build Coastguard Worker &lhs); // trunc towards zero
417*9356374aSAndroid Build Coastguard Worker }
418*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION inline Duration operator%(Duration lhs,
419*9356374aSAndroid Build Coastguard Worker Duration rhs) {
420*9356374aSAndroid Build Coastguard Worker return lhs %= rhs;
421*9356374aSAndroid Build Coastguard Worker }
422*9356374aSAndroid Build Coastguard Worker
423*9356374aSAndroid Build Coastguard Worker // ZeroDuration()
424*9356374aSAndroid Build Coastguard Worker //
425*9356374aSAndroid Build Coastguard Worker // Returns a zero-length duration. This function behaves just like the default
426*9356374aSAndroid Build Coastguard Worker // constructor, but the name helps make the semantics clear at call sites.
ZeroDuration()427*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr Duration ZeroDuration() {
428*9356374aSAndroid Build Coastguard Worker return Duration();
429*9356374aSAndroid Build Coastguard Worker }
430*9356374aSAndroid Build Coastguard Worker
431*9356374aSAndroid Build Coastguard Worker // AbsDuration()
432*9356374aSAndroid Build Coastguard Worker //
433*9356374aSAndroid Build Coastguard Worker // Returns the absolute value of a duration.
AbsDuration(Duration d)434*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION inline Duration AbsDuration(Duration d) {
435*9356374aSAndroid Build Coastguard Worker return (d < ZeroDuration()) ? -d : d;
436*9356374aSAndroid Build Coastguard Worker }
437*9356374aSAndroid Build Coastguard Worker
438*9356374aSAndroid Build Coastguard Worker // Trunc()
439*9356374aSAndroid Build Coastguard Worker //
440*9356374aSAndroid Build Coastguard Worker // Truncates a duration (toward zero) to a multiple of a non-zero unit.
441*9356374aSAndroid Build Coastguard Worker //
442*9356374aSAndroid Build Coastguard Worker // Example:
443*9356374aSAndroid Build Coastguard Worker //
444*9356374aSAndroid Build Coastguard Worker // absl::Duration d = absl::Nanoseconds(123456789);
445*9356374aSAndroid Build Coastguard Worker // absl::Duration a = absl::Trunc(d, absl::Microseconds(1)); // 123456us
446*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION Duration Trunc(Duration d, Duration unit);
447*9356374aSAndroid Build Coastguard Worker
448*9356374aSAndroid Build Coastguard Worker // Floor()
449*9356374aSAndroid Build Coastguard Worker //
450*9356374aSAndroid Build Coastguard Worker // Floors a duration using the passed duration unit to its largest value not
451*9356374aSAndroid Build Coastguard Worker // greater than the duration.
452*9356374aSAndroid Build Coastguard Worker //
453*9356374aSAndroid Build Coastguard Worker // Example:
454*9356374aSAndroid Build Coastguard Worker //
455*9356374aSAndroid Build Coastguard Worker // absl::Duration d = absl::Nanoseconds(123456789);
456*9356374aSAndroid Build Coastguard Worker // absl::Duration b = absl::Floor(d, absl::Microseconds(1)); // 123456us
457*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION Duration Floor(Duration d, Duration unit);
458*9356374aSAndroid Build Coastguard Worker
459*9356374aSAndroid Build Coastguard Worker // Ceil()
460*9356374aSAndroid Build Coastguard Worker //
461*9356374aSAndroid Build Coastguard Worker // Returns the ceiling of a duration using the passed duration unit to its
462*9356374aSAndroid Build Coastguard Worker // smallest value not less than the duration.
463*9356374aSAndroid Build Coastguard Worker //
464*9356374aSAndroid Build Coastguard Worker // Example:
465*9356374aSAndroid Build Coastguard Worker //
466*9356374aSAndroid Build Coastguard Worker // absl::Duration d = absl::Nanoseconds(123456789);
467*9356374aSAndroid Build Coastguard Worker // absl::Duration c = absl::Ceil(d, absl::Microseconds(1)); // 123457us
468*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION Duration Ceil(Duration d, Duration unit);
469*9356374aSAndroid Build Coastguard Worker
470*9356374aSAndroid Build Coastguard Worker // InfiniteDuration()
471*9356374aSAndroid Build Coastguard Worker //
472*9356374aSAndroid Build Coastguard Worker // Returns an infinite `Duration`. To get a `Duration` representing negative
473*9356374aSAndroid Build Coastguard Worker // infinity, use `-InfiniteDuration()`.
474*9356374aSAndroid Build Coastguard Worker //
475*9356374aSAndroid Build Coastguard Worker // Duration arithmetic overflows to +/- infinity and saturates. In general,
476*9356374aSAndroid Build Coastguard Worker // arithmetic with `Duration` infinities is similar to IEEE 754 infinities
477*9356374aSAndroid Build Coastguard Worker // except where IEEE 754 NaN would be involved, in which case +/-
478*9356374aSAndroid Build Coastguard Worker // `InfiniteDuration()` is used in place of a "nan" Duration.
479*9356374aSAndroid Build Coastguard Worker //
480*9356374aSAndroid Build Coastguard Worker // Examples:
481*9356374aSAndroid Build Coastguard Worker //
482*9356374aSAndroid Build Coastguard Worker // constexpr absl::Duration inf = absl::InfiniteDuration();
483*9356374aSAndroid Build Coastguard Worker // const absl::Duration d = ... any finite duration ...
484*9356374aSAndroid Build Coastguard Worker //
485*9356374aSAndroid Build Coastguard Worker // inf == inf + inf
486*9356374aSAndroid Build Coastguard Worker // inf == inf + d
487*9356374aSAndroid Build Coastguard Worker // inf == inf - inf
488*9356374aSAndroid Build Coastguard Worker // -inf == d - inf
489*9356374aSAndroid Build Coastguard Worker //
490*9356374aSAndroid Build Coastguard Worker // inf == d * 1e100
491*9356374aSAndroid Build Coastguard Worker // inf == inf / 2
492*9356374aSAndroid Build Coastguard Worker // 0 == d / inf
493*9356374aSAndroid Build Coastguard Worker // INT64_MAX == inf / d
494*9356374aSAndroid Build Coastguard Worker //
495*9356374aSAndroid Build Coastguard Worker // d < inf
496*9356374aSAndroid Build Coastguard Worker // -inf < d
497*9356374aSAndroid Build Coastguard Worker //
498*9356374aSAndroid Build Coastguard Worker // // Division by zero returns infinity, or INT64_MIN/MAX where appropriate.
499*9356374aSAndroid Build Coastguard Worker // inf == d / 0
500*9356374aSAndroid Build Coastguard Worker // INT64_MAX == d / absl::ZeroDuration()
501*9356374aSAndroid Build Coastguard Worker //
502*9356374aSAndroid Build Coastguard Worker // The examples involving the `/` operator above also apply to `IDivDuration()`
503*9356374aSAndroid Build Coastguard Worker // and `FDivDuration()`.
504*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr Duration InfiniteDuration();
505*9356374aSAndroid Build Coastguard Worker
506*9356374aSAndroid Build Coastguard Worker // Nanoseconds()
507*9356374aSAndroid Build Coastguard Worker // Microseconds()
508*9356374aSAndroid Build Coastguard Worker // Milliseconds()
509*9356374aSAndroid Build Coastguard Worker // Seconds()
510*9356374aSAndroid Build Coastguard Worker // Minutes()
511*9356374aSAndroid Build Coastguard Worker // Hours()
512*9356374aSAndroid Build Coastguard Worker //
513*9356374aSAndroid Build Coastguard Worker // Factory functions for constructing `Duration` values from an integral number
514*9356374aSAndroid Build Coastguard Worker // of the unit indicated by the factory function's name. The number must be
515*9356374aSAndroid Build Coastguard Worker // representable as int64_t.
516*9356374aSAndroid Build Coastguard Worker //
517*9356374aSAndroid Build Coastguard Worker // NOTE: no "Days()" factory function exists because "a day" is ambiguous.
518*9356374aSAndroid Build Coastguard Worker // Civil days are not always 24 hours long, and a 24-hour duration often does
519*9356374aSAndroid Build Coastguard Worker // not correspond with a civil day. If a 24-hour duration is needed, use
520*9356374aSAndroid Build Coastguard Worker // `absl::Hours(24)`. If you actually want a civil day, use absl::CivilDay
521*9356374aSAndroid Build Coastguard Worker // from civil_time.h.
522*9356374aSAndroid Build Coastguard Worker //
523*9356374aSAndroid Build Coastguard Worker // Example:
524*9356374aSAndroid Build Coastguard Worker //
525*9356374aSAndroid Build Coastguard Worker // absl::Duration a = absl::Seconds(60);
526*9356374aSAndroid Build Coastguard Worker // absl::Duration b = absl::Minutes(1); // b == a
527*9356374aSAndroid Build Coastguard Worker template <typename T, time_internal::EnableIfIntegral<T> = 0>
Nanoseconds(T n)528*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr Duration Nanoseconds(T n) {
529*9356374aSAndroid Build Coastguard Worker return time_internal::FromInt64(n, std::nano{});
530*9356374aSAndroid Build Coastguard Worker }
531*9356374aSAndroid Build Coastguard Worker template <typename T, time_internal::EnableIfIntegral<T> = 0>
Microseconds(T n)532*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr Duration Microseconds(T n) {
533*9356374aSAndroid Build Coastguard Worker return time_internal::FromInt64(n, std::micro{});
534*9356374aSAndroid Build Coastguard Worker }
535*9356374aSAndroid Build Coastguard Worker template <typename T, time_internal::EnableIfIntegral<T> = 0>
Milliseconds(T n)536*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr Duration Milliseconds(T n) {
537*9356374aSAndroid Build Coastguard Worker return time_internal::FromInt64(n, std::milli{});
538*9356374aSAndroid Build Coastguard Worker }
539*9356374aSAndroid Build Coastguard Worker template <typename T, time_internal::EnableIfIntegral<T> = 0>
Seconds(T n)540*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr Duration Seconds(T n) {
541*9356374aSAndroid Build Coastguard Worker return time_internal::FromInt64(n, std::ratio<1>{});
542*9356374aSAndroid Build Coastguard Worker }
543*9356374aSAndroid Build Coastguard Worker template <typename T, time_internal::EnableIfIntegral<T> = 0>
Minutes(T n)544*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr Duration Minutes(T n) {
545*9356374aSAndroid Build Coastguard Worker return time_internal::FromInt64(n, std::ratio<60>{});
546*9356374aSAndroid Build Coastguard Worker }
547*9356374aSAndroid Build Coastguard Worker template <typename T, time_internal::EnableIfIntegral<T> = 0>
Hours(T n)548*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr Duration Hours(T n) {
549*9356374aSAndroid Build Coastguard Worker return time_internal::FromInt64(n, std::ratio<3600>{});
550*9356374aSAndroid Build Coastguard Worker }
551*9356374aSAndroid Build Coastguard Worker
552*9356374aSAndroid Build Coastguard Worker // Factory overloads for constructing `Duration` values from a floating-point
553*9356374aSAndroid Build Coastguard Worker // number of the unit indicated by the factory function's name. These functions
554*9356374aSAndroid Build Coastguard Worker // exist for convenience, but they are not as efficient as the integral
555*9356374aSAndroid Build Coastguard Worker // factories, which should be preferred.
556*9356374aSAndroid Build Coastguard Worker //
557*9356374aSAndroid Build Coastguard Worker // Example:
558*9356374aSAndroid Build Coastguard Worker //
559*9356374aSAndroid Build Coastguard Worker // auto a = absl::Seconds(1.5); // OK
560*9356374aSAndroid Build Coastguard Worker // auto b = absl::Milliseconds(1500); // BETTER
561*9356374aSAndroid Build Coastguard Worker template <typename T, time_internal::EnableIfFloat<T> = 0>
Nanoseconds(T n)562*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION Duration Nanoseconds(T n) {
563*9356374aSAndroid Build Coastguard Worker return n * Nanoseconds(1);
564*9356374aSAndroid Build Coastguard Worker }
565*9356374aSAndroid Build Coastguard Worker template <typename T, time_internal::EnableIfFloat<T> = 0>
Microseconds(T n)566*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION Duration Microseconds(T n) {
567*9356374aSAndroid Build Coastguard Worker return n * Microseconds(1);
568*9356374aSAndroid Build Coastguard Worker }
569*9356374aSAndroid Build Coastguard Worker template <typename T, time_internal::EnableIfFloat<T> = 0>
Milliseconds(T n)570*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION Duration Milliseconds(T n) {
571*9356374aSAndroid Build Coastguard Worker return n * Milliseconds(1);
572*9356374aSAndroid Build Coastguard Worker }
573*9356374aSAndroid Build Coastguard Worker template <typename T, time_internal::EnableIfFloat<T> = 0>
Seconds(T n)574*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION Duration Seconds(T n) {
575*9356374aSAndroid Build Coastguard Worker if (n >= 0) { // Note: `NaN >= 0` is false.
576*9356374aSAndroid Build Coastguard Worker if (n >= static_cast<T>((std::numeric_limits<int64_t>::max)())) {
577*9356374aSAndroid Build Coastguard Worker return InfiniteDuration();
578*9356374aSAndroid Build Coastguard Worker }
579*9356374aSAndroid Build Coastguard Worker return time_internal::MakePosDoubleDuration(n);
580*9356374aSAndroid Build Coastguard Worker } else {
581*9356374aSAndroid Build Coastguard Worker if (std::isnan(n))
582*9356374aSAndroid Build Coastguard Worker return std::signbit(n) ? -InfiniteDuration() : InfiniteDuration();
583*9356374aSAndroid Build Coastguard Worker if (n <= (std::numeric_limits<int64_t>::min)()) return -InfiniteDuration();
584*9356374aSAndroid Build Coastguard Worker return -time_internal::MakePosDoubleDuration(-n);
585*9356374aSAndroid Build Coastguard Worker }
586*9356374aSAndroid Build Coastguard Worker }
587*9356374aSAndroid Build Coastguard Worker template <typename T, time_internal::EnableIfFloat<T> = 0>
Minutes(T n)588*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION Duration Minutes(T n) {
589*9356374aSAndroid Build Coastguard Worker return n * Minutes(1);
590*9356374aSAndroid Build Coastguard Worker }
591*9356374aSAndroid Build Coastguard Worker template <typename T, time_internal::EnableIfFloat<T> = 0>
Hours(T n)592*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION Duration Hours(T n) {
593*9356374aSAndroid Build Coastguard Worker return n * Hours(1);
594*9356374aSAndroid Build Coastguard Worker }
595*9356374aSAndroid Build Coastguard Worker
596*9356374aSAndroid Build Coastguard Worker // ToInt64Nanoseconds()
597*9356374aSAndroid Build Coastguard Worker // ToInt64Microseconds()
598*9356374aSAndroid Build Coastguard Worker // ToInt64Milliseconds()
599*9356374aSAndroid Build Coastguard Worker // ToInt64Seconds()
600*9356374aSAndroid Build Coastguard Worker // ToInt64Minutes()
601*9356374aSAndroid Build Coastguard Worker // ToInt64Hours()
602*9356374aSAndroid Build Coastguard Worker //
603*9356374aSAndroid Build Coastguard Worker // Helper functions that convert a Duration to an integral count of the
604*9356374aSAndroid Build Coastguard Worker // indicated unit. These return the same results as the `IDivDuration()`
605*9356374aSAndroid Build Coastguard Worker // function, though they usually do so more efficiently; see the
606*9356374aSAndroid Build Coastguard Worker // documentation of `IDivDuration()` for details about overflow, etc.
607*9356374aSAndroid Build Coastguard Worker //
608*9356374aSAndroid Build Coastguard Worker // Example:
609*9356374aSAndroid Build Coastguard Worker //
610*9356374aSAndroid Build Coastguard Worker // absl::Duration d = absl::Milliseconds(1500);
611*9356374aSAndroid Build Coastguard Worker // int64_t isec = absl::ToInt64Seconds(d); // isec == 1
612*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION int64_t ToInt64Nanoseconds(Duration d);
613*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION int64_t ToInt64Microseconds(Duration d);
614*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION int64_t ToInt64Milliseconds(Duration d);
615*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION int64_t ToInt64Seconds(Duration d);
616*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION int64_t ToInt64Minutes(Duration d);
617*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION int64_t ToInt64Hours(Duration d);
618*9356374aSAndroid Build Coastguard Worker
619*9356374aSAndroid Build Coastguard Worker // ToDoubleNanoseconds()
620*9356374aSAndroid Build Coastguard Worker // ToDoubleMicroseconds()
621*9356374aSAndroid Build Coastguard Worker // ToDoubleMilliseconds()
622*9356374aSAndroid Build Coastguard Worker // ToDoubleSeconds()
623*9356374aSAndroid Build Coastguard Worker // ToDoubleMinutes()
624*9356374aSAndroid Build Coastguard Worker // ToDoubleHours()
625*9356374aSAndroid Build Coastguard Worker //
626*9356374aSAndroid Build Coastguard Worker // Helper functions that convert a Duration to a floating point count of the
627*9356374aSAndroid Build Coastguard Worker // indicated unit. These functions are shorthand for the `FDivDuration()`
628*9356374aSAndroid Build Coastguard Worker // function above; see its documentation for details about overflow, etc.
629*9356374aSAndroid Build Coastguard Worker //
630*9356374aSAndroid Build Coastguard Worker // Example:
631*9356374aSAndroid Build Coastguard Worker //
632*9356374aSAndroid Build Coastguard Worker // absl::Duration d = absl::Milliseconds(1500);
633*9356374aSAndroid Build Coastguard Worker // double dsec = absl::ToDoubleSeconds(d); // dsec == 1.5
634*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION double ToDoubleNanoseconds(Duration d);
635*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION double ToDoubleMicroseconds(Duration d);
636*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION double ToDoubleMilliseconds(Duration d);
637*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION double ToDoubleSeconds(Duration d);
638*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION double ToDoubleMinutes(Duration d);
639*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION double ToDoubleHours(Duration d);
640*9356374aSAndroid Build Coastguard Worker
641*9356374aSAndroid Build Coastguard Worker // FromChrono()
642*9356374aSAndroid Build Coastguard Worker //
643*9356374aSAndroid Build Coastguard Worker // Converts any of the pre-defined std::chrono durations to an absl::Duration.
644*9356374aSAndroid Build Coastguard Worker //
645*9356374aSAndroid Build Coastguard Worker // Example:
646*9356374aSAndroid Build Coastguard Worker //
647*9356374aSAndroid Build Coastguard Worker // std::chrono::milliseconds ms(123);
648*9356374aSAndroid Build Coastguard Worker // absl::Duration d = absl::FromChrono(ms);
649*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_PURE_FUNCTION constexpr Duration FromChrono(
650*9356374aSAndroid Build Coastguard Worker const std::chrono::nanoseconds& d);
651*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_PURE_FUNCTION constexpr Duration FromChrono(
652*9356374aSAndroid Build Coastguard Worker const std::chrono::microseconds& d);
653*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_PURE_FUNCTION constexpr Duration FromChrono(
654*9356374aSAndroid Build Coastguard Worker const std::chrono::milliseconds& d);
655*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_PURE_FUNCTION constexpr Duration FromChrono(
656*9356374aSAndroid Build Coastguard Worker const std::chrono::seconds& d);
657*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_PURE_FUNCTION constexpr Duration FromChrono(
658*9356374aSAndroid Build Coastguard Worker const std::chrono::minutes& d);
659*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_PURE_FUNCTION constexpr Duration FromChrono(
660*9356374aSAndroid Build Coastguard Worker const std::chrono::hours& d);
661*9356374aSAndroid Build Coastguard Worker
662*9356374aSAndroid Build Coastguard Worker // ToChronoNanoseconds()
663*9356374aSAndroid Build Coastguard Worker // ToChronoMicroseconds()
664*9356374aSAndroid Build Coastguard Worker // ToChronoMilliseconds()
665*9356374aSAndroid Build Coastguard Worker // ToChronoSeconds()
666*9356374aSAndroid Build Coastguard Worker // ToChronoMinutes()
667*9356374aSAndroid Build Coastguard Worker // ToChronoHours()
668*9356374aSAndroid Build Coastguard Worker //
669*9356374aSAndroid Build Coastguard Worker // Converts an absl::Duration to any of the pre-defined std::chrono durations.
670*9356374aSAndroid Build Coastguard Worker // If overflow would occur, the returned value will saturate at the min/max
671*9356374aSAndroid Build Coastguard Worker // chrono duration value instead.
672*9356374aSAndroid Build Coastguard Worker //
673*9356374aSAndroid Build Coastguard Worker // Example:
674*9356374aSAndroid Build Coastguard Worker //
675*9356374aSAndroid Build Coastguard Worker // absl::Duration d = absl::Microseconds(123);
676*9356374aSAndroid Build Coastguard Worker // auto x = absl::ToChronoMicroseconds(d);
677*9356374aSAndroid Build Coastguard Worker // auto y = absl::ToChronoNanoseconds(d); // x == y
678*9356374aSAndroid Build Coastguard Worker // auto z = absl::ToChronoSeconds(absl::InfiniteDuration());
679*9356374aSAndroid Build Coastguard Worker // // z == std::chrono::seconds::max()
680*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION std::chrono::nanoseconds ToChronoNanoseconds(
681*9356374aSAndroid Build Coastguard Worker Duration d);
682*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION std::chrono::microseconds ToChronoMicroseconds(
683*9356374aSAndroid Build Coastguard Worker Duration d);
684*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION std::chrono::milliseconds ToChronoMilliseconds(
685*9356374aSAndroid Build Coastguard Worker Duration d);
686*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION std::chrono::seconds ToChronoSeconds(Duration d);
687*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION std::chrono::minutes ToChronoMinutes(Duration d);
688*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION std::chrono::hours ToChronoHours(Duration d);
689*9356374aSAndroid Build Coastguard Worker
690*9356374aSAndroid Build Coastguard Worker // FormatDuration()
691*9356374aSAndroid Build Coastguard Worker //
692*9356374aSAndroid Build Coastguard Worker // Returns a string representing the duration in the form "72h3m0.5s".
693*9356374aSAndroid Build Coastguard Worker // Returns "inf" or "-inf" for +/- `InfiniteDuration()`.
694*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION std::string FormatDuration(Duration d);
695*9356374aSAndroid Build Coastguard Worker
696*9356374aSAndroid Build Coastguard Worker // Output stream operator.
697*9356374aSAndroid Build Coastguard Worker inline std::ostream& operator<<(std::ostream& os, Duration d) {
698*9356374aSAndroid Build Coastguard Worker return os << FormatDuration(d);
699*9356374aSAndroid Build Coastguard Worker }
700*9356374aSAndroid Build Coastguard Worker
701*9356374aSAndroid Build Coastguard Worker // Support for StrFormat(), StrCat() etc.
702*9356374aSAndroid Build Coastguard Worker template <typename Sink>
AbslStringify(Sink & sink,Duration d)703*9356374aSAndroid Build Coastguard Worker void AbslStringify(Sink& sink, Duration d) {
704*9356374aSAndroid Build Coastguard Worker sink.Append(FormatDuration(d));
705*9356374aSAndroid Build Coastguard Worker }
706*9356374aSAndroid Build Coastguard Worker
707*9356374aSAndroid Build Coastguard Worker // ParseDuration()
708*9356374aSAndroid Build Coastguard Worker //
709*9356374aSAndroid Build Coastguard Worker // Parses a duration string consisting of a possibly signed sequence of
710*9356374aSAndroid Build Coastguard Worker // decimal numbers, each with an optional fractional part and a unit
711*9356374aSAndroid Build Coastguard Worker // suffix. The valid suffixes are "ns", "us" "ms", "s", "m", and "h".
712*9356374aSAndroid Build Coastguard Worker // Simple examples include "300ms", "-1.5h", and "2h45m". Parses "0" as
713*9356374aSAndroid Build Coastguard Worker // `ZeroDuration()`. Parses "inf" and "-inf" as +/- `InfiniteDuration()`.
714*9356374aSAndroid Build Coastguard Worker bool ParseDuration(absl::string_view dur_string, Duration* d);
715*9356374aSAndroid Build Coastguard Worker
716*9356374aSAndroid Build Coastguard Worker // AbslParseFlag()
717*9356374aSAndroid Build Coastguard Worker //
718*9356374aSAndroid Build Coastguard Worker // Parses a command-line flag string representation `text` into a Duration
719*9356374aSAndroid Build Coastguard Worker // value. Duration flags must be specified in a format that is valid input for
720*9356374aSAndroid Build Coastguard Worker // `absl::ParseDuration()`.
721*9356374aSAndroid Build Coastguard Worker bool AbslParseFlag(absl::string_view text, Duration* dst, std::string* error);
722*9356374aSAndroid Build Coastguard Worker
723*9356374aSAndroid Build Coastguard Worker
724*9356374aSAndroid Build Coastguard Worker // AbslUnparseFlag()
725*9356374aSAndroid Build Coastguard Worker //
726*9356374aSAndroid Build Coastguard Worker // Unparses a Duration value into a command-line string representation using
727*9356374aSAndroid Build Coastguard Worker // the format specified by `absl::ParseDuration()`.
728*9356374aSAndroid Build Coastguard Worker std::string AbslUnparseFlag(Duration d);
729*9356374aSAndroid Build Coastguard Worker
730*9356374aSAndroid Build Coastguard Worker ABSL_DEPRECATED("Use AbslParseFlag() instead.")
731*9356374aSAndroid Build Coastguard Worker bool ParseFlag(const std::string& text, Duration* dst, std::string* error);
732*9356374aSAndroid Build Coastguard Worker ABSL_DEPRECATED("Use AbslUnparseFlag() instead.")
733*9356374aSAndroid Build Coastguard Worker std::string UnparseFlag(Duration d);
734*9356374aSAndroid Build Coastguard Worker
735*9356374aSAndroid Build Coastguard Worker // Time
736*9356374aSAndroid Build Coastguard Worker //
737*9356374aSAndroid Build Coastguard Worker // An `absl::Time` represents a specific instant in time. Arithmetic operators
738*9356374aSAndroid Build Coastguard Worker // are provided for naturally expressing time calculations. Instances are
739*9356374aSAndroid Build Coastguard Worker // created using `absl::Now()` and the `absl::From*()` factory functions that
740*9356374aSAndroid Build Coastguard Worker // accept the gamut of other time representations. Formatting and parsing
741*9356374aSAndroid Build Coastguard Worker // functions are provided for conversion to and from strings. `absl::Time`
742*9356374aSAndroid Build Coastguard Worker // should be passed by value rather than const reference.
743*9356374aSAndroid Build Coastguard Worker //
744*9356374aSAndroid Build Coastguard Worker // `absl::Time` assumes there are 60 seconds in a minute, which means the
745*9356374aSAndroid Build Coastguard Worker // underlying time scales must be "smeared" to eliminate leap seconds.
746*9356374aSAndroid Build Coastguard Worker // See https://developers.google.com/time/smear.
747*9356374aSAndroid Build Coastguard Worker //
748*9356374aSAndroid Build Coastguard Worker // Even though `absl::Time` supports a wide range of timestamps, exercise
749*9356374aSAndroid Build Coastguard Worker // caution when using values in the distant past. `absl::Time` uses the
750*9356374aSAndroid Build Coastguard Worker // Proleptic Gregorian calendar, which extends the Gregorian calendar backward
751*9356374aSAndroid Build Coastguard Worker // to dates before its introduction in 1582.
752*9356374aSAndroid Build Coastguard Worker // See https://en.wikipedia.org/wiki/Proleptic_Gregorian_calendar
753*9356374aSAndroid Build Coastguard Worker // for more information. Use the ICU calendar classes to convert a date in
754*9356374aSAndroid Build Coastguard Worker // some other calendar (http://userguide.icu-project.org/datetime/calendar).
755*9356374aSAndroid Build Coastguard Worker //
756*9356374aSAndroid Build Coastguard Worker // Similarly, standardized time zones are a reasonably recent innovation, with
757*9356374aSAndroid Build Coastguard Worker // the Greenwich prime meridian being established in 1884. The TZ database
758*9356374aSAndroid Build Coastguard Worker // itself does not profess accurate offsets for timestamps prior to 1970. The
759*9356374aSAndroid Build Coastguard Worker // breakdown of future timestamps is subject to the whim of regional
760*9356374aSAndroid Build Coastguard Worker // governments.
761*9356374aSAndroid Build Coastguard Worker //
762*9356374aSAndroid Build Coastguard Worker // The `absl::Time` class represents an instant in time as a count of clock
763*9356374aSAndroid Build Coastguard Worker // ticks of some granularity (resolution) from some starting point (epoch).
764*9356374aSAndroid Build Coastguard Worker //
765*9356374aSAndroid Build Coastguard Worker // `absl::Time` uses a resolution that is high enough to avoid loss in
766*9356374aSAndroid Build Coastguard Worker // precision, and a range that is wide enough to avoid overflow, when
767*9356374aSAndroid Build Coastguard Worker // converting between tick counts in most Google time scales (i.e., resolution
768*9356374aSAndroid Build Coastguard Worker // of at least one nanosecond, and range +/-100 billion years). Conversions
769*9356374aSAndroid Build Coastguard Worker // between the time scales are performed by truncating (towards negative
770*9356374aSAndroid Build Coastguard Worker // infinity) to the nearest representable point.
771*9356374aSAndroid Build Coastguard Worker //
772*9356374aSAndroid Build Coastguard Worker // Examples:
773*9356374aSAndroid Build Coastguard Worker //
774*9356374aSAndroid Build Coastguard Worker // absl::Time t1 = ...;
775*9356374aSAndroid Build Coastguard Worker // absl::Time t2 = t1 + absl::Minutes(2);
776*9356374aSAndroid Build Coastguard Worker // absl::Duration d = t2 - t1; // == absl::Minutes(2)
777*9356374aSAndroid Build Coastguard Worker //
778*9356374aSAndroid Build Coastguard Worker class Time {
779*9356374aSAndroid Build Coastguard Worker public:
780*9356374aSAndroid Build Coastguard Worker // Value semantics.
781*9356374aSAndroid Build Coastguard Worker
782*9356374aSAndroid Build Coastguard Worker // Returns the Unix epoch. However, those reading your code may not know
783*9356374aSAndroid Build Coastguard Worker // or expect the Unix epoch as the default value, so make your code more
784*9356374aSAndroid Build Coastguard Worker // readable by explicitly initializing all instances before use.
785*9356374aSAndroid Build Coastguard Worker //
786*9356374aSAndroid Build Coastguard Worker // Example:
787*9356374aSAndroid Build Coastguard Worker // absl::Time t = absl::UnixEpoch();
788*9356374aSAndroid Build Coastguard Worker // absl::Time t = absl::Now();
789*9356374aSAndroid Build Coastguard Worker // absl::Time t = absl::TimeFromTimeval(tv);
790*9356374aSAndroid Build Coastguard Worker // absl::Time t = absl::InfinitePast();
791*9356374aSAndroid Build Coastguard Worker constexpr Time() = default;
792*9356374aSAndroid Build Coastguard Worker
793*9356374aSAndroid Build Coastguard Worker // Copyable.
794*9356374aSAndroid Build Coastguard Worker constexpr Time(const Time& t) = default;
795*9356374aSAndroid Build Coastguard Worker Time& operator=(const Time& t) = default;
796*9356374aSAndroid Build Coastguard Worker
797*9356374aSAndroid Build Coastguard Worker // Assignment operators.
798*9356374aSAndroid Build Coastguard Worker Time& operator+=(Duration d) {
799*9356374aSAndroid Build Coastguard Worker rep_ += d;
800*9356374aSAndroid Build Coastguard Worker return *this;
801*9356374aSAndroid Build Coastguard Worker }
802*9356374aSAndroid Build Coastguard Worker Time& operator-=(Duration d) {
803*9356374aSAndroid Build Coastguard Worker rep_ -= d;
804*9356374aSAndroid Build Coastguard Worker return *this;
805*9356374aSAndroid Build Coastguard Worker }
806*9356374aSAndroid Build Coastguard Worker
807*9356374aSAndroid Build Coastguard Worker // Time::Breakdown
808*9356374aSAndroid Build Coastguard Worker //
809*9356374aSAndroid Build Coastguard Worker // The calendar and wall-clock (aka "civil time") components of an
810*9356374aSAndroid Build Coastguard Worker // `absl::Time` in a certain `absl::TimeZone`. This struct is not
811*9356374aSAndroid Build Coastguard Worker // intended to represent an instant in time. So, rather than passing
812*9356374aSAndroid Build Coastguard Worker // a `Time::Breakdown` to a function, pass an `absl::Time` and an
813*9356374aSAndroid Build Coastguard Worker // `absl::TimeZone`.
814*9356374aSAndroid Build Coastguard Worker //
815*9356374aSAndroid Build Coastguard Worker // Deprecated. Use `absl::TimeZone::CivilInfo`.
816*9356374aSAndroid Build Coastguard Worker struct ABSL_DEPRECATED("Use `absl::TimeZone::CivilInfo`.") Breakdown {
817*9356374aSAndroid Build Coastguard Worker int64_t year; // year (e.g., 2013)
818*9356374aSAndroid Build Coastguard Worker int month; // month of year [1:12]
819*9356374aSAndroid Build Coastguard Worker int day; // day of month [1:31]
820*9356374aSAndroid Build Coastguard Worker int hour; // hour of day [0:23]
821*9356374aSAndroid Build Coastguard Worker int minute; // minute of hour [0:59]
822*9356374aSAndroid Build Coastguard Worker int second; // second of minute [0:59]
823*9356374aSAndroid Build Coastguard Worker Duration subsecond; // [Seconds(0):Seconds(1)) if finite
824*9356374aSAndroid Build Coastguard Worker int weekday; // 1==Mon, ..., 7=Sun
825*9356374aSAndroid Build Coastguard Worker int yearday; // day of year [1:366]
826*9356374aSAndroid Build Coastguard Worker
827*9356374aSAndroid Build Coastguard Worker // Note: The following fields exist for backward compatibility
828*9356374aSAndroid Build Coastguard Worker // with older APIs. Accessing these fields directly is a sign of
829*9356374aSAndroid Build Coastguard Worker // imprudent logic in the calling code. Modern time-related code
830*9356374aSAndroid Build Coastguard Worker // should only access this data indirectly by way of FormatTime().
831*9356374aSAndroid Build Coastguard Worker // These fields are undefined for InfiniteFuture() and InfinitePast().
832*9356374aSAndroid Build Coastguard Worker int offset; // seconds east of UTC
833*9356374aSAndroid Build Coastguard Worker bool is_dst; // is offset non-standard?
834*9356374aSAndroid Build Coastguard Worker const char* zone_abbr; // time-zone abbreviation (e.g., "PST")
835*9356374aSAndroid Build Coastguard Worker };
836*9356374aSAndroid Build Coastguard Worker
837*9356374aSAndroid Build Coastguard Worker // Time::In()
838*9356374aSAndroid Build Coastguard Worker //
839*9356374aSAndroid Build Coastguard Worker // Returns the breakdown of this instant in the given TimeZone.
840*9356374aSAndroid Build Coastguard Worker //
841*9356374aSAndroid Build Coastguard Worker // Deprecated. Use `absl::TimeZone::At(Time)`.
842*9356374aSAndroid Build Coastguard Worker ABSL_INTERNAL_DISABLE_DEPRECATED_DECLARATION_WARNING
843*9356374aSAndroid Build Coastguard Worker ABSL_DEPRECATED("Use `absl::TimeZone::At(Time)`.")
844*9356374aSAndroid Build Coastguard Worker Breakdown In(TimeZone tz) const;
845*9356374aSAndroid Build Coastguard Worker ABSL_INTERNAL_RESTORE_DEPRECATED_DECLARATION_WARNING
846*9356374aSAndroid Build Coastguard Worker
847*9356374aSAndroid Build Coastguard Worker template <typename H>
AbslHashValue(H h,Time t)848*9356374aSAndroid Build Coastguard Worker friend H AbslHashValue(H h, Time t) {
849*9356374aSAndroid Build Coastguard Worker return H::combine(std::move(h), t.rep_);
850*9356374aSAndroid Build Coastguard Worker }
851*9356374aSAndroid Build Coastguard Worker
852*9356374aSAndroid Build Coastguard Worker private:
853*9356374aSAndroid Build Coastguard Worker friend constexpr Time time_internal::FromUnixDuration(Duration d);
854*9356374aSAndroid Build Coastguard Worker friend constexpr Duration time_internal::ToUnixDuration(Time t);
855*9356374aSAndroid Build Coastguard Worker
856*9356374aSAndroid Build Coastguard Worker #ifdef __cpp_impl_three_way_comparison
857*9356374aSAndroid Build Coastguard Worker friend constexpr std::strong_ordering operator<=>(Time lhs, Time rhs);
858*9356374aSAndroid Build Coastguard Worker #endif // __cpp_impl_three_way_comparison
859*9356374aSAndroid Build Coastguard Worker
860*9356374aSAndroid Build Coastguard Worker friend constexpr bool operator<(Time lhs, Time rhs);
861*9356374aSAndroid Build Coastguard Worker friend constexpr bool operator==(Time lhs, Time rhs);
862*9356374aSAndroid Build Coastguard Worker friend Duration operator-(Time lhs, Time rhs);
863*9356374aSAndroid Build Coastguard Worker friend constexpr Time UniversalEpoch();
864*9356374aSAndroid Build Coastguard Worker friend constexpr Time InfiniteFuture();
865*9356374aSAndroid Build Coastguard Worker friend constexpr Time InfinitePast();
Time(Duration rep)866*9356374aSAndroid Build Coastguard Worker constexpr explicit Time(Duration rep) : rep_(rep) {}
867*9356374aSAndroid Build Coastguard Worker Duration rep_;
868*9356374aSAndroid Build Coastguard Worker };
869*9356374aSAndroid Build Coastguard Worker
870*9356374aSAndroid Build Coastguard Worker // Relational Operators
871*9356374aSAndroid Build Coastguard Worker #ifdef __cpp_impl_three_way_comparison
872*9356374aSAndroid Build Coastguard Worker
873*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr std::strong_ordering operator<=>(
874*9356374aSAndroid Build Coastguard Worker Time lhs, Time rhs) {
875*9356374aSAndroid Build Coastguard Worker return lhs.rep_ <=> rhs.rep_;
876*9356374aSAndroid Build Coastguard Worker }
877*9356374aSAndroid Build Coastguard Worker
878*9356374aSAndroid Build Coastguard Worker #endif // __cpp_impl_three_way_comparison
879*9356374aSAndroid Build Coastguard Worker
880*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr bool operator<(Time lhs, Time rhs) {
881*9356374aSAndroid Build Coastguard Worker return lhs.rep_ < rhs.rep_;
882*9356374aSAndroid Build Coastguard Worker }
883*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr bool operator>(Time lhs, Time rhs) {
884*9356374aSAndroid Build Coastguard Worker return rhs < lhs;
885*9356374aSAndroid Build Coastguard Worker }
886*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr bool operator>=(Time lhs, Time rhs) {
887*9356374aSAndroid Build Coastguard Worker return !(lhs < rhs);
888*9356374aSAndroid Build Coastguard Worker }
889*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr bool operator<=(Time lhs, Time rhs) {
890*9356374aSAndroid Build Coastguard Worker return !(rhs < lhs);
891*9356374aSAndroid Build Coastguard Worker }
892*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr bool operator==(Time lhs, Time rhs) {
893*9356374aSAndroid Build Coastguard Worker return lhs.rep_ == rhs.rep_;
894*9356374aSAndroid Build Coastguard Worker }
895*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr bool operator!=(Time lhs, Time rhs) {
896*9356374aSAndroid Build Coastguard Worker return !(lhs == rhs);
897*9356374aSAndroid Build Coastguard Worker }
898*9356374aSAndroid Build Coastguard Worker
899*9356374aSAndroid Build Coastguard Worker // Additive Operators
900*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION inline Time operator+(Time lhs, Duration rhs) {
901*9356374aSAndroid Build Coastguard Worker return lhs += rhs;
902*9356374aSAndroid Build Coastguard Worker }
903*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION inline Time operator+(Duration lhs, Time rhs) {
904*9356374aSAndroid Build Coastguard Worker return rhs += lhs;
905*9356374aSAndroid Build Coastguard Worker }
906*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION inline Time operator-(Time lhs, Duration rhs) {
907*9356374aSAndroid Build Coastguard Worker return lhs -= rhs;
908*9356374aSAndroid Build Coastguard Worker }
909*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION inline Duration operator-(Time lhs, Time rhs) {
910*9356374aSAndroid Build Coastguard Worker return lhs.rep_ - rhs.rep_;
911*9356374aSAndroid Build Coastguard Worker }
912*9356374aSAndroid Build Coastguard Worker
913*9356374aSAndroid Build Coastguard Worker // UnixEpoch()
914*9356374aSAndroid Build Coastguard Worker //
915*9356374aSAndroid Build Coastguard Worker // Returns the `absl::Time` representing "1970-01-01 00:00:00.0 +0000".
UnixEpoch()916*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr Time UnixEpoch() { return Time(); }
917*9356374aSAndroid Build Coastguard Worker
918*9356374aSAndroid Build Coastguard Worker // UniversalEpoch()
919*9356374aSAndroid Build Coastguard Worker //
920*9356374aSAndroid Build Coastguard Worker // Returns the `absl::Time` representing "0001-01-01 00:00:00.0 +0000", the
921*9356374aSAndroid Build Coastguard Worker // epoch of the ICU Universal Time Scale.
UniversalEpoch()922*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr Time UniversalEpoch() {
923*9356374aSAndroid Build Coastguard Worker // 719162 is the number of days from 0001-01-01 to 1970-01-01,
924*9356374aSAndroid Build Coastguard Worker // assuming the Gregorian calendar.
925*9356374aSAndroid Build Coastguard Worker return Time(
926*9356374aSAndroid Build Coastguard Worker time_internal::MakeDuration(-24 * 719162 * int64_t{3600}, uint32_t{0}));
927*9356374aSAndroid Build Coastguard Worker }
928*9356374aSAndroid Build Coastguard Worker
929*9356374aSAndroid Build Coastguard Worker // InfiniteFuture()
930*9356374aSAndroid Build Coastguard Worker //
931*9356374aSAndroid Build Coastguard Worker // Returns an `absl::Time` that is infinitely far in the future.
InfiniteFuture()932*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr Time InfiniteFuture() {
933*9356374aSAndroid Build Coastguard Worker return Time(time_internal::MakeDuration((std::numeric_limits<int64_t>::max)(),
934*9356374aSAndroid Build Coastguard Worker ~uint32_t{0}));
935*9356374aSAndroid Build Coastguard Worker }
936*9356374aSAndroid Build Coastguard Worker
937*9356374aSAndroid Build Coastguard Worker // InfinitePast()
938*9356374aSAndroid Build Coastguard Worker //
939*9356374aSAndroid Build Coastguard Worker // Returns an `absl::Time` that is infinitely far in the past.
InfinitePast()940*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr Time InfinitePast() {
941*9356374aSAndroid Build Coastguard Worker return Time(time_internal::MakeDuration((std::numeric_limits<int64_t>::min)(),
942*9356374aSAndroid Build Coastguard Worker ~uint32_t{0}));
943*9356374aSAndroid Build Coastguard Worker }
944*9356374aSAndroid Build Coastguard Worker
945*9356374aSAndroid Build Coastguard Worker // FromUnixNanos()
946*9356374aSAndroid Build Coastguard Worker // FromUnixMicros()
947*9356374aSAndroid Build Coastguard Worker // FromUnixMillis()
948*9356374aSAndroid Build Coastguard Worker // FromUnixSeconds()
949*9356374aSAndroid Build Coastguard Worker // FromTimeT()
950*9356374aSAndroid Build Coastguard Worker // FromUDate()
951*9356374aSAndroid Build Coastguard Worker // FromUniversal()
952*9356374aSAndroid Build Coastguard Worker //
953*9356374aSAndroid Build Coastguard Worker // Creates an `absl::Time` from a variety of other representations. See
954*9356374aSAndroid Build Coastguard Worker // https://unicode-org.github.io/icu/userguide/datetime/universaltimescale.html
955*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr Time FromUnixNanos(int64_t ns);
956*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr Time FromUnixMicros(int64_t us);
957*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr Time FromUnixMillis(int64_t ms);
958*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr Time FromUnixSeconds(int64_t s);
959*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr Time FromTimeT(time_t t);
960*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION Time FromUDate(double udate);
961*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION Time FromUniversal(int64_t universal);
962*9356374aSAndroid Build Coastguard Worker
963*9356374aSAndroid Build Coastguard Worker // ToUnixNanos()
964*9356374aSAndroid Build Coastguard Worker // ToUnixMicros()
965*9356374aSAndroid Build Coastguard Worker // ToUnixMillis()
966*9356374aSAndroid Build Coastguard Worker // ToUnixSeconds()
967*9356374aSAndroid Build Coastguard Worker // ToTimeT()
968*9356374aSAndroid Build Coastguard Worker // ToUDate()
969*9356374aSAndroid Build Coastguard Worker // ToUniversal()
970*9356374aSAndroid Build Coastguard Worker //
971*9356374aSAndroid Build Coastguard Worker // Converts an `absl::Time` to a variety of other representations. See
972*9356374aSAndroid Build Coastguard Worker // https://unicode-org.github.io/icu/userguide/datetime/universaltimescale.html
973*9356374aSAndroid Build Coastguard Worker //
974*9356374aSAndroid Build Coastguard Worker // Note that these operations round down toward negative infinity where
975*9356374aSAndroid Build Coastguard Worker // necessary to adjust to the resolution of the result type. Beware of
976*9356374aSAndroid Build Coastguard Worker // possible time_t over/underflow in ToTime{T,val,spec}() on 32-bit platforms.
977*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION int64_t ToUnixNanos(Time t);
978*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION int64_t ToUnixMicros(Time t);
979*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION int64_t ToUnixMillis(Time t);
980*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION int64_t ToUnixSeconds(Time t);
981*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION time_t ToTimeT(Time t);
982*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION double ToUDate(Time t);
983*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION int64_t ToUniversal(Time t);
984*9356374aSAndroid Build Coastguard Worker
985*9356374aSAndroid Build Coastguard Worker // DurationFromTimespec()
986*9356374aSAndroid Build Coastguard Worker // DurationFromTimeval()
987*9356374aSAndroid Build Coastguard Worker // ToTimespec()
988*9356374aSAndroid Build Coastguard Worker // ToTimeval()
989*9356374aSAndroid Build Coastguard Worker // TimeFromTimespec()
990*9356374aSAndroid Build Coastguard Worker // TimeFromTimeval()
991*9356374aSAndroid Build Coastguard Worker // ToTimespec()
992*9356374aSAndroid Build Coastguard Worker // ToTimeval()
993*9356374aSAndroid Build Coastguard Worker //
994*9356374aSAndroid Build Coastguard Worker // Some APIs use a timespec or a timeval as a Duration (e.g., nanosleep(2)
995*9356374aSAndroid Build Coastguard Worker // and select(2)), while others use them as a Time (e.g. clock_gettime(2)
996*9356374aSAndroid Build Coastguard Worker // and gettimeofday(2)), so conversion functions are provided for both cases.
997*9356374aSAndroid Build Coastguard Worker // The "to timespec/val" direction is easily handled via overloading, but
998*9356374aSAndroid Build Coastguard Worker // for "from timespec/val" the desired type is part of the function name.
999*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION Duration DurationFromTimespec(timespec ts);
1000*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION Duration DurationFromTimeval(timeval tv);
1001*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION timespec ToTimespec(Duration d);
1002*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION timeval ToTimeval(Duration d);
1003*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION Time TimeFromTimespec(timespec ts);
1004*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION Time TimeFromTimeval(timeval tv);
1005*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION timespec ToTimespec(Time t);
1006*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION timeval ToTimeval(Time t);
1007*9356374aSAndroid Build Coastguard Worker
1008*9356374aSAndroid Build Coastguard Worker // FromChrono()
1009*9356374aSAndroid Build Coastguard Worker //
1010*9356374aSAndroid Build Coastguard Worker // Converts a std::chrono::system_clock::time_point to an absl::Time.
1011*9356374aSAndroid Build Coastguard Worker //
1012*9356374aSAndroid Build Coastguard Worker // Example:
1013*9356374aSAndroid Build Coastguard Worker //
1014*9356374aSAndroid Build Coastguard Worker // auto tp = std::chrono::system_clock::from_time_t(123);
1015*9356374aSAndroid Build Coastguard Worker // absl::Time t = absl::FromChrono(tp);
1016*9356374aSAndroid Build Coastguard Worker // // t == absl::FromTimeT(123)
1017*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_PURE_FUNCTION Time
1018*9356374aSAndroid Build Coastguard Worker FromChrono(const std::chrono::system_clock::time_point& tp);
1019*9356374aSAndroid Build Coastguard Worker
1020*9356374aSAndroid Build Coastguard Worker // ToChronoTime()
1021*9356374aSAndroid Build Coastguard Worker //
1022*9356374aSAndroid Build Coastguard Worker // Converts an absl::Time to a std::chrono::system_clock::time_point. If
1023*9356374aSAndroid Build Coastguard Worker // overflow would occur, the returned value will saturate at the min/max time
1024*9356374aSAndroid Build Coastguard Worker // point value instead.
1025*9356374aSAndroid Build Coastguard Worker //
1026*9356374aSAndroid Build Coastguard Worker // Example:
1027*9356374aSAndroid Build Coastguard Worker //
1028*9356374aSAndroid Build Coastguard Worker // absl::Time t = absl::FromTimeT(123);
1029*9356374aSAndroid Build Coastguard Worker // auto tp = absl::ToChronoTime(t);
1030*9356374aSAndroid Build Coastguard Worker // // tp == std::chrono::system_clock::from_time_t(123);
1031*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION std::chrono::system_clock::time_point
1032*9356374aSAndroid Build Coastguard Worker ToChronoTime(Time);
1033*9356374aSAndroid Build Coastguard Worker
1034*9356374aSAndroid Build Coastguard Worker // AbslParseFlag()
1035*9356374aSAndroid Build Coastguard Worker //
1036*9356374aSAndroid Build Coastguard Worker // Parses the command-line flag string representation `text` into a Time value.
1037*9356374aSAndroid Build Coastguard Worker // Time flags must be specified in a format that matches absl::RFC3339_full.
1038*9356374aSAndroid Build Coastguard Worker //
1039*9356374aSAndroid Build Coastguard Worker // For example:
1040*9356374aSAndroid Build Coastguard Worker //
1041*9356374aSAndroid Build Coastguard Worker // --start_time=2016-01-02T03:04:05.678+08:00
1042*9356374aSAndroid Build Coastguard Worker //
1043*9356374aSAndroid Build Coastguard Worker // Note: A UTC offset (or 'Z' indicating a zero-offset from UTC) is required.
1044*9356374aSAndroid Build Coastguard Worker //
1045*9356374aSAndroid Build Coastguard Worker // Additionally, if you'd like to specify a time as a count of
1046*9356374aSAndroid Build Coastguard Worker // seconds/milliseconds/etc from the Unix epoch, use an absl::Duration flag
1047*9356374aSAndroid Build Coastguard Worker // and add that duration to absl::UnixEpoch() to get an absl::Time.
1048*9356374aSAndroid Build Coastguard Worker bool AbslParseFlag(absl::string_view text, Time* t, std::string* error);
1049*9356374aSAndroid Build Coastguard Worker
1050*9356374aSAndroid Build Coastguard Worker // AbslUnparseFlag()
1051*9356374aSAndroid Build Coastguard Worker //
1052*9356374aSAndroid Build Coastguard Worker // Unparses a Time value into a command-line string representation using
1053*9356374aSAndroid Build Coastguard Worker // the format specified by `absl::ParseTime()`.
1054*9356374aSAndroid Build Coastguard Worker std::string AbslUnparseFlag(Time t);
1055*9356374aSAndroid Build Coastguard Worker
1056*9356374aSAndroid Build Coastguard Worker ABSL_DEPRECATED("Use AbslParseFlag() instead.")
1057*9356374aSAndroid Build Coastguard Worker bool ParseFlag(const std::string& text, Time* t, std::string* error);
1058*9356374aSAndroid Build Coastguard Worker ABSL_DEPRECATED("Use AbslUnparseFlag() instead.")
1059*9356374aSAndroid Build Coastguard Worker std::string UnparseFlag(Time t);
1060*9356374aSAndroid Build Coastguard Worker
1061*9356374aSAndroid Build Coastguard Worker // TimeZone
1062*9356374aSAndroid Build Coastguard Worker //
1063*9356374aSAndroid Build Coastguard Worker // The `absl::TimeZone` is an opaque, small, value-type class representing a
1064*9356374aSAndroid Build Coastguard Worker // geo-political region within which particular rules are used for converting
1065*9356374aSAndroid Build Coastguard Worker // between absolute and civil times (see https://git.io/v59Ly). `absl::TimeZone`
1066*9356374aSAndroid Build Coastguard Worker // values are named using the TZ identifiers from the IANA Time Zone Database,
1067*9356374aSAndroid Build Coastguard Worker // such as "America/Los_Angeles" or "Australia/Sydney". `absl::TimeZone` values
1068*9356374aSAndroid Build Coastguard Worker // are created from factory functions such as `absl::LoadTimeZone()`. Note:
1069*9356374aSAndroid Build Coastguard Worker // strings like "PST" and "EDT" are not valid TZ identifiers. Prefer to pass by
1070*9356374aSAndroid Build Coastguard Worker // value rather than const reference.
1071*9356374aSAndroid Build Coastguard Worker //
1072*9356374aSAndroid Build Coastguard Worker // For more on the fundamental concepts of time zones, absolute times, and civil
1073*9356374aSAndroid Build Coastguard Worker // times, see https://github.com/google/cctz#fundamental-concepts
1074*9356374aSAndroid Build Coastguard Worker //
1075*9356374aSAndroid Build Coastguard Worker // Examples:
1076*9356374aSAndroid Build Coastguard Worker //
1077*9356374aSAndroid Build Coastguard Worker // absl::TimeZone utc = absl::UTCTimeZone();
1078*9356374aSAndroid Build Coastguard Worker // absl::TimeZone pst = absl::FixedTimeZone(-8 * 60 * 60);
1079*9356374aSAndroid Build Coastguard Worker // absl::TimeZone loc = absl::LocalTimeZone();
1080*9356374aSAndroid Build Coastguard Worker // absl::TimeZone lax;
1081*9356374aSAndroid Build Coastguard Worker // if (!absl::LoadTimeZone("America/Los_Angeles", &lax)) {
1082*9356374aSAndroid Build Coastguard Worker // // handle error case
1083*9356374aSAndroid Build Coastguard Worker // }
1084*9356374aSAndroid Build Coastguard Worker //
1085*9356374aSAndroid Build Coastguard Worker // See also:
1086*9356374aSAndroid Build Coastguard Worker // - https://github.com/google/cctz
1087*9356374aSAndroid Build Coastguard Worker // - https://www.iana.org/time-zones
1088*9356374aSAndroid Build Coastguard Worker // - https://en.wikipedia.org/wiki/Zoneinfo
1089*9356374aSAndroid Build Coastguard Worker class TimeZone {
1090*9356374aSAndroid Build Coastguard Worker public:
TimeZone(time_internal::cctz::time_zone tz)1091*9356374aSAndroid Build Coastguard Worker explicit TimeZone(time_internal::cctz::time_zone tz) : cz_(tz) {}
1092*9356374aSAndroid Build Coastguard Worker TimeZone() = default; // UTC, but prefer UTCTimeZone() to be explicit.
1093*9356374aSAndroid Build Coastguard Worker
1094*9356374aSAndroid Build Coastguard Worker // Copyable.
1095*9356374aSAndroid Build Coastguard Worker TimeZone(const TimeZone&) = default;
1096*9356374aSAndroid Build Coastguard Worker TimeZone& operator=(const TimeZone&) = default;
1097*9356374aSAndroid Build Coastguard Worker
time_zone()1098*9356374aSAndroid Build Coastguard Worker explicit operator time_internal::cctz::time_zone() const { return cz_; }
1099*9356374aSAndroid Build Coastguard Worker
name()1100*9356374aSAndroid Build Coastguard Worker std::string name() const { return cz_.name(); }
1101*9356374aSAndroid Build Coastguard Worker
1102*9356374aSAndroid Build Coastguard Worker // TimeZone::CivilInfo
1103*9356374aSAndroid Build Coastguard Worker //
1104*9356374aSAndroid Build Coastguard Worker // Information about the civil time corresponding to an absolute time.
1105*9356374aSAndroid Build Coastguard Worker // This struct is not intended to represent an instant in time. So, rather
1106*9356374aSAndroid Build Coastguard Worker // than passing a `TimeZone::CivilInfo` to a function, pass an `absl::Time`
1107*9356374aSAndroid Build Coastguard Worker // and an `absl::TimeZone`.
1108*9356374aSAndroid Build Coastguard Worker struct CivilInfo {
1109*9356374aSAndroid Build Coastguard Worker CivilSecond cs;
1110*9356374aSAndroid Build Coastguard Worker Duration subsecond;
1111*9356374aSAndroid Build Coastguard Worker
1112*9356374aSAndroid Build Coastguard Worker // Note: The following fields exist for backward compatibility
1113*9356374aSAndroid Build Coastguard Worker // with older APIs. Accessing these fields directly is a sign of
1114*9356374aSAndroid Build Coastguard Worker // imprudent logic in the calling code. Modern time-related code
1115*9356374aSAndroid Build Coastguard Worker // should only access this data indirectly by way of FormatTime().
1116*9356374aSAndroid Build Coastguard Worker // These fields are undefined for InfiniteFuture() and InfinitePast().
1117*9356374aSAndroid Build Coastguard Worker int offset; // seconds east of UTC
1118*9356374aSAndroid Build Coastguard Worker bool is_dst; // is offset non-standard?
1119*9356374aSAndroid Build Coastguard Worker const char* zone_abbr; // time-zone abbreviation (e.g., "PST")
1120*9356374aSAndroid Build Coastguard Worker };
1121*9356374aSAndroid Build Coastguard Worker
1122*9356374aSAndroid Build Coastguard Worker // TimeZone::At(Time)
1123*9356374aSAndroid Build Coastguard Worker //
1124*9356374aSAndroid Build Coastguard Worker // Returns the civil time for this TimeZone at a certain `absl::Time`.
1125*9356374aSAndroid Build Coastguard Worker // If the input time is infinite, the output civil second will be set to
1126*9356374aSAndroid Build Coastguard Worker // CivilSecond::max() or min(), and the subsecond will be infinite.
1127*9356374aSAndroid Build Coastguard Worker //
1128*9356374aSAndroid Build Coastguard Worker // Example:
1129*9356374aSAndroid Build Coastguard Worker //
1130*9356374aSAndroid Build Coastguard Worker // const auto epoch = lax.At(absl::UnixEpoch());
1131*9356374aSAndroid Build Coastguard Worker // // epoch.cs == 1969-12-31 16:00:00
1132*9356374aSAndroid Build Coastguard Worker // // epoch.subsecond == absl::ZeroDuration()
1133*9356374aSAndroid Build Coastguard Worker // // epoch.offset == -28800
1134*9356374aSAndroid Build Coastguard Worker // // epoch.is_dst == false
1135*9356374aSAndroid Build Coastguard Worker // // epoch.abbr == "PST"
1136*9356374aSAndroid Build Coastguard Worker CivilInfo At(Time t) const;
1137*9356374aSAndroid Build Coastguard Worker
1138*9356374aSAndroid Build Coastguard Worker // TimeZone::TimeInfo
1139*9356374aSAndroid Build Coastguard Worker //
1140*9356374aSAndroid Build Coastguard Worker // Information about the absolute times corresponding to a civil time.
1141*9356374aSAndroid Build Coastguard Worker // (Subseconds must be handled separately.)
1142*9356374aSAndroid Build Coastguard Worker //
1143*9356374aSAndroid Build Coastguard Worker // It is possible for a caller to pass a civil-time value that does
1144*9356374aSAndroid Build Coastguard Worker // not represent an actual or unique instant in time (due to a shift
1145*9356374aSAndroid Build Coastguard Worker // in UTC offset in the TimeZone, which results in a discontinuity in
1146*9356374aSAndroid Build Coastguard Worker // the civil-time components). For example, a daylight-saving-time
1147*9356374aSAndroid Build Coastguard Worker // transition skips or repeats civil times---in the United States,
1148*9356374aSAndroid Build Coastguard Worker // March 13, 2011 02:15 never occurred, while November 6, 2011 01:15
1149*9356374aSAndroid Build Coastguard Worker // occurred twice---so requests for such times are not well-defined.
1150*9356374aSAndroid Build Coastguard Worker // To account for these possibilities, `absl::TimeZone::TimeInfo` is
1151*9356374aSAndroid Build Coastguard Worker // richer than just a single `absl::Time`.
1152*9356374aSAndroid Build Coastguard Worker struct TimeInfo {
1153*9356374aSAndroid Build Coastguard Worker enum CivilKind {
1154*9356374aSAndroid Build Coastguard Worker UNIQUE, // the civil time was singular (pre == trans == post)
1155*9356374aSAndroid Build Coastguard Worker SKIPPED, // the civil time did not exist (pre >= trans > post)
1156*9356374aSAndroid Build Coastguard Worker REPEATED, // the civil time was ambiguous (pre < trans <= post)
1157*9356374aSAndroid Build Coastguard Worker } kind;
1158*9356374aSAndroid Build Coastguard Worker Time pre; // time calculated using the pre-transition offset
1159*9356374aSAndroid Build Coastguard Worker Time trans; // when the civil-time discontinuity occurred
1160*9356374aSAndroid Build Coastguard Worker Time post; // time calculated using the post-transition offset
1161*9356374aSAndroid Build Coastguard Worker };
1162*9356374aSAndroid Build Coastguard Worker
1163*9356374aSAndroid Build Coastguard Worker // TimeZone::At(CivilSecond)
1164*9356374aSAndroid Build Coastguard Worker //
1165*9356374aSAndroid Build Coastguard Worker // Returns an `absl::TimeInfo` containing the absolute time(s) for this
1166*9356374aSAndroid Build Coastguard Worker // TimeZone at an `absl::CivilSecond`. When the civil time is skipped or
1167*9356374aSAndroid Build Coastguard Worker // repeated, returns times calculated using the pre-transition and post-
1168*9356374aSAndroid Build Coastguard Worker // transition UTC offsets, plus the transition time itself.
1169*9356374aSAndroid Build Coastguard Worker //
1170*9356374aSAndroid Build Coastguard Worker // Examples:
1171*9356374aSAndroid Build Coastguard Worker //
1172*9356374aSAndroid Build Coastguard Worker // // A unique civil time
1173*9356374aSAndroid Build Coastguard Worker // const auto jan01 = lax.At(absl::CivilSecond(2011, 1, 1, 0, 0, 0));
1174*9356374aSAndroid Build Coastguard Worker // // jan01.kind == TimeZone::TimeInfo::UNIQUE
1175*9356374aSAndroid Build Coastguard Worker // // jan01.pre is 2011-01-01 00:00:00 -0800
1176*9356374aSAndroid Build Coastguard Worker // // jan01.trans is 2011-01-01 00:00:00 -0800
1177*9356374aSAndroid Build Coastguard Worker // // jan01.post is 2011-01-01 00:00:00 -0800
1178*9356374aSAndroid Build Coastguard Worker //
1179*9356374aSAndroid Build Coastguard Worker // // A Spring DST transition, when there is a gap in civil time
1180*9356374aSAndroid Build Coastguard Worker // const auto mar13 = lax.At(absl::CivilSecond(2011, 3, 13, 2, 15, 0));
1181*9356374aSAndroid Build Coastguard Worker // // mar13.kind == TimeZone::TimeInfo::SKIPPED
1182*9356374aSAndroid Build Coastguard Worker // // mar13.pre is 2011-03-13 03:15:00 -0700
1183*9356374aSAndroid Build Coastguard Worker // // mar13.trans is 2011-03-13 03:00:00 -0700
1184*9356374aSAndroid Build Coastguard Worker // // mar13.post is 2011-03-13 01:15:00 -0800
1185*9356374aSAndroid Build Coastguard Worker //
1186*9356374aSAndroid Build Coastguard Worker // // A Fall DST transition, when civil times are repeated
1187*9356374aSAndroid Build Coastguard Worker // const auto nov06 = lax.At(absl::CivilSecond(2011, 11, 6, 1, 15, 0));
1188*9356374aSAndroid Build Coastguard Worker // // nov06.kind == TimeZone::TimeInfo::REPEATED
1189*9356374aSAndroid Build Coastguard Worker // // nov06.pre is 2011-11-06 01:15:00 -0700
1190*9356374aSAndroid Build Coastguard Worker // // nov06.trans is 2011-11-06 01:00:00 -0800
1191*9356374aSAndroid Build Coastguard Worker // // nov06.post is 2011-11-06 01:15:00 -0800
1192*9356374aSAndroid Build Coastguard Worker TimeInfo At(CivilSecond ct) const;
1193*9356374aSAndroid Build Coastguard Worker
1194*9356374aSAndroid Build Coastguard Worker // TimeZone::NextTransition()
1195*9356374aSAndroid Build Coastguard Worker // TimeZone::PrevTransition()
1196*9356374aSAndroid Build Coastguard Worker //
1197*9356374aSAndroid Build Coastguard Worker // Finds the time of the next/previous offset change in this time zone.
1198*9356374aSAndroid Build Coastguard Worker //
1199*9356374aSAndroid Build Coastguard Worker // By definition, `NextTransition(t, &trans)` returns false when `t` is
1200*9356374aSAndroid Build Coastguard Worker // `InfiniteFuture()`, and `PrevTransition(t, &trans)` returns false
1201*9356374aSAndroid Build Coastguard Worker // when `t` is `InfinitePast()`. If the zone has no transitions, the
1202*9356374aSAndroid Build Coastguard Worker // result will also be false no matter what the argument.
1203*9356374aSAndroid Build Coastguard Worker //
1204*9356374aSAndroid Build Coastguard Worker // Otherwise, when `t` is `InfinitePast()`, `NextTransition(t, &trans)`
1205*9356374aSAndroid Build Coastguard Worker // returns true and sets `trans` to the first recorded transition. Chains
1206*9356374aSAndroid Build Coastguard Worker // of calls to `NextTransition()/PrevTransition()` will eventually return
1207*9356374aSAndroid Build Coastguard Worker // false, but it is unspecified exactly when `NextTransition(t, &trans)`
1208*9356374aSAndroid Build Coastguard Worker // jumps to false, or what time is set by `PrevTransition(t, &trans)` for
1209*9356374aSAndroid Build Coastguard Worker // a very distant `t`.
1210*9356374aSAndroid Build Coastguard Worker //
1211*9356374aSAndroid Build Coastguard Worker // Note: Enumeration of time-zone transitions is for informational purposes
1212*9356374aSAndroid Build Coastguard Worker // only. Modern time-related code should not care about when offset changes
1213*9356374aSAndroid Build Coastguard Worker // occur.
1214*9356374aSAndroid Build Coastguard Worker //
1215*9356374aSAndroid Build Coastguard Worker // Example:
1216*9356374aSAndroid Build Coastguard Worker // absl::TimeZone nyc;
1217*9356374aSAndroid Build Coastguard Worker // if (!absl::LoadTimeZone("America/New_York", &nyc)) { ... }
1218*9356374aSAndroid Build Coastguard Worker // const auto now = absl::Now();
1219*9356374aSAndroid Build Coastguard Worker // auto t = absl::InfinitePast();
1220*9356374aSAndroid Build Coastguard Worker // absl::TimeZone::CivilTransition trans;
1221*9356374aSAndroid Build Coastguard Worker // while (t <= now && nyc.NextTransition(t, &trans)) {
1222*9356374aSAndroid Build Coastguard Worker // // transition: trans.from -> trans.to
1223*9356374aSAndroid Build Coastguard Worker // t = nyc.At(trans.to).trans;
1224*9356374aSAndroid Build Coastguard Worker // }
1225*9356374aSAndroid Build Coastguard Worker struct CivilTransition {
1226*9356374aSAndroid Build Coastguard Worker CivilSecond from; // the civil time we jump from
1227*9356374aSAndroid Build Coastguard Worker CivilSecond to; // the civil time we jump to
1228*9356374aSAndroid Build Coastguard Worker };
1229*9356374aSAndroid Build Coastguard Worker bool NextTransition(Time t, CivilTransition* trans) const;
1230*9356374aSAndroid Build Coastguard Worker bool PrevTransition(Time t, CivilTransition* trans) const;
1231*9356374aSAndroid Build Coastguard Worker
1232*9356374aSAndroid Build Coastguard Worker template <typename H>
AbslHashValue(H h,TimeZone tz)1233*9356374aSAndroid Build Coastguard Worker friend H AbslHashValue(H h, TimeZone tz) {
1234*9356374aSAndroid Build Coastguard Worker return H::combine(std::move(h), tz.cz_);
1235*9356374aSAndroid Build Coastguard Worker }
1236*9356374aSAndroid Build Coastguard Worker
1237*9356374aSAndroid Build Coastguard Worker private:
1238*9356374aSAndroid Build Coastguard Worker friend bool operator==(TimeZone a, TimeZone b) { return a.cz_ == b.cz_; }
1239*9356374aSAndroid Build Coastguard Worker friend bool operator!=(TimeZone a, TimeZone b) { return a.cz_ != b.cz_; }
1240*9356374aSAndroid Build Coastguard Worker friend std::ostream& operator<<(std::ostream& os, TimeZone tz) {
1241*9356374aSAndroid Build Coastguard Worker return os << tz.name();
1242*9356374aSAndroid Build Coastguard Worker }
1243*9356374aSAndroid Build Coastguard Worker
1244*9356374aSAndroid Build Coastguard Worker time_internal::cctz::time_zone cz_;
1245*9356374aSAndroid Build Coastguard Worker };
1246*9356374aSAndroid Build Coastguard Worker
1247*9356374aSAndroid Build Coastguard Worker // LoadTimeZone()
1248*9356374aSAndroid Build Coastguard Worker //
1249*9356374aSAndroid Build Coastguard Worker // Loads the named zone. May perform I/O on the initial load of the named
1250*9356374aSAndroid Build Coastguard Worker // zone. If the name is invalid, or some other kind of error occurs, returns
1251*9356374aSAndroid Build Coastguard Worker // `false` and `*tz` is set to the UTC time zone.
LoadTimeZone(absl::string_view name,TimeZone * tz)1252*9356374aSAndroid Build Coastguard Worker inline bool LoadTimeZone(absl::string_view name, TimeZone* tz) {
1253*9356374aSAndroid Build Coastguard Worker if (name == "localtime") {
1254*9356374aSAndroid Build Coastguard Worker *tz = TimeZone(time_internal::cctz::local_time_zone());
1255*9356374aSAndroid Build Coastguard Worker return true;
1256*9356374aSAndroid Build Coastguard Worker }
1257*9356374aSAndroid Build Coastguard Worker time_internal::cctz::time_zone cz;
1258*9356374aSAndroid Build Coastguard Worker const bool b = time_internal::cctz::load_time_zone(std::string(name), &cz);
1259*9356374aSAndroid Build Coastguard Worker *tz = TimeZone(cz);
1260*9356374aSAndroid Build Coastguard Worker return b;
1261*9356374aSAndroid Build Coastguard Worker }
1262*9356374aSAndroid Build Coastguard Worker
1263*9356374aSAndroid Build Coastguard Worker // FixedTimeZone()
1264*9356374aSAndroid Build Coastguard Worker //
1265*9356374aSAndroid Build Coastguard Worker // Returns a TimeZone that is a fixed offset (seconds east) from UTC.
1266*9356374aSAndroid Build Coastguard Worker // Note: If the absolute value of the offset is greater than 24 hours
1267*9356374aSAndroid Build Coastguard Worker // you'll get UTC (i.e., no offset) instead.
FixedTimeZone(int seconds)1268*9356374aSAndroid Build Coastguard Worker inline TimeZone FixedTimeZone(int seconds) {
1269*9356374aSAndroid Build Coastguard Worker return TimeZone(
1270*9356374aSAndroid Build Coastguard Worker time_internal::cctz::fixed_time_zone(std::chrono::seconds(seconds)));
1271*9356374aSAndroid Build Coastguard Worker }
1272*9356374aSAndroid Build Coastguard Worker
1273*9356374aSAndroid Build Coastguard Worker // UTCTimeZone()
1274*9356374aSAndroid Build Coastguard Worker //
1275*9356374aSAndroid Build Coastguard Worker // Convenience method returning the UTC time zone.
UTCTimeZone()1276*9356374aSAndroid Build Coastguard Worker inline TimeZone UTCTimeZone() {
1277*9356374aSAndroid Build Coastguard Worker return TimeZone(time_internal::cctz::utc_time_zone());
1278*9356374aSAndroid Build Coastguard Worker }
1279*9356374aSAndroid Build Coastguard Worker
1280*9356374aSAndroid Build Coastguard Worker // LocalTimeZone()
1281*9356374aSAndroid Build Coastguard Worker //
1282*9356374aSAndroid Build Coastguard Worker // Convenience method returning the local time zone, or UTC if there is
1283*9356374aSAndroid Build Coastguard Worker // no configured local zone. Warning: Be wary of using LocalTimeZone(),
1284*9356374aSAndroid Build Coastguard Worker // and particularly so in a server process, as the zone configured for the
1285*9356374aSAndroid Build Coastguard Worker // local machine should be irrelevant. Prefer an explicit zone name.
LocalTimeZone()1286*9356374aSAndroid Build Coastguard Worker inline TimeZone LocalTimeZone() {
1287*9356374aSAndroid Build Coastguard Worker return TimeZone(time_internal::cctz::local_time_zone());
1288*9356374aSAndroid Build Coastguard Worker }
1289*9356374aSAndroid Build Coastguard Worker
1290*9356374aSAndroid Build Coastguard Worker // ToCivilSecond()
1291*9356374aSAndroid Build Coastguard Worker // ToCivilMinute()
1292*9356374aSAndroid Build Coastguard Worker // ToCivilHour()
1293*9356374aSAndroid Build Coastguard Worker // ToCivilDay()
1294*9356374aSAndroid Build Coastguard Worker // ToCivilMonth()
1295*9356374aSAndroid Build Coastguard Worker // ToCivilYear()
1296*9356374aSAndroid Build Coastguard Worker //
1297*9356374aSAndroid Build Coastguard Worker // Helpers for TimeZone::At(Time) to return particularly aligned civil times.
1298*9356374aSAndroid Build Coastguard Worker //
1299*9356374aSAndroid Build Coastguard Worker // Example:
1300*9356374aSAndroid Build Coastguard Worker //
1301*9356374aSAndroid Build Coastguard Worker // absl::Time t = ...;
1302*9356374aSAndroid Build Coastguard Worker // absl::TimeZone tz = ...;
1303*9356374aSAndroid Build Coastguard Worker // const auto cd = absl::ToCivilDay(t, tz);
ToCivilSecond(Time t,TimeZone tz)1304*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_PURE_FUNCTION inline CivilSecond ToCivilSecond(Time t,
1305*9356374aSAndroid Build Coastguard Worker TimeZone tz) {
1306*9356374aSAndroid Build Coastguard Worker return tz.At(t).cs; // already a CivilSecond
1307*9356374aSAndroid Build Coastguard Worker }
ToCivilMinute(Time t,TimeZone tz)1308*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_PURE_FUNCTION inline CivilMinute ToCivilMinute(Time t,
1309*9356374aSAndroid Build Coastguard Worker TimeZone tz) {
1310*9356374aSAndroid Build Coastguard Worker return CivilMinute(tz.At(t).cs);
1311*9356374aSAndroid Build Coastguard Worker }
ToCivilHour(Time t,TimeZone tz)1312*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_PURE_FUNCTION inline CivilHour ToCivilHour(Time t, TimeZone tz) {
1313*9356374aSAndroid Build Coastguard Worker return CivilHour(tz.At(t).cs);
1314*9356374aSAndroid Build Coastguard Worker }
ToCivilDay(Time t,TimeZone tz)1315*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_PURE_FUNCTION inline CivilDay ToCivilDay(Time t, TimeZone tz) {
1316*9356374aSAndroid Build Coastguard Worker return CivilDay(tz.At(t).cs);
1317*9356374aSAndroid Build Coastguard Worker }
ToCivilMonth(Time t,TimeZone tz)1318*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_PURE_FUNCTION inline CivilMonth ToCivilMonth(Time t,
1319*9356374aSAndroid Build Coastguard Worker TimeZone tz) {
1320*9356374aSAndroid Build Coastguard Worker return CivilMonth(tz.At(t).cs);
1321*9356374aSAndroid Build Coastguard Worker }
ToCivilYear(Time t,TimeZone tz)1322*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_PURE_FUNCTION inline CivilYear ToCivilYear(Time t, TimeZone tz) {
1323*9356374aSAndroid Build Coastguard Worker return CivilYear(tz.At(t).cs);
1324*9356374aSAndroid Build Coastguard Worker }
1325*9356374aSAndroid Build Coastguard Worker
1326*9356374aSAndroid Build Coastguard Worker // FromCivil()
1327*9356374aSAndroid Build Coastguard Worker //
1328*9356374aSAndroid Build Coastguard Worker // Helper for TimeZone::At(CivilSecond) that provides "order-preserving
1329*9356374aSAndroid Build Coastguard Worker // semantics." If the civil time maps to a unique time, that time is
1330*9356374aSAndroid Build Coastguard Worker // returned. If the civil time is repeated in the given time zone, the
1331*9356374aSAndroid Build Coastguard Worker // time using the pre-transition offset is returned. Otherwise, the
1332*9356374aSAndroid Build Coastguard Worker // civil time is skipped in the given time zone, and the transition time
1333*9356374aSAndroid Build Coastguard Worker // is returned. This means that for any two civil times, ct1 and ct2,
1334*9356374aSAndroid Build Coastguard Worker // (ct1 < ct2) => (FromCivil(ct1) <= FromCivil(ct2)), the equal case
1335*9356374aSAndroid Build Coastguard Worker // being when two non-existent civil times map to the same transition time.
1336*9356374aSAndroid Build Coastguard Worker //
1337*9356374aSAndroid Build Coastguard Worker // Note: Accepts civil times of any alignment.
FromCivil(CivilSecond ct,TimeZone tz)1338*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_PURE_FUNCTION inline Time FromCivil(CivilSecond ct,
1339*9356374aSAndroid Build Coastguard Worker TimeZone tz) {
1340*9356374aSAndroid Build Coastguard Worker const auto ti = tz.At(ct);
1341*9356374aSAndroid Build Coastguard Worker if (ti.kind == TimeZone::TimeInfo::SKIPPED) return ti.trans;
1342*9356374aSAndroid Build Coastguard Worker return ti.pre;
1343*9356374aSAndroid Build Coastguard Worker }
1344*9356374aSAndroid Build Coastguard Worker
1345*9356374aSAndroid Build Coastguard Worker // TimeConversion
1346*9356374aSAndroid Build Coastguard Worker //
1347*9356374aSAndroid Build Coastguard Worker // An `absl::TimeConversion` represents the conversion of year, month, day,
1348*9356374aSAndroid Build Coastguard Worker // hour, minute, and second values (i.e., a civil time), in a particular
1349*9356374aSAndroid Build Coastguard Worker // `absl::TimeZone`, to a time instant (an absolute time), as returned by
1350*9356374aSAndroid Build Coastguard Worker // `absl::ConvertDateTime()`. Legacy version of `absl::TimeZone::TimeInfo`.
1351*9356374aSAndroid Build Coastguard Worker //
1352*9356374aSAndroid Build Coastguard Worker // Deprecated. Use `absl::TimeZone::TimeInfo`.
1353*9356374aSAndroid Build Coastguard Worker struct ABSL_DEPRECATED("Use `absl::TimeZone::TimeInfo`.") TimeConversion {
1354*9356374aSAndroid Build Coastguard Worker Time pre; // time calculated using the pre-transition offset
1355*9356374aSAndroid Build Coastguard Worker Time trans; // when the civil-time discontinuity occurred
1356*9356374aSAndroid Build Coastguard Worker Time post; // time calculated using the post-transition offset
1357*9356374aSAndroid Build Coastguard Worker
1358*9356374aSAndroid Build Coastguard Worker enum Kind {
1359*9356374aSAndroid Build Coastguard Worker UNIQUE, // the civil time was singular (pre == trans == post)
1360*9356374aSAndroid Build Coastguard Worker SKIPPED, // the civil time did not exist
1361*9356374aSAndroid Build Coastguard Worker REPEATED, // the civil time was ambiguous
1362*9356374aSAndroid Build Coastguard Worker };
1363*9356374aSAndroid Build Coastguard Worker Kind kind;
1364*9356374aSAndroid Build Coastguard Worker
1365*9356374aSAndroid Build Coastguard Worker bool normalized; // input values were outside their valid ranges
1366*9356374aSAndroid Build Coastguard Worker };
1367*9356374aSAndroid Build Coastguard Worker
1368*9356374aSAndroid Build Coastguard Worker // ConvertDateTime()
1369*9356374aSAndroid Build Coastguard Worker //
1370*9356374aSAndroid Build Coastguard Worker // Legacy version of `absl::TimeZone::At(absl::CivilSecond)` that takes
1371*9356374aSAndroid Build Coastguard Worker // the civil time as six, separate values (YMDHMS).
1372*9356374aSAndroid Build Coastguard Worker //
1373*9356374aSAndroid Build Coastguard Worker // The input month, day, hour, minute, and second values can be outside
1374*9356374aSAndroid Build Coastguard Worker // of their valid ranges, in which case they will be "normalized" during
1375*9356374aSAndroid Build Coastguard Worker // the conversion.
1376*9356374aSAndroid Build Coastguard Worker //
1377*9356374aSAndroid Build Coastguard Worker // Example:
1378*9356374aSAndroid Build Coastguard Worker //
1379*9356374aSAndroid Build Coastguard Worker // // "October 32" normalizes to "November 1".
1380*9356374aSAndroid Build Coastguard Worker // absl::TimeConversion tc =
1381*9356374aSAndroid Build Coastguard Worker // absl::ConvertDateTime(2013, 10, 32, 8, 30, 0, lax);
1382*9356374aSAndroid Build Coastguard Worker // // tc.kind == TimeConversion::UNIQUE && tc.normalized == true
1383*9356374aSAndroid Build Coastguard Worker // // absl::ToCivilDay(tc.pre, tz).month() == 11
1384*9356374aSAndroid Build Coastguard Worker // // absl::ToCivilDay(tc.pre, tz).day() == 1
1385*9356374aSAndroid Build Coastguard Worker //
1386*9356374aSAndroid Build Coastguard Worker // Deprecated. Use `absl::TimeZone::At(CivilSecond)`.
1387*9356374aSAndroid Build Coastguard Worker ABSL_INTERNAL_DISABLE_DEPRECATED_DECLARATION_WARNING
1388*9356374aSAndroid Build Coastguard Worker ABSL_DEPRECATED("Use `absl::TimeZone::At(CivilSecond)`.")
1389*9356374aSAndroid Build Coastguard Worker TimeConversion ConvertDateTime(int64_t year, int mon, int day, int hour,
1390*9356374aSAndroid Build Coastguard Worker int min, int sec, TimeZone tz);
1391*9356374aSAndroid Build Coastguard Worker ABSL_INTERNAL_RESTORE_DEPRECATED_DECLARATION_WARNING
1392*9356374aSAndroid Build Coastguard Worker
1393*9356374aSAndroid Build Coastguard Worker // FromDateTime()
1394*9356374aSAndroid Build Coastguard Worker //
1395*9356374aSAndroid Build Coastguard Worker // A convenience wrapper for `absl::ConvertDateTime()` that simply returns
1396*9356374aSAndroid Build Coastguard Worker // the "pre" `absl::Time`. That is, the unique result, or the instant that
1397*9356374aSAndroid Build Coastguard Worker // is correct using the pre-transition offset (as if the transition never
1398*9356374aSAndroid Build Coastguard Worker // happened).
1399*9356374aSAndroid Build Coastguard Worker //
1400*9356374aSAndroid Build Coastguard Worker // Example:
1401*9356374aSAndroid Build Coastguard Worker //
1402*9356374aSAndroid Build Coastguard Worker // absl::Time t = absl::FromDateTime(2017, 9, 26, 9, 30, 0, lax);
1403*9356374aSAndroid Build Coastguard Worker // // t = 2017-09-26 09:30:00 -0700
1404*9356374aSAndroid Build Coastguard Worker //
1405*9356374aSAndroid Build Coastguard Worker // Deprecated. Use `absl::FromCivil(CivilSecond, TimeZone)`. Note that the
1406*9356374aSAndroid Build Coastguard Worker // behavior of `FromCivil()` differs from `FromDateTime()` for skipped civil
1407*9356374aSAndroid Build Coastguard Worker // times. If you care about that see `absl::TimeZone::At(absl::CivilSecond)`.
1408*9356374aSAndroid Build Coastguard Worker ABSL_DEPRECATED("Use `absl::FromCivil(CivilSecond, TimeZone)`.")
FromDateTime(int64_t year,int mon,int day,int hour,int min,int sec,TimeZone tz)1409*9356374aSAndroid Build Coastguard Worker inline Time FromDateTime(int64_t year, int mon, int day, int hour, int min,
1410*9356374aSAndroid Build Coastguard Worker int sec, TimeZone tz) {
1411*9356374aSAndroid Build Coastguard Worker ABSL_INTERNAL_DISABLE_DEPRECATED_DECLARATION_WARNING
1412*9356374aSAndroid Build Coastguard Worker return ConvertDateTime(year, mon, day, hour, min, sec, tz).pre;
1413*9356374aSAndroid Build Coastguard Worker ABSL_INTERNAL_RESTORE_DEPRECATED_DECLARATION_WARNING
1414*9356374aSAndroid Build Coastguard Worker }
1415*9356374aSAndroid Build Coastguard Worker
1416*9356374aSAndroid Build Coastguard Worker // FromTM()
1417*9356374aSAndroid Build Coastguard Worker //
1418*9356374aSAndroid Build Coastguard Worker // Converts the `tm_year`, `tm_mon`, `tm_mday`, `tm_hour`, `tm_min`, and
1419*9356374aSAndroid Build Coastguard Worker // `tm_sec` fields to an `absl::Time` using the given time zone. See ctime(3)
1420*9356374aSAndroid Build Coastguard Worker // for a description of the expected values of the tm fields. If the civil time
1421*9356374aSAndroid Build Coastguard Worker // is unique (see `absl::TimeZone::At(absl::CivilSecond)` above), the matching
1422*9356374aSAndroid Build Coastguard Worker // time instant is returned. Otherwise, the `tm_isdst` field is consulted to
1423*9356374aSAndroid Build Coastguard Worker // choose between the possible results. For a repeated civil time, `tm_isdst !=
1424*9356374aSAndroid Build Coastguard Worker // 0` returns the matching DST instant, while `tm_isdst == 0` returns the
1425*9356374aSAndroid Build Coastguard Worker // matching non-DST instant. For a skipped civil time there is no matching
1426*9356374aSAndroid Build Coastguard Worker // instant, so `tm_isdst != 0` returns the DST instant, and `tm_isdst == 0`
1427*9356374aSAndroid Build Coastguard Worker // returns the non-DST instant, that would have matched if the transition never
1428*9356374aSAndroid Build Coastguard Worker // happened.
1429*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_PURE_FUNCTION Time FromTM(const struct tm& tm, TimeZone tz);
1430*9356374aSAndroid Build Coastguard Worker
1431*9356374aSAndroid Build Coastguard Worker // ToTM()
1432*9356374aSAndroid Build Coastguard Worker //
1433*9356374aSAndroid Build Coastguard Worker // Converts the given `absl::Time` to a struct tm using the given time zone.
1434*9356374aSAndroid Build Coastguard Worker // See ctime(3) for a description of the values of the tm fields.
1435*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_PURE_FUNCTION struct tm ToTM(Time t, TimeZone tz);
1436*9356374aSAndroid Build Coastguard Worker
1437*9356374aSAndroid Build Coastguard Worker // RFC3339_full
1438*9356374aSAndroid Build Coastguard Worker // RFC3339_sec
1439*9356374aSAndroid Build Coastguard Worker //
1440*9356374aSAndroid Build Coastguard Worker // FormatTime()/ParseTime() format specifiers for RFC3339 date/time strings,
1441*9356374aSAndroid Build Coastguard Worker // with trailing zeros trimmed or with fractional seconds omitted altogether.
1442*9356374aSAndroid Build Coastguard Worker //
1443*9356374aSAndroid Build Coastguard Worker // Note that RFC3339_sec[] matches an ISO 8601 extended format for date and
1444*9356374aSAndroid Build Coastguard Worker // time with UTC offset. Also note the use of "%Y": RFC3339 mandates that
1445*9356374aSAndroid Build Coastguard Worker // years have exactly four digits, but we allow them to take their natural
1446*9356374aSAndroid Build Coastguard Worker // width.
1447*9356374aSAndroid Build Coastguard Worker ABSL_DLL extern const char RFC3339_full[]; // %Y-%m-%d%ET%H:%M:%E*S%Ez
1448*9356374aSAndroid Build Coastguard Worker ABSL_DLL extern const char RFC3339_sec[]; // %Y-%m-%d%ET%H:%M:%S%Ez
1449*9356374aSAndroid Build Coastguard Worker
1450*9356374aSAndroid Build Coastguard Worker // RFC1123_full
1451*9356374aSAndroid Build Coastguard Worker // RFC1123_no_wday
1452*9356374aSAndroid Build Coastguard Worker //
1453*9356374aSAndroid Build Coastguard Worker // FormatTime()/ParseTime() format specifiers for RFC1123 date/time strings.
1454*9356374aSAndroid Build Coastguard Worker ABSL_DLL extern const char RFC1123_full[]; // %a, %d %b %E4Y %H:%M:%S %z
1455*9356374aSAndroid Build Coastguard Worker ABSL_DLL extern const char RFC1123_no_wday[]; // %d %b %E4Y %H:%M:%S %z
1456*9356374aSAndroid Build Coastguard Worker
1457*9356374aSAndroid Build Coastguard Worker // FormatTime()
1458*9356374aSAndroid Build Coastguard Worker //
1459*9356374aSAndroid Build Coastguard Worker // Formats the given `absl::Time` in the `absl::TimeZone` according to the
1460*9356374aSAndroid Build Coastguard Worker // provided format string. Uses strftime()-like formatting options, with
1461*9356374aSAndroid Build Coastguard Worker // the following extensions:
1462*9356374aSAndroid Build Coastguard Worker //
1463*9356374aSAndroid Build Coastguard Worker // - %Ez - RFC3339-compatible numeric UTC offset (+hh:mm or -hh:mm)
1464*9356374aSAndroid Build Coastguard Worker // - %E*z - Full-resolution numeric UTC offset (+hh:mm:ss or -hh:mm:ss)
1465*9356374aSAndroid Build Coastguard Worker // - %E#S - Seconds with # digits of fractional precision
1466*9356374aSAndroid Build Coastguard Worker // - %E*S - Seconds with full fractional precision (a literal '*')
1467*9356374aSAndroid Build Coastguard Worker // - %E#f - Fractional seconds with # digits of precision
1468*9356374aSAndroid Build Coastguard Worker // - %E*f - Fractional seconds with full precision (a literal '*')
1469*9356374aSAndroid Build Coastguard Worker // - %E4Y - Four-character years (-999 ... -001, 0000, 0001 ... 9999)
1470*9356374aSAndroid Build Coastguard Worker // - %ET - The RFC3339 "date-time" separator "T"
1471*9356374aSAndroid Build Coastguard Worker //
1472*9356374aSAndroid Build Coastguard Worker // Note that %E0S behaves like %S, and %E0f produces no characters. In
1473*9356374aSAndroid Build Coastguard Worker // contrast %E*f always produces at least one digit, which may be '0'.
1474*9356374aSAndroid Build Coastguard Worker //
1475*9356374aSAndroid Build Coastguard Worker // Note that %Y produces as many characters as it takes to fully render the
1476*9356374aSAndroid Build Coastguard Worker // year. A year outside of [-999:9999] when formatted with %E4Y will produce
1477*9356374aSAndroid Build Coastguard Worker // more than four characters, just like %Y.
1478*9356374aSAndroid Build Coastguard Worker //
1479*9356374aSAndroid Build Coastguard Worker // We recommend that format strings include the UTC offset (%z, %Ez, or %E*z)
1480*9356374aSAndroid Build Coastguard Worker // so that the result uniquely identifies a time instant.
1481*9356374aSAndroid Build Coastguard Worker //
1482*9356374aSAndroid Build Coastguard Worker // Example:
1483*9356374aSAndroid Build Coastguard Worker //
1484*9356374aSAndroid Build Coastguard Worker // absl::CivilSecond cs(2013, 1, 2, 3, 4, 5);
1485*9356374aSAndroid Build Coastguard Worker // absl::Time t = absl::FromCivil(cs, lax);
1486*9356374aSAndroid Build Coastguard Worker // std::string f = absl::FormatTime("%H:%M:%S", t, lax); // "03:04:05"
1487*9356374aSAndroid Build Coastguard Worker // f = absl::FormatTime("%H:%M:%E3S", t, lax); // "03:04:05.000"
1488*9356374aSAndroid Build Coastguard Worker //
1489*9356374aSAndroid Build Coastguard Worker // Note: If the given `absl::Time` is `absl::InfiniteFuture()`, the returned
1490*9356374aSAndroid Build Coastguard Worker // string will be exactly "infinite-future". If the given `absl::Time` is
1491*9356374aSAndroid Build Coastguard Worker // `absl::InfinitePast()`, the returned string will be exactly "infinite-past".
1492*9356374aSAndroid Build Coastguard Worker // In both cases the given format string and `absl::TimeZone` are ignored.
1493*9356374aSAndroid Build Coastguard Worker //
1494*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_PURE_FUNCTION std::string FormatTime(absl::string_view format,
1495*9356374aSAndroid Build Coastguard Worker Time t, TimeZone tz);
1496*9356374aSAndroid Build Coastguard Worker
1497*9356374aSAndroid Build Coastguard Worker // Convenience functions that format the given time using the RFC3339_full
1498*9356374aSAndroid Build Coastguard Worker // format. The first overload uses the provided TimeZone, while the second
1499*9356374aSAndroid Build Coastguard Worker // uses LocalTimeZone().
1500*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_PURE_FUNCTION std::string FormatTime(Time t, TimeZone tz);
1501*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_PURE_FUNCTION std::string FormatTime(Time t);
1502*9356374aSAndroid Build Coastguard Worker
1503*9356374aSAndroid Build Coastguard Worker // Output stream operator.
1504*9356374aSAndroid Build Coastguard Worker inline std::ostream& operator<<(std::ostream& os, Time t) {
1505*9356374aSAndroid Build Coastguard Worker return os << FormatTime(t);
1506*9356374aSAndroid Build Coastguard Worker }
1507*9356374aSAndroid Build Coastguard Worker
1508*9356374aSAndroid Build Coastguard Worker // Support for StrFormat(), StrCat() etc.
1509*9356374aSAndroid Build Coastguard Worker template <typename Sink>
AbslStringify(Sink & sink,Time t)1510*9356374aSAndroid Build Coastguard Worker void AbslStringify(Sink& sink, Time t) {
1511*9356374aSAndroid Build Coastguard Worker sink.Append(FormatTime(t));
1512*9356374aSAndroid Build Coastguard Worker }
1513*9356374aSAndroid Build Coastguard Worker
1514*9356374aSAndroid Build Coastguard Worker // ParseTime()
1515*9356374aSAndroid Build Coastguard Worker //
1516*9356374aSAndroid Build Coastguard Worker // Parses an input string according to the provided format string and
1517*9356374aSAndroid Build Coastguard Worker // returns the corresponding `absl::Time`. Uses strftime()-like formatting
1518*9356374aSAndroid Build Coastguard Worker // options, with the same extensions as FormatTime(), but with the
1519*9356374aSAndroid Build Coastguard Worker // exceptions that %E#S is interpreted as %E*S, and %E#f as %E*f. %Ez
1520*9356374aSAndroid Build Coastguard Worker // and %E*z also accept the same inputs, which (along with %z) includes
1521*9356374aSAndroid Build Coastguard Worker // 'z' and 'Z' as synonyms for +00:00. %ET accepts either 'T' or 't'.
1522*9356374aSAndroid Build Coastguard Worker //
1523*9356374aSAndroid Build Coastguard Worker // %Y consumes as many numeric characters as it can, so the matching data
1524*9356374aSAndroid Build Coastguard Worker // should always be terminated with a non-numeric. %E4Y always consumes
1525*9356374aSAndroid Build Coastguard Worker // exactly four characters, including any sign.
1526*9356374aSAndroid Build Coastguard Worker //
1527*9356374aSAndroid Build Coastguard Worker // Unspecified fields are taken from the default date and time of ...
1528*9356374aSAndroid Build Coastguard Worker //
1529*9356374aSAndroid Build Coastguard Worker // "1970-01-01 00:00:00.0 +0000"
1530*9356374aSAndroid Build Coastguard Worker //
1531*9356374aSAndroid Build Coastguard Worker // For example, parsing a string of "15:45" (%H:%M) will return an absl::Time
1532*9356374aSAndroid Build Coastguard Worker // that represents "1970-01-01 15:45:00.0 +0000".
1533*9356374aSAndroid Build Coastguard Worker //
1534*9356374aSAndroid Build Coastguard Worker // Note that since ParseTime() returns time instants, it makes the most sense
1535*9356374aSAndroid Build Coastguard Worker // to parse fully-specified date/time strings that include a UTC offset (%z,
1536*9356374aSAndroid Build Coastguard Worker // %Ez, or %E*z).
1537*9356374aSAndroid Build Coastguard Worker //
1538*9356374aSAndroid Build Coastguard Worker // Note also that `absl::ParseTime()` only heeds the fields year, month, day,
1539*9356374aSAndroid Build Coastguard Worker // hour, minute, (fractional) second, and UTC offset. Other fields, like
1540*9356374aSAndroid Build Coastguard Worker // weekday (%a or %A), while parsed for syntactic validity, are ignored
1541*9356374aSAndroid Build Coastguard Worker // in the conversion.
1542*9356374aSAndroid Build Coastguard Worker //
1543*9356374aSAndroid Build Coastguard Worker // Date and time fields that are out-of-range will be treated as errors
1544*9356374aSAndroid Build Coastguard Worker // rather than normalizing them like `absl::CivilSecond` does. For example,
1545*9356374aSAndroid Build Coastguard Worker // it is an error to parse the date "Oct 32, 2013" because 32 is out of range.
1546*9356374aSAndroid Build Coastguard Worker //
1547*9356374aSAndroid Build Coastguard Worker // A leap second of ":60" is normalized to ":00" of the following minute
1548*9356374aSAndroid Build Coastguard Worker // with fractional seconds discarded. The following table shows how the
1549*9356374aSAndroid Build Coastguard Worker // given seconds and subseconds will be parsed:
1550*9356374aSAndroid Build Coastguard Worker //
1551*9356374aSAndroid Build Coastguard Worker // "59.x" -> 59.x // exact
1552*9356374aSAndroid Build Coastguard Worker // "60.x" -> 00.0 // normalized
1553*9356374aSAndroid Build Coastguard Worker // "00.x" -> 00.x // exact
1554*9356374aSAndroid Build Coastguard Worker //
1555*9356374aSAndroid Build Coastguard Worker // Errors are indicated by returning false and assigning an error message
1556*9356374aSAndroid Build Coastguard Worker // to the "err" out param if it is non-null.
1557*9356374aSAndroid Build Coastguard Worker //
1558*9356374aSAndroid Build Coastguard Worker // Note: If the input string is exactly "infinite-future", the returned
1559*9356374aSAndroid Build Coastguard Worker // `absl::Time` will be `absl::InfiniteFuture()` and `true` will be returned.
1560*9356374aSAndroid Build Coastguard Worker // If the input string is "infinite-past", the returned `absl::Time` will be
1561*9356374aSAndroid Build Coastguard Worker // `absl::InfinitePast()` and `true` will be returned.
1562*9356374aSAndroid Build Coastguard Worker //
1563*9356374aSAndroid Build Coastguard Worker bool ParseTime(absl::string_view format, absl::string_view input, Time* time,
1564*9356374aSAndroid Build Coastguard Worker std::string* err);
1565*9356374aSAndroid Build Coastguard Worker
1566*9356374aSAndroid Build Coastguard Worker // Like ParseTime() above, but if the format string does not contain a UTC
1567*9356374aSAndroid Build Coastguard Worker // offset specification (%z/%Ez/%E*z) then the input is interpreted in the
1568*9356374aSAndroid Build Coastguard Worker // given TimeZone. This means that the input, by itself, does not identify a
1569*9356374aSAndroid Build Coastguard Worker // unique instant. Being time-zone dependent, it also admits the possibility
1570*9356374aSAndroid Build Coastguard Worker // of ambiguity or non-existence, in which case the "pre" time (as defined
1571*9356374aSAndroid Build Coastguard Worker // by TimeZone::TimeInfo) is returned. For these reasons we recommend that
1572*9356374aSAndroid Build Coastguard Worker // all date/time strings include a UTC offset so they're context independent.
1573*9356374aSAndroid Build Coastguard Worker bool ParseTime(absl::string_view format, absl::string_view input, TimeZone tz,
1574*9356374aSAndroid Build Coastguard Worker Time* time, std::string* err);
1575*9356374aSAndroid Build Coastguard Worker
1576*9356374aSAndroid Build Coastguard Worker // ============================================================================
1577*9356374aSAndroid Build Coastguard Worker // Implementation Details Follow
1578*9356374aSAndroid Build Coastguard Worker // ============================================================================
1579*9356374aSAndroid Build Coastguard Worker
1580*9356374aSAndroid Build Coastguard Worker namespace time_internal {
1581*9356374aSAndroid Build Coastguard Worker
1582*9356374aSAndroid Build Coastguard Worker // Creates a Duration with a given representation.
1583*9356374aSAndroid Build Coastguard Worker // REQUIRES: hi,lo is a valid representation of a Duration as specified
1584*9356374aSAndroid Build Coastguard Worker // in time/duration.cc.
1585*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr Duration MakeDuration(int64_t hi,
1586*9356374aSAndroid Build Coastguard Worker uint32_t lo = 0) {
1587*9356374aSAndroid Build Coastguard Worker return Duration(hi, lo);
1588*9356374aSAndroid Build Coastguard Worker }
1589*9356374aSAndroid Build Coastguard Worker
MakeDuration(int64_t hi,int64_t lo)1590*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr Duration MakeDuration(int64_t hi,
1591*9356374aSAndroid Build Coastguard Worker int64_t lo) {
1592*9356374aSAndroid Build Coastguard Worker return MakeDuration(hi, static_cast<uint32_t>(lo));
1593*9356374aSAndroid Build Coastguard Worker }
1594*9356374aSAndroid Build Coastguard Worker
1595*9356374aSAndroid Build Coastguard Worker // Make a Duration value from a floating-point number, as long as that number
1596*9356374aSAndroid Build Coastguard Worker // is in the range [ 0 .. numeric_limits<int64_t>::max ), that is, as long as
1597*9356374aSAndroid Build Coastguard Worker // it's positive and can be converted to int64_t without risk of UB.
MakePosDoubleDuration(double n)1598*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION inline Duration MakePosDoubleDuration(double n) {
1599*9356374aSAndroid Build Coastguard Worker const int64_t int_secs = static_cast<int64_t>(n);
1600*9356374aSAndroid Build Coastguard Worker const uint32_t ticks = static_cast<uint32_t>(
1601*9356374aSAndroid Build Coastguard Worker std::round((n - static_cast<double>(int_secs)) * kTicksPerSecond));
1602*9356374aSAndroid Build Coastguard Worker return ticks < kTicksPerSecond
1603*9356374aSAndroid Build Coastguard Worker ? MakeDuration(int_secs, ticks)
1604*9356374aSAndroid Build Coastguard Worker : MakeDuration(int_secs + 1, ticks - kTicksPerSecond);
1605*9356374aSAndroid Build Coastguard Worker }
1606*9356374aSAndroid Build Coastguard Worker
1607*9356374aSAndroid Build Coastguard Worker // Creates a normalized Duration from an almost-normalized (sec,ticks)
1608*9356374aSAndroid Build Coastguard Worker // pair. sec may be positive or negative. ticks must be in the range
1609*9356374aSAndroid Build Coastguard Worker // -kTicksPerSecond < *ticks < kTicksPerSecond. If ticks is negative it
1610*9356374aSAndroid Build Coastguard Worker // will be normalized to a positive value in the resulting Duration.
MakeNormalizedDuration(int64_t sec,int64_t ticks)1611*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr Duration MakeNormalizedDuration(
1612*9356374aSAndroid Build Coastguard Worker int64_t sec, int64_t ticks) {
1613*9356374aSAndroid Build Coastguard Worker return (ticks < 0) ? MakeDuration(sec - 1, ticks + kTicksPerSecond)
1614*9356374aSAndroid Build Coastguard Worker : MakeDuration(sec, ticks);
1615*9356374aSAndroid Build Coastguard Worker }
1616*9356374aSAndroid Build Coastguard Worker
1617*9356374aSAndroid Build Coastguard Worker // Provide access to the Duration representation.
GetRepHi(Duration d)1618*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr int64_t GetRepHi(Duration d) {
1619*9356374aSAndroid Build Coastguard Worker return d.rep_hi_.Get();
1620*9356374aSAndroid Build Coastguard Worker }
GetRepLo(Duration d)1621*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr uint32_t GetRepLo(Duration d) {
1622*9356374aSAndroid Build Coastguard Worker return d.rep_lo_;
1623*9356374aSAndroid Build Coastguard Worker }
1624*9356374aSAndroid Build Coastguard Worker
1625*9356374aSAndroid Build Coastguard Worker // Returns true iff d is positive or negative infinity.
IsInfiniteDuration(Duration d)1626*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr bool IsInfiniteDuration(Duration d) {
1627*9356374aSAndroid Build Coastguard Worker return GetRepLo(d) == ~uint32_t{0};
1628*9356374aSAndroid Build Coastguard Worker }
1629*9356374aSAndroid Build Coastguard Worker
1630*9356374aSAndroid Build Coastguard Worker // Returns an infinite Duration with the opposite sign.
1631*9356374aSAndroid Build Coastguard Worker // REQUIRES: IsInfiniteDuration(d)
OppositeInfinity(Duration d)1632*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr Duration OppositeInfinity(Duration d) {
1633*9356374aSAndroid Build Coastguard Worker return GetRepHi(d) < 0
1634*9356374aSAndroid Build Coastguard Worker ? MakeDuration((std::numeric_limits<int64_t>::max)(), ~uint32_t{0})
1635*9356374aSAndroid Build Coastguard Worker : MakeDuration((std::numeric_limits<int64_t>::min)(),
1636*9356374aSAndroid Build Coastguard Worker ~uint32_t{0});
1637*9356374aSAndroid Build Coastguard Worker }
1638*9356374aSAndroid Build Coastguard Worker
1639*9356374aSAndroid Build Coastguard Worker // Returns (-n)-1 (equivalently -(n+1)) without avoidable overflow.
NegateAndSubtractOne(int64_t n)1640*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr int64_t NegateAndSubtractOne(
1641*9356374aSAndroid Build Coastguard Worker int64_t n) {
1642*9356374aSAndroid Build Coastguard Worker // Note: Good compilers will optimize this expression to ~n when using
1643*9356374aSAndroid Build Coastguard Worker // a two's-complement representation (which is required for int64_t).
1644*9356374aSAndroid Build Coastguard Worker return (n < 0) ? -(n + 1) : (-n) - 1;
1645*9356374aSAndroid Build Coastguard Worker }
1646*9356374aSAndroid Build Coastguard Worker
1647*9356374aSAndroid Build Coastguard Worker // Map between a Time and a Duration since the Unix epoch. Note that these
1648*9356374aSAndroid Build Coastguard Worker // functions depend on the above mentioned choice of the Unix epoch for the
1649*9356374aSAndroid Build Coastguard Worker // Time representation (and both need to be Time friends). Without this
1650*9356374aSAndroid Build Coastguard Worker // knowledge, we would need to add-in/subtract-out UnixEpoch() respectively.
FromUnixDuration(Duration d)1651*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr Time FromUnixDuration(Duration d) {
1652*9356374aSAndroid Build Coastguard Worker return Time(d);
1653*9356374aSAndroid Build Coastguard Worker }
ToUnixDuration(Time t)1654*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr Duration ToUnixDuration(Time t) {
1655*9356374aSAndroid Build Coastguard Worker return t.rep_;
1656*9356374aSAndroid Build Coastguard Worker }
1657*9356374aSAndroid Build Coastguard Worker
1658*9356374aSAndroid Build Coastguard Worker template <std::intmax_t N>
FromInt64(int64_t v,std::ratio<1,N>)1659*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr Duration FromInt64(int64_t v,
1660*9356374aSAndroid Build Coastguard Worker std::ratio<1, N>) {
1661*9356374aSAndroid Build Coastguard Worker static_assert(0 < N && N <= 1000 * 1000 * 1000, "Unsupported ratio");
1662*9356374aSAndroid Build Coastguard Worker // Subsecond ratios cannot overflow.
1663*9356374aSAndroid Build Coastguard Worker return MakeNormalizedDuration(
1664*9356374aSAndroid Build Coastguard Worker v / N, v % N * kTicksPerNanosecond * 1000 * 1000 * 1000 / N);
1665*9356374aSAndroid Build Coastguard Worker }
FromInt64(int64_t v,std::ratio<60>)1666*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr Duration FromInt64(int64_t v,
1667*9356374aSAndroid Build Coastguard Worker std::ratio<60>) {
1668*9356374aSAndroid Build Coastguard Worker return (v <= (std::numeric_limits<int64_t>::max)() / 60 &&
1669*9356374aSAndroid Build Coastguard Worker v >= (std::numeric_limits<int64_t>::min)() / 60)
1670*9356374aSAndroid Build Coastguard Worker ? MakeDuration(v * 60)
1671*9356374aSAndroid Build Coastguard Worker : v > 0 ? InfiniteDuration() : -InfiniteDuration();
1672*9356374aSAndroid Build Coastguard Worker }
FromInt64(int64_t v,std::ratio<3600>)1673*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr Duration FromInt64(int64_t v,
1674*9356374aSAndroid Build Coastguard Worker std::ratio<3600>) {
1675*9356374aSAndroid Build Coastguard Worker return (v <= (std::numeric_limits<int64_t>::max)() / 3600 &&
1676*9356374aSAndroid Build Coastguard Worker v >= (std::numeric_limits<int64_t>::min)() / 3600)
1677*9356374aSAndroid Build Coastguard Worker ? MakeDuration(v * 3600)
1678*9356374aSAndroid Build Coastguard Worker : v > 0 ? InfiniteDuration() : -InfiniteDuration();
1679*9356374aSAndroid Build Coastguard Worker }
1680*9356374aSAndroid Build Coastguard Worker
1681*9356374aSAndroid Build Coastguard Worker // IsValidRep64<T>(0) is true if the expression `int64_t{std::declval<T>()}` is
1682*9356374aSAndroid Build Coastguard Worker // valid. That is, if a T can be assigned to an int64_t without narrowing.
1683*9356374aSAndroid Build Coastguard Worker template <typename T>
1684*9356374aSAndroid Build Coastguard Worker constexpr auto IsValidRep64(int) -> decltype(int64_t{std::declval<T>()} == 0) {
1685*9356374aSAndroid Build Coastguard Worker return true;
1686*9356374aSAndroid Build Coastguard Worker }
1687*9356374aSAndroid Build Coastguard Worker template <typename T>
1688*9356374aSAndroid Build Coastguard Worker constexpr auto IsValidRep64(char) -> bool {
1689*9356374aSAndroid Build Coastguard Worker return false;
1690*9356374aSAndroid Build Coastguard Worker }
1691*9356374aSAndroid Build Coastguard Worker
1692*9356374aSAndroid Build Coastguard Worker // Converts a std::chrono::duration to an absl::Duration.
1693*9356374aSAndroid Build Coastguard Worker template <typename Rep, typename Period>
FromChrono(const std::chrono::duration<Rep,Period> & d)1694*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_PURE_FUNCTION constexpr Duration FromChrono(
1695*9356374aSAndroid Build Coastguard Worker const std::chrono::duration<Rep, Period>& d) {
1696*9356374aSAndroid Build Coastguard Worker static_assert(IsValidRep64<Rep>(0), "duration::rep is invalid");
1697*9356374aSAndroid Build Coastguard Worker return FromInt64(int64_t{d.count()}, Period{});
1698*9356374aSAndroid Build Coastguard Worker }
1699*9356374aSAndroid Build Coastguard Worker
1700*9356374aSAndroid Build Coastguard Worker template <typename Ratio>
ToInt64(Duration d,Ratio)1701*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION int64_t ToInt64(Duration d, Ratio) {
1702*9356374aSAndroid Build Coastguard Worker // Note: This may be used on MSVC, which may have a system_clock period of
1703*9356374aSAndroid Build Coastguard Worker // std::ratio<1, 10 * 1000 * 1000>
1704*9356374aSAndroid Build Coastguard Worker return ToInt64Seconds(d * Ratio::den / Ratio::num);
1705*9356374aSAndroid Build Coastguard Worker }
1706*9356374aSAndroid Build Coastguard Worker // Fastpath implementations for the 6 common duration units.
ToInt64(Duration d,std::nano)1707*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION inline int64_t ToInt64(Duration d, std::nano) {
1708*9356374aSAndroid Build Coastguard Worker return ToInt64Nanoseconds(d);
1709*9356374aSAndroid Build Coastguard Worker }
ToInt64(Duration d,std::micro)1710*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION inline int64_t ToInt64(Duration d, std::micro) {
1711*9356374aSAndroid Build Coastguard Worker return ToInt64Microseconds(d);
1712*9356374aSAndroid Build Coastguard Worker }
ToInt64(Duration d,std::milli)1713*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION inline int64_t ToInt64(Duration d, std::milli) {
1714*9356374aSAndroid Build Coastguard Worker return ToInt64Milliseconds(d);
1715*9356374aSAndroid Build Coastguard Worker }
ToInt64(Duration d,std::ratio<1>)1716*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION inline int64_t ToInt64(Duration d,
1717*9356374aSAndroid Build Coastguard Worker std::ratio<1>) {
1718*9356374aSAndroid Build Coastguard Worker return ToInt64Seconds(d);
1719*9356374aSAndroid Build Coastguard Worker }
ToInt64(Duration d,std::ratio<60>)1720*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION inline int64_t ToInt64(Duration d,
1721*9356374aSAndroid Build Coastguard Worker std::ratio<60>) {
1722*9356374aSAndroid Build Coastguard Worker return ToInt64Minutes(d);
1723*9356374aSAndroid Build Coastguard Worker }
ToInt64(Duration d,std::ratio<3600>)1724*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION inline int64_t ToInt64(Duration d,
1725*9356374aSAndroid Build Coastguard Worker std::ratio<3600>) {
1726*9356374aSAndroid Build Coastguard Worker return ToInt64Hours(d);
1727*9356374aSAndroid Build Coastguard Worker }
1728*9356374aSAndroid Build Coastguard Worker
1729*9356374aSAndroid Build Coastguard Worker // Converts an absl::Duration to a chrono duration of type T.
1730*9356374aSAndroid Build Coastguard Worker template <typename T>
ToChronoDuration(Duration d)1731*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION T ToChronoDuration(Duration d) {
1732*9356374aSAndroid Build Coastguard Worker using Rep = typename T::rep;
1733*9356374aSAndroid Build Coastguard Worker using Period = typename T::period;
1734*9356374aSAndroid Build Coastguard Worker static_assert(IsValidRep64<Rep>(0), "duration::rep is invalid");
1735*9356374aSAndroid Build Coastguard Worker if (time_internal::IsInfiniteDuration(d))
1736*9356374aSAndroid Build Coastguard Worker return d < ZeroDuration() ? (T::min)() : (T::max)();
1737*9356374aSAndroid Build Coastguard Worker const auto v = ToInt64(d, Period{});
1738*9356374aSAndroid Build Coastguard Worker if (v > (std::numeric_limits<Rep>::max)()) return (T::max)();
1739*9356374aSAndroid Build Coastguard Worker if (v < (std::numeric_limits<Rep>::min)()) return (T::min)();
1740*9356374aSAndroid Build Coastguard Worker return T{v};
1741*9356374aSAndroid Build Coastguard Worker }
1742*9356374aSAndroid Build Coastguard Worker
1743*9356374aSAndroid Build Coastguard Worker } // namespace time_internal
1744*9356374aSAndroid Build Coastguard Worker
1745*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr bool operator<(Duration lhs,
1746*9356374aSAndroid Build Coastguard Worker Duration rhs) {
1747*9356374aSAndroid Build Coastguard Worker return time_internal::GetRepHi(lhs) != time_internal::GetRepHi(rhs)
1748*9356374aSAndroid Build Coastguard Worker ? time_internal::GetRepHi(lhs) < time_internal::GetRepHi(rhs)
1749*9356374aSAndroid Build Coastguard Worker : time_internal::GetRepHi(lhs) == (std::numeric_limits<int64_t>::min)()
1750*9356374aSAndroid Build Coastguard Worker ? time_internal::GetRepLo(lhs) + 1 <
1751*9356374aSAndroid Build Coastguard Worker time_internal::GetRepLo(rhs) + 1
1752*9356374aSAndroid Build Coastguard Worker : time_internal::GetRepLo(lhs) < time_internal::GetRepLo(rhs);
1753*9356374aSAndroid Build Coastguard Worker }
1754*9356374aSAndroid Build Coastguard Worker
1755*9356374aSAndroid Build Coastguard Worker
1756*9356374aSAndroid Build Coastguard Worker #ifdef __cpp_impl_three_way_comparison
1757*9356374aSAndroid Build Coastguard Worker
1758*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr std::strong_ordering operator<=>(
1759*9356374aSAndroid Build Coastguard Worker Duration lhs, Duration rhs) {
1760*9356374aSAndroid Build Coastguard Worker const int64_t lhs_hi = time_internal::GetRepHi(lhs);
1761*9356374aSAndroid Build Coastguard Worker const int64_t rhs_hi = time_internal::GetRepHi(rhs);
1762*9356374aSAndroid Build Coastguard Worker if (auto c = lhs_hi <=> rhs_hi; c != std::strong_ordering::equal) {
1763*9356374aSAndroid Build Coastguard Worker return c;
1764*9356374aSAndroid Build Coastguard Worker }
1765*9356374aSAndroid Build Coastguard Worker const uint32_t lhs_lo = time_internal::GetRepLo(lhs);
1766*9356374aSAndroid Build Coastguard Worker const uint32_t rhs_lo = time_internal::GetRepLo(rhs);
1767*9356374aSAndroid Build Coastguard Worker return (lhs_hi == (std::numeric_limits<int64_t>::min)())
1768*9356374aSAndroid Build Coastguard Worker ? (lhs_lo + 1) <=> (rhs_lo + 1)
1769*9356374aSAndroid Build Coastguard Worker : lhs_lo <=> rhs_lo;
1770*9356374aSAndroid Build Coastguard Worker }
1771*9356374aSAndroid Build Coastguard Worker
1772*9356374aSAndroid Build Coastguard Worker #endif // __cpp_impl_three_way_comparison
1773*9356374aSAndroid Build Coastguard Worker
1774*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr bool operator==(Duration lhs,
1775*9356374aSAndroid Build Coastguard Worker Duration rhs) {
1776*9356374aSAndroid Build Coastguard Worker return time_internal::GetRepHi(lhs) == time_internal::GetRepHi(rhs) &&
1777*9356374aSAndroid Build Coastguard Worker time_internal::GetRepLo(lhs) == time_internal::GetRepLo(rhs);
1778*9356374aSAndroid Build Coastguard Worker }
1779*9356374aSAndroid Build Coastguard Worker
1780*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr Duration operator-(Duration d) {
1781*9356374aSAndroid Build Coastguard Worker // This is a little interesting because of the special cases.
1782*9356374aSAndroid Build Coastguard Worker //
1783*9356374aSAndroid Build Coastguard Worker // If rep_lo_ is zero, we have it easy; it's safe to negate rep_hi_, we're
1784*9356374aSAndroid Build Coastguard Worker // dealing with an integral number of seconds, and the only special case is
1785*9356374aSAndroid Build Coastguard Worker // the maximum negative finite duration, which can't be negated.
1786*9356374aSAndroid Build Coastguard Worker //
1787*9356374aSAndroid Build Coastguard Worker // Infinities stay infinite, and just change direction.
1788*9356374aSAndroid Build Coastguard Worker //
1789*9356374aSAndroid Build Coastguard Worker // Finally we're in the case where rep_lo_ is non-zero, and we can borrow
1790*9356374aSAndroid Build Coastguard Worker // a second's worth of ticks and avoid overflow (as negating int64_t-min + 1
1791*9356374aSAndroid Build Coastguard Worker // is safe).
1792*9356374aSAndroid Build Coastguard Worker return time_internal::GetRepLo(d) == 0
1793*9356374aSAndroid Build Coastguard Worker ? time_internal::GetRepHi(d) ==
1794*9356374aSAndroid Build Coastguard Worker (std::numeric_limits<int64_t>::min)()
1795*9356374aSAndroid Build Coastguard Worker ? InfiniteDuration()
1796*9356374aSAndroid Build Coastguard Worker : time_internal::MakeDuration(-time_internal::GetRepHi(d))
1797*9356374aSAndroid Build Coastguard Worker : time_internal::IsInfiniteDuration(d)
1798*9356374aSAndroid Build Coastguard Worker ? time_internal::OppositeInfinity(d)
1799*9356374aSAndroid Build Coastguard Worker : time_internal::MakeDuration(
1800*9356374aSAndroid Build Coastguard Worker time_internal::NegateAndSubtractOne(
1801*9356374aSAndroid Build Coastguard Worker time_internal::GetRepHi(d)),
1802*9356374aSAndroid Build Coastguard Worker time_internal::kTicksPerSecond -
1803*9356374aSAndroid Build Coastguard Worker time_internal::GetRepLo(d));
1804*9356374aSAndroid Build Coastguard Worker }
1805*9356374aSAndroid Build Coastguard Worker
InfiniteDuration()1806*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr Duration InfiniteDuration() {
1807*9356374aSAndroid Build Coastguard Worker return time_internal::MakeDuration((std::numeric_limits<int64_t>::max)(),
1808*9356374aSAndroid Build Coastguard Worker ~uint32_t{0});
1809*9356374aSAndroid Build Coastguard Worker }
1810*9356374aSAndroid Build Coastguard Worker
FromChrono(const std::chrono::nanoseconds & d)1811*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_PURE_FUNCTION constexpr Duration FromChrono(
1812*9356374aSAndroid Build Coastguard Worker const std::chrono::nanoseconds& d) {
1813*9356374aSAndroid Build Coastguard Worker return time_internal::FromChrono(d);
1814*9356374aSAndroid Build Coastguard Worker }
FromChrono(const std::chrono::microseconds & d)1815*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_PURE_FUNCTION constexpr Duration FromChrono(
1816*9356374aSAndroid Build Coastguard Worker const std::chrono::microseconds& d) {
1817*9356374aSAndroid Build Coastguard Worker return time_internal::FromChrono(d);
1818*9356374aSAndroid Build Coastguard Worker }
FromChrono(const std::chrono::milliseconds & d)1819*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_PURE_FUNCTION constexpr Duration FromChrono(
1820*9356374aSAndroid Build Coastguard Worker const std::chrono::milliseconds& d) {
1821*9356374aSAndroid Build Coastguard Worker return time_internal::FromChrono(d);
1822*9356374aSAndroid Build Coastguard Worker }
FromChrono(const std::chrono::seconds & d)1823*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_PURE_FUNCTION constexpr Duration FromChrono(
1824*9356374aSAndroid Build Coastguard Worker const std::chrono::seconds& d) {
1825*9356374aSAndroid Build Coastguard Worker return time_internal::FromChrono(d);
1826*9356374aSAndroid Build Coastguard Worker }
FromChrono(const std::chrono::minutes & d)1827*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_PURE_FUNCTION constexpr Duration FromChrono(
1828*9356374aSAndroid Build Coastguard Worker const std::chrono::minutes& d) {
1829*9356374aSAndroid Build Coastguard Worker return time_internal::FromChrono(d);
1830*9356374aSAndroid Build Coastguard Worker }
FromChrono(const std::chrono::hours & d)1831*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_PURE_FUNCTION constexpr Duration FromChrono(
1832*9356374aSAndroid Build Coastguard Worker const std::chrono::hours& d) {
1833*9356374aSAndroid Build Coastguard Worker return time_internal::FromChrono(d);
1834*9356374aSAndroid Build Coastguard Worker }
1835*9356374aSAndroid Build Coastguard Worker
FromUnixNanos(int64_t ns)1836*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr Time FromUnixNanos(int64_t ns) {
1837*9356374aSAndroid Build Coastguard Worker return time_internal::FromUnixDuration(Nanoseconds(ns));
1838*9356374aSAndroid Build Coastguard Worker }
1839*9356374aSAndroid Build Coastguard Worker
FromUnixMicros(int64_t us)1840*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr Time FromUnixMicros(int64_t us) {
1841*9356374aSAndroid Build Coastguard Worker return time_internal::FromUnixDuration(Microseconds(us));
1842*9356374aSAndroid Build Coastguard Worker }
1843*9356374aSAndroid Build Coastguard Worker
FromUnixMillis(int64_t ms)1844*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr Time FromUnixMillis(int64_t ms) {
1845*9356374aSAndroid Build Coastguard Worker return time_internal::FromUnixDuration(Milliseconds(ms));
1846*9356374aSAndroid Build Coastguard Worker }
1847*9356374aSAndroid Build Coastguard Worker
FromUnixSeconds(int64_t s)1848*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr Time FromUnixSeconds(int64_t s) {
1849*9356374aSAndroid Build Coastguard Worker return time_internal::FromUnixDuration(Seconds(s));
1850*9356374aSAndroid Build Coastguard Worker }
1851*9356374aSAndroid Build Coastguard Worker
FromTimeT(time_t t)1852*9356374aSAndroid Build Coastguard Worker ABSL_ATTRIBUTE_CONST_FUNCTION constexpr Time FromTimeT(time_t t) {
1853*9356374aSAndroid Build Coastguard Worker return time_internal::FromUnixDuration(Seconds(t));
1854*9356374aSAndroid Build Coastguard Worker }
1855*9356374aSAndroid Build Coastguard Worker
1856*9356374aSAndroid Build Coastguard Worker ABSL_NAMESPACE_END
1857*9356374aSAndroid Build Coastguard Worker } // namespace absl
1858*9356374aSAndroid Build Coastguard Worker
1859*9356374aSAndroid Build Coastguard Worker #endif // ABSL_TIME_TIME_H_
1860