1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include <atomic>
8*6777b538SAndroid Build Coastguard Worker #include <cmath>
9*6777b538SAndroid Build Coastguard Worker #include <limits>
10*6777b538SAndroid Build Coastguard Worker #include <optional>
11*6777b538SAndroid Build Coastguard Worker #include <ostream>
12*6777b538SAndroid Build Coastguard Worker #include <tuple>
13*6777b538SAndroid Build Coastguard Worker #include <utility>
14*6777b538SAndroid Build Coastguard Worker
15*6777b538SAndroid Build Coastguard Worker #include "base/check.h"
16*6777b538SAndroid Build Coastguard Worker #include "base/format_macros.h"
17*6777b538SAndroid Build Coastguard Worker #include "base/strings/stringprintf.h"
18*6777b538SAndroid Build Coastguard Worker #include "base/third_party/nspr/prtime.h"
19*6777b538SAndroid Build Coastguard Worker #include "base/time/time_override.h"
20*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
21*6777b538SAndroid Build Coastguard Worker
22*6777b538SAndroid Build Coastguard Worker namespace base {
23*6777b538SAndroid Build Coastguard Worker
24*6777b538SAndroid Build Coastguard Worker namespace {
25*6777b538SAndroid Build Coastguard Worker
26*6777b538SAndroid Build Coastguard Worker TimeTicks g_shared_time_ticks_at_unix_epoch;
27*6777b538SAndroid Build Coastguard Worker
28*6777b538SAndroid Build Coastguard Worker } // namespace
29*6777b538SAndroid Build Coastguard Worker
30*6777b538SAndroid Build Coastguard Worker namespace internal {
31*6777b538SAndroid Build Coastguard Worker
32*6777b538SAndroid Build Coastguard Worker std::atomic<TimeNowFunction> g_time_now_function{
33*6777b538SAndroid Build Coastguard Worker &subtle::TimeNowIgnoringOverride};
34*6777b538SAndroid Build Coastguard Worker
35*6777b538SAndroid Build Coastguard Worker std::atomic<TimeNowFunction> g_time_now_from_system_time_function{
36*6777b538SAndroid Build Coastguard Worker &subtle::TimeNowFromSystemTimeIgnoringOverride};
37*6777b538SAndroid Build Coastguard Worker
38*6777b538SAndroid Build Coastguard Worker std::atomic<TimeTicksNowFunction> g_time_ticks_now_function{
39*6777b538SAndroid Build Coastguard Worker &subtle::TimeTicksNowIgnoringOverride};
40*6777b538SAndroid Build Coastguard Worker
41*6777b538SAndroid Build Coastguard Worker std::atomic<LiveTicksNowFunction> g_live_ticks_now_function{
42*6777b538SAndroid Build Coastguard Worker &subtle::LiveTicksNowIgnoringOverride};
43*6777b538SAndroid Build Coastguard Worker
44*6777b538SAndroid Build Coastguard Worker std::atomic<ThreadTicksNowFunction> g_thread_ticks_now_function{
45*6777b538SAndroid Build Coastguard Worker &subtle::ThreadTicksNowIgnoringOverride};
46*6777b538SAndroid Build Coastguard Worker
47*6777b538SAndroid Build Coastguard Worker } // namespace internal
48*6777b538SAndroid Build Coastguard Worker
49*6777b538SAndroid Build Coastguard Worker // TimeDelta ------------------------------------------------------------------
50*6777b538SAndroid Build Coastguard Worker
CeilToMultiple(TimeDelta interval) const51*6777b538SAndroid Build Coastguard Worker TimeDelta TimeDelta::CeilToMultiple(TimeDelta interval) const {
52*6777b538SAndroid Build Coastguard Worker if (is_inf() || interval.is_zero())
53*6777b538SAndroid Build Coastguard Worker return *this;
54*6777b538SAndroid Build Coastguard Worker const TimeDelta remainder = *this % interval;
55*6777b538SAndroid Build Coastguard Worker if (delta_ < 0)
56*6777b538SAndroid Build Coastguard Worker return *this - remainder;
57*6777b538SAndroid Build Coastguard Worker return remainder.is_zero() ? *this
58*6777b538SAndroid Build Coastguard Worker : (*this - remainder + interval.magnitude());
59*6777b538SAndroid Build Coastguard Worker }
60*6777b538SAndroid Build Coastguard Worker
FloorToMultiple(TimeDelta interval) const61*6777b538SAndroid Build Coastguard Worker TimeDelta TimeDelta::FloorToMultiple(TimeDelta interval) const {
62*6777b538SAndroid Build Coastguard Worker if (is_inf() || interval.is_zero())
63*6777b538SAndroid Build Coastguard Worker return *this;
64*6777b538SAndroid Build Coastguard Worker const TimeDelta remainder = *this % interval;
65*6777b538SAndroid Build Coastguard Worker if (delta_ < 0) {
66*6777b538SAndroid Build Coastguard Worker return remainder.is_zero() ? *this
67*6777b538SAndroid Build Coastguard Worker : (*this - remainder - interval.magnitude());
68*6777b538SAndroid Build Coastguard Worker }
69*6777b538SAndroid Build Coastguard Worker return *this - remainder;
70*6777b538SAndroid Build Coastguard Worker }
71*6777b538SAndroid Build Coastguard Worker
RoundToMultiple(TimeDelta interval) const72*6777b538SAndroid Build Coastguard Worker TimeDelta TimeDelta::RoundToMultiple(TimeDelta interval) const {
73*6777b538SAndroid Build Coastguard Worker if (is_inf() || interval.is_zero())
74*6777b538SAndroid Build Coastguard Worker return *this;
75*6777b538SAndroid Build Coastguard Worker if (interval.is_inf())
76*6777b538SAndroid Build Coastguard Worker return TimeDelta();
77*6777b538SAndroid Build Coastguard Worker const TimeDelta half = interval.magnitude() / 2;
78*6777b538SAndroid Build Coastguard Worker return (delta_ < 0) ? (*this - half).CeilToMultiple(interval)
79*6777b538SAndroid Build Coastguard Worker : (*this + half).FloorToMultiple(interval);
80*6777b538SAndroid Build Coastguard Worker }
81*6777b538SAndroid Build Coastguard Worker
operator <<(std::ostream & os,TimeDelta time_delta)82*6777b538SAndroid Build Coastguard Worker std::ostream& operator<<(std::ostream& os, TimeDelta time_delta) {
83*6777b538SAndroid Build Coastguard Worker return os << time_delta.InSecondsF() << " s";
84*6777b538SAndroid Build Coastguard Worker }
85*6777b538SAndroid Build Coastguard Worker
86*6777b538SAndroid Build Coastguard Worker // Time -----------------------------------------------------------------------
87*6777b538SAndroid Build Coastguard Worker
88*6777b538SAndroid Build Coastguard Worker // static
Now()89*6777b538SAndroid Build Coastguard Worker Time Time::Now() {
90*6777b538SAndroid Build Coastguard Worker return internal::g_time_now_function.load(std::memory_order_relaxed)();
91*6777b538SAndroid Build Coastguard Worker }
92*6777b538SAndroid Build Coastguard Worker
93*6777b538SAndroid Build Coastguard Worker // static
NowFromSystemTime()94*6777b538SAndroid Build Coastguard Worker Time Time::NowFromSystemTime() {
95*6777b538SAndroid Build Coastguard Worker // Just use g_time_now_function because it returns the system time.
96*6777b538SAndroid Build Coastguard Worker return internal::g_time_now_from_system_time_function.load(
97*6777b538SAndroid Build Coastguard Worker std::memory_order_relaxed)();
98*6777b538SAndroid Build Coastguard Worker }
99*6777b538SAndroid Build Coastguard Worker
Midnight(bool is_local) const100*6777b538SAndroid Build Coastguard Worker Time Time::Midnight(bool is_local) const {
101*6777b538SAndroid Build Coastguard Worker Exploded exploded;
102*6777b538SAndroid Build Coastguard Worker Explode(is_local, &exploded);
103*6777b538SAndroid Build Coastguard Worker exploded.hour = 0;
104*6777b538SAndroid Build Coastguard Worker exploded.minute = 0;
105*6777b538SAndroid Build Coastguard Worker exploded.second = 0;
106*6777b538SAndroid Build Coastguard Worker exploded.millisecond = 0;
107*6777b538SAndroid Build Coastguard Worker Time out_time;
108*6777b538SAndroid Build Coastguard Worker if (FromExploded(is_local, exploded, &out_time))
109*6777b538SAndroid Build Coastguard Worker return out_time;
110*6777b538SAndroid Build Coastguard Worker
111*6777b538SAndroid Build Coastguard Worker // Reaching here means 00:00:00am of the current day does not exist (due to
112*6777b538SAndroid Build Coastguard Worker // Daylight Saving Time in some countries where clocks are shifted at
113*6777b538SAndroid Build Coastguard Worker // midnight). In this case, midnight should be defined as 01:00:00am.
114*6777b538SAndroid Build Coastguard Worker DCHECK(is_local);
115*6777b538SAndroid Build Coastguard Worker exploded.hour = 1;
116*6777b538SAndroid Build Coastguard Worker [[maybe_unused]] const bool result =
117*6777b538SAndroid Build Coastguard Worker FromExploded(is_local, exploded, &out_time);
118*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_CHROMEOS_ASH) && defined(ARCH_CPU_ARM_FAMILY)
119*6777b538SAndroid Build Coastguard Worker // TODO(crbug.com/1263873): DCHECKs have limited coverage during automated
120*6777b538SAndroid Build Coastguard Worker // testing on CrOS and this check failed when tested on an experimental
121*6777b538SAndroid Build Coastguard Worker // builder. Testing for ARCH_CPU_ARM_FAMILY prevents regressing coverage on
122*6777b538SAndroid Build Coastguard Worker // x86_64, which is already enabled. See go/chrome-dcheck-on-cros or
123*6777b538SAndroid Build Coastguard Worker // http://crbug.com/1113456 for more details.
124*6777b538SAndroid Build Coastguard Worker #else
125*6777b538SAndroid Build Coastguard Worker DCHECK(result); // This function must not fail.
126*6777b538SAndroid Build Coastguard Worker #endif
127*6777b538SAndroid Build Coastguard Worker return out_time;
128*6777b538SAndroid Build Coastguard Worker }
129*6777b538SAndroid Build Coastguard Worker
130*6777b538SAndroid Build Coastguard Worker // static
FromStringInternal(const char * time_string,bool is_local,Time * parsed_time)131*6777b538SAndroid Build Coastguard Worker bool Time::FromStringInternal(const char* time_string,
132*6777b538SAndroid Build Coastguard Worker bool is_local,
133*6777b538SAndroid Build Coastguard Worker Time* parsed_time) {
134*6777b538SAndroid Build Coastguard Worker DCHECK(time_string);
135*6777b538SAndroid Build Coastguard Worker DCHECK(parsed_time);
136*6777b538SAndroid Build Coastguard Worker
137*6777b538SAndroid Build Coastguard Worker if (time_string[0] == '\0')
138*6777b538SAndroid Build Coastguard Worker return false;
139*6777b538SAndroid Build Coastguard Worker
140*6777b538SAndroid Build Coastguard Worker PRTime result_time = 0;
141*6777b538SAndroid Build Coastguard Worker PRStatus result = PR_ParseTimeString(time_string,
142*6777b538SAndroid Build Coastguard Worker is_local ? PR_FALSE : PR_TRUE,
143*6777b538SAndroid Build Coastguard Worker &result_time);
144*6777b538SAndroid Build Coastguard Worker if (result != PR_SUCCESS)
145*6777b538SAndroid Build Coastguard Worker return false;
146*6777b538SAndroid Build Coastguard Worker
147*6777b538SAndroid Build Coastguard Worker *parsed_time = UnixEpoch() + Microseconds(result_time);
148*6777b538SAndroid Build Coastguard Worker return true;
149*6777b538SAndroid Build Coastguard Worker }
150*6777b538SAndroid Build Coastguard Worker
151*6777b538SAndroid Build Coastguard Worker // static
ExplodedMostlyEquals(const Exploded & lhs,const Exploded & rhs)152*6777b538SAndroid Build Coastguard Worker bool Time::ExplodedMostlyEquals(const Exploded& lhs, const Exploded& rhs) {
153*6777b538SAndroid Build Coastguard Worker return std::tie(lhs.year, lhs.month, lhs.day_of_month, lhs.hour, lhs.minute,
154*6777b538SAndroid Build Coastguard Worker lhs.second, lhs.millisecond) ==
155*6777b538SAndroid Build Coastguard Worker std::tie(rhs.year, rhs.month, rhs.day_of_month, rhs.hour, rhs.minute,
156*6777b538SAndroid Build Coastguard Worker rhs.second, rhs.millisecond);
157*6777b538SAndroid Build Coastguard Worker }
158*6777b538SAndroid Build Coastguard Worker
159*6777b538SAndroid Build Coastguard Worker // static
FromMillisecondsSinceUnixEpoch(int64_t unix_milliseconds,Time * time)160*6777b538SAndroid Build Coastguard Worker bool Time::FromMillisecondsSinceUnixEpoch(int64_t unix_milliseconds,
161*6777b538SAndroid Build Coastguard Worker Time* time) {
162*6777b538SAndroid Build Coastguard Worker // Adjust the provided time from milliseconds since the Unix epoch (1970) to
163*6777b538SAndroid Build Coastguard Worker // microseconds since the Windows epoch (1601), avoiding overflows.
164*6777b538SAndroid Build Coastguard Worker CheckedNumeric<int64_t> checked_microseconds_win_epoch = unix_milliseconds;
165*6777b538SAndroid Build Coastguard Worker checked_microseconds_win_epoch *= kMicrosecondsPerMillisecond;
166*6777b538SAndroid Build Coastguard Worker checked_microseconds_win_epoch += kTimeTToMicrosecondsOffset;
167*6777b538SAndroid Build Coastguard Worker *time = Time(checked_microseconds_win_epoch.ValueOrDefault(0));
168*6777b538SAndroid Build Coastguard Worker return checked_microseconds_win_epoch.IsValid();
169*6777b538SAndroid Build Coastguard Worker }
170*6777b538SAndroid Build Coastguard Worker
ToRoundedDownMillisecondsSinceUnixEpoch() const171*6777b538SAndroid Build Coastguard Worker int64_t Time::ToRoundedDownMillisecondsSinceUnixEpoch() const {
172*6777b538SAndroid Build Coastguard Worker constexpr int64_t kEpochOffsetMillis =
173*6777b538SAndroid Build Coastguard Worker kTimeTToMicrosecondsOffset / kMicrosecondsPerMillisecond;
174*6777b538SAndroid Build Coastguard Worker static_assert(kTimeTToMicrosecondsOffset % kMicrosecondsPerMillisecond == 0,
175*6777b538SAndroid Build Coastguard Worker "assumption: no epoch offset sub-milliseconds");
176*6777b538SAndroid Build Coastguard Worker
177*6777b538SAndroid Build Coastguard Worker // Compute the milliseconds since UNIX epoch without the possibility of
178*6777b538SAndroid Build Coastguard Worker // under/overflow. Round the result towards -infinity.
179*6777b538SAndroid Build Coastguard Worker //
180*6777b538SAndroid Build Coastguard Worker // If |us_| is negative and includes fractions of a millisecond, subtract one
181*6777b538SAndroid Build Coastguard Worker // more to effect the round towards -infinity. C-style integer truncation
182*6777b538SAndroid Build Coastguard Worker // takes care of all other cases.
183*6777b538SAndroid Build Coastguard Worker const int64_t millis = us_ / kMicrosecondsPerMillisecond;
184*6777b538SAndroid Build Coastguard Worker const int64_t submillis = us_ % kMicrosecondsPerMillisecond;
185*6777b538SAndroid Build Coastguard Worker return millis - kEpochOffsetMillis - (submillis < 0);
186*6777b538SAndroid Build Coastguard Worker }
187*6777b538SAndroid Build Coastguard Worker
operator <<(std::ostream & os,Time time)188*6777b538SAndroid Build Coastguard Worker std::ostream& operator<<(std::ostream& os, Time time) {
189*6777b538SAndroid Build Coastguard Worker Time::Exploded exploded;
190*6777b538SAndroid Build Coastguard Worker time.UTCExplode(&exploded);
191*6777b538SAndroid Build Coastguard Worker // Can't call `UnlocalizedTimeFormatWithPattern()`/`TimeFormatAsIso8601()`
192*6777b538SAndroid Build Coastguard Worker // since `//base` can't depend on `//base:i18n`.
193*6777b538SAndroid Build Coastguard Worker //
194*6777b538SAndroid Build Coastguard Worker // TODO(pkasting): Consider whether `operator<<()` should move to
195*6777b538SAndroid Build Coastguard Worker // `base/i18n/time_formatting.h` -- would let us implement in terms of
196*6777b538SAndroid Build Coastguard Worker // existing time formatting, but might be confusing.
197*6777b538SAndroid Build Coastguard Worker return os << StringPrintf("%04d-%02d-%02d %02d:%02d:%02d.%06" PRId64 " UTC",
198*6777b538SAndroid Build Coastguard Worker exploded.year, exploded.month,
199*6777b538SAndroid Build Coastguard Worker exploded.day_of_month, exploded.hour,
200*6777b538SAndroid Build Coastguard Worker exploded.minute, exploded.second,
201*6777b538SAndroid Build Coastguard Worker time.ToDeltaSinceWindowsEpoch().InMicroseconds() %
202*6777b538SAndroid Build Coastguard Worker Time::kMicrosecondsPerSecond);
203*6777b538SAndroid Build Coastguard Worker }
204*6777b538SAndroid Build Coastguard Worker
205*6777b538SAndroid Build Coastguard Worker // TimeTicks ------------------------------------------------------------------
206*6777b538SAndroid Build Coastguard Worker
207*6777b538SAndroid Build Coastguard Worker // static
Now()208*6777b538SAndroid Build Coastguard Worker TimeTicks TimeTicks::Now() {
209*6777b538SAndroid Build Coastguard Worker return internal::g_time_ticks_now_function.load(std::memory_order_relaxed)();
210*6777b538SAndroid Build Coastguard Worker }
211*6777b538SAndroid Build Coastguard Worker
212*6777b538SAndroid Build Coastguard Worker // static
213*6777b538SAndroid Build Coastguard Worker // This method should be called once at process start and before
214*6777b538SAndroid Build Coastguard Worker // TimeTicks::UnixEpoch is accessed. It is intended to make the offset between
215*6777b538SAndroid Build Coastguard Worker // unix time and monotonic time consistent across processes.
SetSharedUnixEpoch(TimeTicks ticks_at_epoch)216*6777b538SAndroid Build Coastguard Worker void TimeTicks::SetSharedUnixEpoch(TimeTicks ticks_at_epoch) {
217*6777b538SAndroid Build Coastguard Worker DCHECK(g_shared_time_ticks_at_unix_epoch.is_null());
218*6777b538SAndroid Build Coastguard Worker g_shared_time_ticks_at_unix_epoch = ticks_at_epoch;
219*6777b538SAndroid Build Coastguard Worker }
220*6777b538SAndroid Build Coastguard Worker
221*6777b538SAndroid Build Coastguard Worker // static
UnixEpoch()222*6777b538SAndroid Build Coastguard Worker TimeTicks TimeTicks::UnixEpoch() {
223*6777b538SAndroid Build Coastguard Worker struct StaticUnixEpoch {
224*6777b538SAndroid Build Coastguard Worker StaticUnixEpoch()
225*6777b538SAndroid Build Coastguard Worker : epoch(
226*6777b538SAndroid Build Coastguard Worker g_shared_time_ticks_at_unix_epoch.is_null()
227*6777b538SAndroid Build Coastguard Worker ? subtle::TimeTicksNowIgnoringOverride() -
228*6777b538SAndroid Build Coastguard Worker (subtle::TimeNowIgnoringOverride() - Time::UnixEpoch())
229*6777b538SAndroid Build Coastguard Worker : g_shared_time_ticks_at_unix_epoch) {
230*6777b538SAndroid Build Coastguard Worker // Prevent future usage of `g_shared_time_ticks_at_unix_epoch`.
231*6777b538SAndroid Build Coastguard Worker g_shared_time_ticks_at_unix_epoch = TimeTicks::Max();
232*6777b538SAndroid Build Coastguard Worker }
233*6777b538SAndroid Build Coastguard Worker
234*6777b538SAndroid Build Coastguard Worker const TimeTicks epoch;
235*6777b538SAndroid Build Coastguard Worker };
236*6777b538SAndroid Build Coastguard Worker
237*6777b538SAndroid Build Coastguard Worker static StaticUnixEpoch static_epoch;
238*6777b538SAndroid Build Coastguard Worker return static_epoch.epoch;
239*6777b538SAndroid Build Coastguard Worker }
240*6777b538SAndroid Build Coastguard Worker
SnappedToNextTick(TimeTicks tick_phase,TimeDelta tick_interval) const241*6777b538SAndroid Build Coastguard Worker TimeTicks TimeTicks::SnappedToNextTick(TimeTicks tick_phase,
242*6777b538SAndroid Build Coastguard Worker TimeDelta tick_interval) const {
243*6777b538SAndroid Build Coastguard Worker // |interval_offset| is the offset from |this| to the next multiple of
244*6777b538SAndroid Build Coastguard Worker // |tick_interval| after |tick_phase|, possibly negative if in the past.
245*6777b538SAndroid Build Coastguard Worker TimeDelta interval_offset = (tick_phase - *this) % tick_interval;
246*6777b538SAndroid Build Coastguard Worker // If |this| is exactly on the interval (i.e. offset==0), don't adjust.
247*6777b538SAndroid Build Coastguard Worker // Otherwise, if |tick_phase| was in the past, adjust forward to the next
248*6777b538SAndroid Build Coastguard Worker // tick after |this|.
249*6777b538SAndroid Build Coastguard Worker if (!interval_offset.is_zero() && tick_phase < *this)
250*6777b538SAndroid Build Coastguard Worker interval_offset += tick_interval;
251*6777b538SAndroid Build Coastguard Worker return *this + interval_offset;
252*6777b538SAndroid Build Coastguard Worker }
253*6777b538SAndroid Build Coastguard Worker
operator <<(std::ostream & os,TimeTicks time_ticks)254*6777b538SAndroid Build Coastguard Worker std::ostream& operator<<(std::ostream& os, TimeTicks time_ticks) {
255*6777b538SAndroid Build Coastguard Worker // This function formats a TimeTicks object as "bogo-microseconds".
256*6777b538SAndroid Build Coastguard Worker // The origin and granularity of the count are platform-specific, and may very
257*6777b538SAndroid Build Coastguard Worker // from run to run. Although bogo-microseconds usually roughly correspond to
258*6777b538SAndroid Build Coastguard Worker // real microseconds, the only real guarantee is that the number never goes
259*6777b538SAndroid Build Coastguard Worker // down during a single run.
260*6777b538SAndroid Build Coastguard Worker const TimeDelta as_time_delta = time_ticks - TimeTicks();
261*6777b538SAndroid Build Coastguard Worker return os << as_time_delta.InMicroseconds() << " bogo-microseconds";
262*6777b538SAndroid Build Coastguard Worker }
263*6777b538SAndroid Build Coastguard Worker
264*6777b538SAndroid Build Coastguard Worker // LiveTicks ------------------------------------------------------------------
265*6777b538SAndroid Build Coastguard Worker
266*6777b538SAndroid Build Coastguard Worker // static
Now()267*6777b538SAndroid Build Coastguard Worker LiveTicks LiveTicks::Now() {
268*6777b538SAndroid Build Coastguard Worker return internal::g_live_ticks_now_function.load(std::memory_order_relaxed)();
269*6777b538SAndroid Build Coastguard Worker }
270*6777b538SAndroid Build Coastguard Worker
271*6777b538SAndroid Build Coastguard Worker #if !BUILDFLAG(IS_WIN)
272*6777b538SAndroid Build Coastguard Worker namespace subtle {
LiveTicksNowIgnoringOverride()273*6777b538SAndroid Build Coastguard Worker LiveTicks LiveTicksNowIgnoringOverride() {
274*6777b538SAndroid Build Coastguard Worker // On non-windows platforms LiveTicks is equivalent to TimeTicks already.
275*6777b538SAndroid Build Coastguard Worker // Subtract the empty `TimeTicks` from `TimeTicks::Now()` to get a `TimeDelta`
276*6777b538SAndroid Build Coastguard Worker // that can be added to the empty `LiveTicks`.
277*6777b538SAndroid Build Coastguard Worker return LiveTicks() + (TimeTicks::Now() - TimeTicks());
278*6777b538SAndroid Build Coastguard Worker }
279*6777b538SAndroid Build Coastguard Worker } // namespace subtle
280*6777b538SAndroid Build Coastguard Worker
281*6777b538SAndroid Build Coastguard Worker #endif
282*6777b538SAndroid Build Coastguard Worker
283*6777b538SAndroid Build Coastguard Worker // ThreadTicks ----------------------------------------------------------------
284*6777b538SAndroid Build Coastguard Worker
285*6777b538SAndroid Build Coastguard Worker // static
Now()286*6777b538SAndroid Build Coastguard Worker ThreadTicks ThreadTicks::Now() {
287*6777b538SAndroid Build Coastguard Worker return internal::g_thread_ticks_now_function.load(
288*6777b538SAndroid Build Coastguard Worker std::memory_order_relaxed)();
289*6777b538SAndroid Build Coastguard Worker }
290*6777b538SAndroid Build Coastguard Worker
operator <<(std::ostream & os,ThreadTicks thread_ticks)291*6777b538SAndroid Build Coastguard Worker std::ostream& operator<<(std::ostream& os, ThreadTicks thread_ticks) {
292*6777b538SAndroid Build Coastguard Worker const TimeDelta as_time_delta = thread_ticks - ThreadTicks();
293*6777b538SAndroid Build Coastguard Worker return os << as_time_delta.InMicroseconds() << " bogo-thread-microseconds";
294*6777b538SAndroid Build Coastguard Worker }
295*6777b538SAndroid Build Coastguard Worker
296*6777b538SAndroid Build Coastguard Worker // Time::Exploded -------------------------------------------------------------
297*6777b538SAndroid Build Coastguard Worker
HasValidValues() const298*6777b538SAndroid Build Coastguard Worker bool Time::Exploded::HasValidValues() const {
299*6777b538SAndroid Build Coastguard Worker // clang-format off
300*6777b538SAndroid Build Coastguard Worker return (1 <= month) && (month <= 12) &&
301*6777b538SAndroid Build Coastguard Worker (0 <= day_of_week) && (day_of_week <= 6) &&
302*6777b538SAndroid Build Coastguard Worker (1 <= day_of_month) && (day_of_month <= 31) &&
303*6777b538SAndroid Build Coastguard Worker (0 <= hour) && (hour <= 23) &&
304*6777b538SAndroid Build Coastguard Worker (0 <= minute) && (minute <= 59) &&
305*6777b538SAndroid Build Coastguard Worker (0 <= second) && (second <= 60) &&
306*6777b538SAndroid Build Coastguard Worker (0 <= millisecond) && (millisecond <= 999);
307*6777b538SAndroid Build Coastguard Worker // clang-format on
308*6777b538SAndroid Build Coastguard Worker }
309*6777b538SAndroid Build Coastguard Worker
310*6777b538SAndroid Build Coastguard Worker } // namespace base
311