13f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file.
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Time represents an absolute point in time, internally represented as
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// microseconds (s/1,000,000) since a platform-dependent epoch.  Each
7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// platform's epoch, along with other system-dependent clock interface
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// routines, is defined in time_PLATFORM.cc.
9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// TimeDelta represents a duration of time, internally represented in
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// microseconds.
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// TimeTicks represents an abstract time that is always incrementing for use
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// in measuring time durations. It is internally represented in microseconds.
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// It can not be converted to a human-readable time, but is guaranteed not to
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// decrease (if the user changes the computer clock, Time::Now() may actually
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// decrease or jump).
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// These classes are represented as only a 64-bit value, so they can be
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// efficiently passed by value.
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef BASE_TIME_H_
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define BASE_TIME_H_
243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <time.h>
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/base_api.h"
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/basictypes.h"
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_POSIX)
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// For struct timeval.
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <sys/time.h>
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if defined(OS_WIN)
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// For FILETIME in FromFileTime, until it moves to a new converter class.
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// See TODO(iyengar) below.
39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <windows.h>
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace base {
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass Time;
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass TimeTicks;
46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This unit test does a lot of manual time manipulation.
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass PageLoadTrackerUnitTest;
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// TimeDelta ------------------------------------------------------------------
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass BASE_API TimeDelta {
53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public:
54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TimeDelta() : delta_(0) {
55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Converts units of time to TimeDeltas.
58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static TimeDelta FromDays(int64 days);
59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static TimeDelta FromHours(int64 hours);
60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static TimeDelta FromMinutes(int64 minutes);
61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static TimeDelta FromSeconds(int64 secs);
62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static TimeDelta FromMilliseconds(int64 ms);
63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static TimeDelta FromMicroseconds(int64 us);
64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Returns the internal numeric value of the TimeDelta object. Please don't
66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // use this and do arithmetic on it, as it is more error prone than using the
67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // provided operators.
68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int64 ToInternalValue() const {
69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return delta_;
70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if defined(OS_POSIX)
73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  struct timespec ToTimeSpec() const;
74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Returns the time delta in some unit. The F versions return a floating
77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // point value, the "regular" versions return a rounded-down value.
78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //
79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // InMillisecondsRoundedUp() instead returns an integer that is rounded up
80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // to the next full millisecond.
81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int InDays() const;
82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int InHours() const;
83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int InMinutes() const;
84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  double InSecondsF() const;
85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int64 InSeconds() const;
86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  double InMillisecondsF() const;
87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int64 InMilliseconds() const;
88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int64 InMillisecondsRoundedUp() const;
89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int64 InMicroseconds() const;
90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TimeDelta& operator=(TimeDelta other) {
92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    delta_ = other.delta_;
93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return *this;
94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Computations with other deltas.
97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TimeDelta operator+(TimeDelta other) const {
98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return TimeDelta(delta_ + other.delta_);
99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TimeDelta operator-(TimeDelta other) const {
101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return TimeDelta(delta_ - other.delta_);
102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TimeDelta& operator+=(TimeDelta other) {
105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    delta_ += other.delta_;
106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return *this;
107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TimeDelta& operator-=(TimeDelta other) {
109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    delta_ -= other.delta_;
110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return *this;
111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TimeDelta operator-() const {
113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return TimeDelta(-delta_);
114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Computations with ints, note that we only allow multiplicative operations
117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // with ints, and additive operations with other deltas.
118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TimeDelta operator*(int64 a) const {
119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return TimeDelta(delta_ * a);
120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TimeDelta operator/(int64 a) const {
122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return TimeDelta(delta_ / a);
123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TimeDelta& operator*=(int64 a) {
125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    delta_ *= a;
126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return *this;
127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TimeDelta& operator/=(int64 a) {
129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    delta_ /= a;
130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return *this;
131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int64 operator/(TimeDelta a) const {
133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return delta_ / a.delta_;
134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Defined below because it depends on the definition of the other classes.
137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Time operator+(Time t) const;
138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TimeTicks operator+(TimeTicks t) const;
139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Comparison operators.
141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool operator==(TimeDelta other) const {
142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return delta_ == other.delta_;
143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool operator!=(TimeDelta other) const {
145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return delta_ != other.delta_;
146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool operator<(TimeDelta other) const {
148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return delta_ < other.delta_;
149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool operator<=(TimeDelta other) const {
151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return delta_ <= other.delta_;
152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool operator>(TimeDelta other) const {
154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return delta_ > other.delta_;
155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool operator>=(TimeDelta other) const {
157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return delta_ >= other.delta_;
158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private:
161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  friend class Time;
162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  friend class TimeTicks;
163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  friend TimeDelta operator*(int64 a, TimeDelta td);
164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Constructs a delta given the duration in microseconds. This is private
166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // to avoid confusion by callers with an integer constructor. Use
167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // FromSeconds, FromMilliseconds, etc. instead.
168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  explicit TimeDelta(int64 delta_us) : delta_(delta_us) {
169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Delta in microseconds.
172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int64 delta_;
173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottinline TimeDelta operator*(int64 a, TimeDelta td) {
176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return TimeDelta(a * td.delta_);
177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Time -----------------------------------------------------------------------
180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Represents a wall clock time.
182ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass BASE_API Time {
183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public:
184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static const int64 kMillisecondsPerSecond = 1000;
185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static const int64 kMicrosecondsPerMillisecond = 1000;
186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static const int64 kMicrosecondsPerSecond = kMicrosecondsPerMillisecond *
187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                              kMillisecondsPerSecond;
188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static const int64 kMicrosecondsPerMinute = kMicrosecondsPerSecond * 60;
189c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static const int64 kMicrosecondsPerHour = kMicrosecondsPerMinute * 60;
190c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static const int64 kMicrosecondsPerDay = kMicrosecondsPerHour * 24;
191c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static const int64 kMicrosecondsPerWeek = kMicrosecondsPerDay * 7;
192c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static const int64 kNanosecondsPerMicrosecond = 1000;
193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static const int64 kNanosecondsPerSecond = kNanosecondsPerMicrosecond *
194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                             kMicrosecondsPerSecond;
195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if !defined(OS_WIN)
197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // On Mac & Linux, this value is the delta from the Windows epoch of 1601 to
198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // the Posix delta of 1970. This is used for migrating between the old
199c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // 1970-based epochs to the new 1601-based ones. It should be removed from
200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // this global header and put in the platform-specific ones when we remove the
201c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // migration code.
202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static const int64 kWindowsEpochDeltaMicroseconds;
203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Represents an exploded time that can be formatted nicely. This is kind of
206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // like the Win32 SYSTEMTIME structure or the Unix "struct tm" with a few
207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // additions and changes to prevent errors.
208ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  struct BASE_API Exploded {
209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int year;          // Four digit year "2007"
210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int month;         // 1-based month (values 1 = January, etc.)
211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int day_of_week;   // 0-based day of week (0 = Sunday, etc.)
212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int day_of_month;  // 1-based day of month (1-31)
213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int hour;          // Hour within the current day (0-23)
214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int minute;        // Minute within the current hour (0-59)
215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int second;        // Second within the current minute (0-59 plus leap
216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                       //   seconds which may take it up to 60).
217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int millisecond;   // Milliseconds within the current second (0-999)
2183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // A cursory test for whether the data members are within their
2203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // respective ranges. A 'true' return value does not guarantee the
2213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    // Exploded value can be successfully converted to a Time value.
2223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    bool HasValidValues() const;
223c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  };
224c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
225c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Contains the NULL time. Use Time::Now() to get the current time.
226c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  explicit Time() : us_(0) {
227c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
228c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Returns true if the time object has not been initialized.
230c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool is_null() const {
231c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return us_ == 0;
232c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
2343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Returns the time for epoch in Unix-like system (Jan 1, 1970).
2353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  static Time UnixEpoch();
2363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
237c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Returns the current time. Watch out, the system might adjust its clock
238c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // in which case time will actually go backwards. We don't guarantee that
239c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // times are increasing, or that two calls to Now() won't be the same.
240c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static Time Now();
241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
242c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Returns the current time. Same as Now() except that this function always
243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // uses system time so that there are no discrepancies between the returned
244c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // time and system time even on virtual environments including our test bot.
245c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // For timing sensitive unittests, this function should be used.
246c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static Time NowFromSystemTime();
247c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
248c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Converts to/from time_t in UTC and a Time class.
249c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // TODO(brettw) this should be removed once everybody starts using the |Time|
250c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // class.
251c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static Time FromTimeT(time_t tt);
252c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  time_t ToTimeT() const;
253c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
254c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Converts time to/from a double which is the number of seconds since epoch
255c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // (Jan 1, 1970).  Webkit uses this format to represent time.
2563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Because WebKit initializes double time value to 0 to indicate "not
2573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // initialized", we map it to empty Time object that also means "not
2583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // initialized".
259c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static Time FromDoubleT(double dt);
260c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  double ToDoubleT() const;
261c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_POSIX)
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  struct timeval ToTimeVal() const;
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
265c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
266c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if defined(OS_WIN)
267c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static Time FromFileTime(FILETIME ft);
268c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FILETIME ToFileTime() const;
269c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The minimum time of a low resolution timer.  This is basically a windows
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // constant of ~15.6ms.  While it does vary on some older OS versions, we'll
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // treat it as static across all windows versions.
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static const int kMinLowResolutionThresholdMs = 16;
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Enable or disable Windows high resolution timer. If the high resolution
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // timer is not enabled, calls to ActivateHighResolutionTimer will fail.
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // When disabling the high resolution timer, this function will not cause
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the high resolution timer to be deactivated, but will prevent future
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // activations.
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Must be called from the main thread.
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // For more details see comments in time_win.cc.
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static void EnableHighResolutionTimer(bool enable);
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Activates or deactivates the high resolution timer based on the |activate|
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // flag.  If the HighResolutionTimer is not Enabled (see
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // EnableHighResolutionTimer), this function will return false.  Otherwise
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // returns true.
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // All callers to activate the high resolution timer must eventually call
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // this function to deactivate the high resolution timer.
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static bool ActivateHighResolutionTimer(bool activate);
291c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
292c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
293c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Converts an exploded structure representing either the local time or UTC
294c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // into a Time class.
295c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static Time FromUTCExploded(const Exploded& exploded) {
296c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return FromExploded(false, exploded);
297c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
298c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static Time FromLocalExploded(const Exploded& exploded) {
299c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return FromExploded(true, exploded);
300c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
301c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
302c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Converts an integer value representing Time to a class. This is used
303c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // when deserializing a |Time| structure, using a value known to be
304c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // compatible. It is not provided as a constructor because the integer type
305c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // may be unclear from the perspective of a caller.
306c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static Time FromInternalValue(int64 us) {
307c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return Time(us);
308c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
309c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
310c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Converts a string representation of time to a Time object.
311c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // An example of a time string which is converted is as below:-
312c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // "Tue, 15 Nov 1994 12:45:26 GMT". If the timezone is not specified
313c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // in the input string, we assume local time.
314c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // TODO(iyengar) Move the FromString/FromTimeT/ToTimeT/FromFileTime to
315c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // a new time converter class.
316c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static bool FromString(const wchar_t* time_string, Time* parsed_time);
317c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
318c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // For serializing, use FromInternalValue to reconstitute. Please don't use
319c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // this and do arithmetic on it, as it is more error prone than using the
320c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // provided operators.
321c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int64 ToInternalValue() const {
322c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return us_;
323c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
324c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
325c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Fills the given exploded structure with either the local time or UTC from
326c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // this time structure (containing UTC).
327c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void UTCExplode(Exploded* exploded) const {
328c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return Explode(false, exploded);
329c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
330c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void LocalExplode(Exploded* exploded) const {
331c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return Explode(true, exploded);
332c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
333c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
334c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Rounds this time down to the nearest day in local time. It will represent
335c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // midnight on that day.
336c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Time LocalMidnight() const;
337c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
338c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Time& operator=(Time other) {
339c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    us_ = other.us_;
340c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return *this;
341c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
342c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
343c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Compute the difference between two times.
344c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TimeDelta operator-(Time other) const {
345c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return TimeDelta(us_ - other.us_);
346c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
347c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
348c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Modify by some time delta.
349c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Time& operator+=(TimeDelta delta) {
350c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    us_ += delta.delta_;
351c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return *this;
352c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
353c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Time& operator-=(TimeDelta delta) {
354c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    us_ -= delta.delta_;
355c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return *this;
356c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
357c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
358c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Return a new time modified by some delta.
359c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Time operator+(TimeDelta delta) const {
360c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return Time(us_ + delta.delta_);
361c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
362c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Time operator-(TimeDelta delta) const {
363c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return Time(us_ - delta.delta_);
364c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
365c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
366c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Comparison operators
367c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool operator==(Time other) const {
368c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return us_ == other.us_;
369c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
370c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool operator!=(Time other) const {
371c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return us_ != other.us_;
372c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
373c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool operator<(Time other) const {
374c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return us_ < other.us_;
375c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
376c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool operator<=(Time other) const {
377c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return us_ <= other.us_;
378c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
379c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool operator>(Time other) const {
380c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return us_ > other.us_;
381c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
382c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool operator>=(Time other) const {
383c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return us_ >= other.us_;
384c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
385c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
386c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private:
387c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  friend class TimeDelta;
388c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
3893f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  explicit Time(int64 us) : us_(us) {
3903f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  }
3913f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
392c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Explodes the given time to either local time |is_local = true| or UTC
393c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // |is_local = false|.
394c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void Explode(bool is_local, Exploded* exploded) const;
395c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
396c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Unexplodes a given time assuming the source is either local time
397c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // |is_local = true| or UTC |is_local = false|.
398c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static Time FromExploded(bool is_local, const Exploded& exploded);
399c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
400c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // The representation of Jan 1, 1970 UTC in microseconds since the
401c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // platform-dependent epoch.
402c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static const int64 kTimeTToMicrosecondsOffset;
403c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_WIN)
405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Indicates whether fast timers are usable right now.  For instance,
406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // when using battery power, we might elect to prevent high speed timers
407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // which would draw more power.
408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static bool high_resolution_timer_enabled_;
409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
411c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Time in microseconds in UTC.
412c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int64 us_;
413c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
414c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
415c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Inline the TimeDelta factory methods, for fast TimeDelta construction.
416c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
417c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static
418c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottinline TimeDelta TimeDelta::FromDays(int64 days) {
419c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return TimeDelta(days * Time::kMicrosecondsPerDay);
420c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
421c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
422c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static
423c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottinline TimeDelta TimeDelta::FromHours(int64 hours) {
424c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return TimeDelta(hours * Time::kMicrosecondsPerHour);
425c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
426c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
427c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static
428c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottinline TimeDelta TimeDelta::FromMinutes(int64 minutes) {
429c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return TimeDelta(minutes * Time::kMicrosecondsPerMinute);
430c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
431c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
432c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static
433c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottinline TimeDelta TimeDelta::FromSeconds(int64 secs) {
434c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return TimeDelta(secs * Time::kMicrosecondsPerSecond);
435c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
436c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
437c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static
438c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottinline TimeDelta TimeDelta::FromMilliseconds(int64 ms) {
439c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return TimeDelta(ms * Time::kMicrosecondsPerMillisecond);
440c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
441c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
442c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static
443c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottinline TimeDelta TimeDelta::FromMicroseconds(int64 us) {
444c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return TimeDelta(us);
445c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
446c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
44772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monseninline Time TimeDelta::operator+(Time t) const {
44872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return Time(t.us_ + delta_);
44972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
45072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
451c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// TimeTicks ------------------------------------------------------------------
452c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
453ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass BASE_API TimeTicks {
454c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public:
455c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TimeTicks() : ticks_(0) {
456c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
457c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
458c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Platform-dependent tick count representing "right now."
459c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // The resolution of this clock is ~1-15ms.  Resolution varies depending
460c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // on hardware/operating system configuration.
461c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static TimeTicks Now();
462c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
463c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Returns a platform-dependent high-resolution tick count. Implementation
464c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // is hardware dependent and may or may not return sub-millisecond
465c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // resolution.  THIS CALL IS GENERALLY MUCH MORE EXPENSIVE THAN Now() AND
466c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // SHOULD ONLY BE USED WHEN IT IS REALLY NEEDED.
467c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static TimeTicks HighResNow();
468c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
4693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(OS_WIN)
4703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Get the absolute value of QPC time drift. For testing.
4713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  static int64 GetQPCDriftMicroseconds();
4723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
4733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Returns true if the high resolution clock is working on this system.
4743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // This is only for testing.
4753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  static bool IsHighResClockWorking();
4763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif
4773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
478c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Returns true if this object has not been initialized.
479c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool is_null() const {
480c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return ticks_ == 0;
481c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
482c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
483c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Returns the internal numeric value of the TimeTicks object.
484c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int64 ToInternalValue() const {
485c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return ticks_;
486c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
487c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
488c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TimeTicks& operator=(TimeTicks other) {
489c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ticks_ = other.ticks_;
490c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return *this;
491c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
492c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
493c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Compute the difference between two times.
494c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TimeDelta operator-(TimeTicks other) const {
495c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return TimeDelta(ticks_ - other.ticks_);
496c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
497c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
498c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Modify by some time delta.
499c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TimeTicks& operator+=(TimeDelta delta) {
500c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ticks_ += delta.delta_;
501c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return *this;
502c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
503c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TimeTicks& operator-=(TimeDelta delta) {
504c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ticks_ -= delta.delta_;
505c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return *this;
506c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
507c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
508c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Return a new TimeTicks modified by some delta.
509c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TimeTicks operator+(TimeDelta delta) const {
510c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return TimeTicks(ticks_ + delta.delta_);
511c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
512c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TimeTicks operator-(TimeDelta delta) const {
513c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return TimeTicks(ticks_ - delta.delta_);
514c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
515c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
516c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Comparison operators
517c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool operator==(TimeTicks other) const {
518c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return ticks_ == other.ticks_;
519c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
520c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool operator!=(TimeTicks other) const {
521c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return ticks_ != other.ticks_;
522c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
523c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool operator<(TimeTicks other) const {
524c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return ticks_ < other.ticks_;
525c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
526c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool operator<=(TimeTicks other) const {
527c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return ticks_ <= other.ticks_;
528c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
529c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool operator>(TimeTicks other) const {
530c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return ticks_ > other.ticks_;
531c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
532c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool operator>=(TimeTicks other) const {
533c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return ticks_ >= other.ticks_;
534c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
535c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
536c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott protected:
537c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  friend class TimeDelta;
538c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  friend class PageLoadTrackerUnitTest;
539c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
540c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Please use Now() to create a new object. This is for internal use
541c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // and testing. Ticks is in microseconds.
542c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  explicit TimeTicks(int64 ticks) : ticks_(ticks) {
543c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
544c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
545c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Tick count in microseconds.
546c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int64 ticks_;
547c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
548c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if defined(OS_WIN)
549c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  typedef DWORD (*TickFunctionType)(void);
550c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static TickFunctionType SetMockTickFunction(TickFunctionType ticker);
551c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
552c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
553c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
554c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottinline TimeTicks TimeDelta::operator+(TimeTicks t) const {
555c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return TimeTicks(t.ticks_ + delta_);
556c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
557c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
558c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // namespace base
559c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
560c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif  // BASE_TIME_H_
561