• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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