1 // Copyright (c) 2009 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/time.h"
6 #include "base/sys_string_conversions.h"
7 #include "base/third_party/nspr/prtime.h"
8
9 #include "base/logging.h"
10
11 namespace base {
12
13 // TimeDelta ------------------------------------------------------------------
14
InDays() const15 int TimeDelta::InDays() const {
16 return static_cast<int>(delta_ / Time::kMicrosecondsPerDay);
17 }
18
InHours() const19 int TimeDelta::InHours() const {
20 return static_cast<int>(delta_ / Time::kMicrosecondsPerHour);
21 }
22
InMinutes() const23 int TimeDelta::InMinutes() const {
24 return static_cast<int>(delta_ / Time::kMicrosecondsPerMinute);
25 }
26
InSecondsF() const27 double TimeDelta::InSecondsF() const {
28 return static_cast<double>(delta_) / Time::kMicrosecondsPerSecond;
29 }
30
InSeconds() const31 int64 TimeDelta::InSeconds() const {
32 return delta_ / Time::kMicrosecondsPerSecond;
33 }
34
InMillisecondsF() const35 double TimeDelta::InMillisecondsF() const {
36 return static_cast<double>(delta_) / Time::kMicrosecondsPerMillisecond;
37 }
38
InMilliseconds() const39 int64 TimeDelta::InMilliseconds() const {
40 return delta_ / Time::kMicrosecondsPerMillisecond;
41 }
42
InMillisecondsRoundedUp() const43 int64 TimeDelta::InMillisecondsRoundedUp() const {
44 return (delta_ + Time::kMicrosecondsPerMillisecond - 1) /
45 Time::kMicrosecondsPerMillisecond;
46 }
47
InMicroseconds() const48 int64 TimeDelta::InMicroseconds() const {
49 return delta_;
50 }
51
52 // Time -----------------------------------------------------------------------
53
54 // static
FromTimeT(time_t tt)55 Time Time::FromTimeT(time_t tt) {
56 if (tt == 0)
57 return Time(); // Preserve 0 so we can tell it doesn't exist.
58 return Time((tt * kMicrosecondsPerSecond) + kTimeTToMicrosecondsOffset);
59 }
60
ToTimeT() const61 time_t Time::ToTimeT() const {
62 if (us_ == 0)
63 return 0; // Preserve 0 so we can tell it doesn't exist.
64 return (us_ - kTimeTToMicrosecondsOffset) / kMicrosecondsPerSecond;
65 }
66
67 // static
FromDoubleT(double dt)68 Time Time::FromDoubleT(double dt) {
69 if (dt == 0)
70 return Time(); // Preserve 0 so we can tell it doesn't exist.
71 return Time(static_cast<int64>((dt *
72 static_cast<double>(kMicrosecondsPerSecond)) +
73 kTimeTToMicrosecondsOffset));
74 }
75
ToDoubleT() const76 double Time::ToDoubleT() const {
77 if (us_ == 0)
78 return 0; // Preserve 0 so we can tell it doesn't exist.
79 return (static_cast<double>(us_ - kTimeTToMicrosecondsOffset) /
80 static_cast<double>(kMicrosecondsPerSecond));
81 }
82
83 // static
UnixEpoch()84 Time Time::UnixEpoch() {
85 Time time;
86 time.us_ = kTimeTToMicrosecondsOffset;
87 return time;
88 }
89
LocalMidnight() const90 Time Time::LocalMidnight() const {
91 Exploded exploded;
92 LocalExplode(&exploded);
93 exploded.hour = 0;
94 exploded.minute = 0;
95 exploded.second = 0;
96 exploded.millisecond = 0;
97 return FromLocalExploded(exploded);
98 }
99
100 // static
FromString(const wchar_t * time_string,Time * parsed_time)101 bool Time::FromString(const wchar_t* time_string, Time* parsed_time) {
102 DCHECK((time_string != NULL) && (parsed_time != NULL));
103 std::string ascii_time_string = SysWideToUTF8(time_string);
104 if (ascii_time_string.length() == 0)
105 return false;
106 PRTime result_time = 0;
107 PRStatus result = PR_ParseTimeString(ascii_time_string.c_str(), PR_FALSE,
108 &result_time);
109 if (PR_SUCCESS != result)
110 return false;
111 result_time += kTimeTToMicrosecondsOffset;
112 *parsed_time = Time(result_time);
113 return true;
114 }
115
116 // Time::Exploded -------------------------------------------------------------
117
is_in_range(int value,int lo,int hi)118 inline bool is_in_range(int value, int lo, int hi) {
119 return lo <= value && value <= hi;
120 }
121
HasValidValues() const122 bool Time::Exploded::HasValidValues() const {
123 return is_in_range(month, 1, 12) &&
124 is_in_range(day_of_week, 0, 6) &&
125 is_in_range(day_of_month, 1, 31) &&
126 is_in_range(hour, 0, 23) &&
127 is_in_range(minute, 0, 59) &&
128 is_in_range(second, 0, 60) &&
129 is_in_range(millisecond, 0, 999);
130 }
131
132 } // namespace base
133