1 // Copyright (c) 2011 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.
6 #include "base/sys_string_conversions.h"
7 #include "base/third_party/nspr/prtime.h"
9 #include "base/logging.h"
13 // TimeDelta ------------------------------------------------------------------
15 int TimeDelta::InDays() const {
16 return static_cast<int>(delta_
/ Time::kMicrosecondsPerDay
);
19 int TimeDelta::InHours() const {
20 return static_cast<int>(delta_
/ Time::kMicrosecondsPerHour
);
23 int TimeDelta::InMinutes() const {
24 return static_cast<int>(delta_
/ Time::kMicrosecondsPerMinute
);
27 double TimeDelta::InSecondsF() const {
28 return static_cast<double>(delta_
) / Time::kMicrosecondsPerSecond
;
31 int64
TimeDelta::InSeconds() const {
32 return delta_
/ Time::kMicrosecondsPerSecond
;
35 double TimeDelta::InMillisecondsF() const {
36 return static_cast<double>(delta_
) / Time::kMicrosecondsPerMillisecond
;
39 int64
TimeDelta::InMilliseconds() const {
40 return delta_
/ Time::kMicrosecondsPerMillisecond
;
43 int64
TimeDelta::InMillisecondsRoundedUp() const {
44 return (delta_
+ Time::kMicrosecondsPerMillisecond
- 1) /
45 Time::kMicrosecondsPerMillisecond
;
48 int64
TimeDelta::InMicroseconds() const {
52 // Time -----------------------------------------------------------------------
55 Time
Time::FromTimeT(time_t tt
) {
57 return Time(); // Preserve 0 so we can tell it doesn't exist.
58 return Time((tt
* kMicrosecondsPerSecond
) + kTimeTToMicrosecondsOffset
);
61 time_t Time::ToTimeT() const {
63 return 0; // Preserve 0 so we can tell it doesn't exist.
64 return (us_
- kTimeTToMicrosecondsOffset
) / kMicrosecondsPerSecond
;
68 Time
Time::FromDoubleT(double dt
) {
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
));
76 double Time::ToDoubleT() const {
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
));
84 Time
Time::UnixEpoch() {
86 time
.us_
= kTimeTToMicrosecondsOffset
;
90 Time
Time::LocalMidnight() const {
92 LocalExplode(&exploded
);
96 exploded
.millisecond
= 0;
97 return FromLocalExploded(exploded
);
101 bool Time::FromString(const char* time_string
, Time
* parsed_time
) {
102 DCHECK((time_string
!= NULL
) && (parsed_time
!= NULL
));
104 if (time_string
[0] == '\0')
107 PRTime result_time
= 0;
108 PRStatus result
= PR_ParseTimeString(time_string
, PR_FALSE
,
110 if (PR_SUCCESS
!= result
)
113 result_time
+= kTimeTToMicrosecondsOffset
;
114 *parsed_time
= Time(result_time
);
118 // Time::Exploded -------------------------------------------------------------
120 inline bool is_in_range(int value
, int lo
, int hi
) {
121 return lo
<= value
&& value
<= hi
;
124 bool Time::Exploded::HasValidValues() const {
125 return is_in_range(month
, 1, 12) &&
126 is_in_range(day_of_week
, 0, 6) &&
127 is_in_range(day_of_month
, 1, 31) &&
128 is_in_range(hour
, 0, 23) &&
129 is_in_range(minute
, 0, 59) &&
130 is_in_range(second
, 0, 60) &&
131 is_in_range(millisecond
, 0, 999);