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