1c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Copyright (c) 2009 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#include "base/time.h"
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/sys_string_conversions.h"
7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/third_party/nspr/prtime.h"
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/logging.h"
10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace base {
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// TimeDelta ------------------------------------------------------------------
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint TimeDelta::InDays() const {
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return static_cast<int>(delta_ / Time::kMicrosecondsPerDay);
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint TimeDelta::InHours() const {
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return static_cast<int>(delta_ / Time::kMicrosecondsPerHour);
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint TimeDelta::InMinutes() const {
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return static_cast<int>(delta_ / Time::kMicrosecondsPerMinute);
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottdouble TimeDelta::InSecondsF() const {
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return static_cast<double>(delta_) / Time::kMicrosecondsPerSecond;
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint64 TimeDelta::InSeconds() const {
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return delta_ / Time::kMicrosecondsPerSecond;
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottdouble TimeDelta::InMillisecondsF() const {
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return static_cast<double>(delta_) / Time::kMicrosecondsPerMillisecond;
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint64 TimeDelta::InMilliseconds() const {
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return delta_ / Time::kMicrosecondsPerMillisecond;
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint64 TimeDelta::InMillisecondsRoundedUp() const {
44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return (delta_ + Time::kMicrosecondsPerMillisecond - 1) /
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      Time::kMicrosecondsPerMillisecond;
46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint64 TimeDelta::InMicroseconds() const {
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return delta_;
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Time -----------------------------------------------------------------------
53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static
55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTime Time::FromTimeT(time_t tt) {
56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (tt == 0)
57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return Time();  // Preserve 0 so we can tell it doesn't exist.
58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return Time((tt * kMicrosecondsPerSecond) + kTimeTToMicrosecondsOffset);
59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttime_t Time::ToTimeT() const {
62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (us_ == 0)
63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return 0;  // Preserve 0 so we can tell it doesn't exist.
64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return (us_ - kTimeTToMicrosecondsOffset) / kMicrosecondsPerSecond;
65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static
68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTime Time::FromDoubleT(double dt) {
693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (dt == 0)
703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return Time();  // Preserve 0 so we can tell it doesn't exist.
71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return Time(static_cast<int64>((dt *
72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                  static_cast<double>(kMicrosecondsPerSecond)) +
73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                 kTimeTToMicrosecondsOffset));
74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottdouble Time::ToDoubleT() const {
77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (us_ == 0)
78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return 0;  // Preserve 0 so we can tell it doesn't exist.
79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return (static_cast<double>(us_ - kTimeTToMicrosecondsOffset) /
80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          static_cast<double>(kMicrosecondsPerSecond));
81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static
843345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTime Time::UnixEpoch() {
853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  Time time;
863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  time.us_ = kTimeTToMicrosecondsOffset;
873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return time;
883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTime Time::LocalMidnight() const {
91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Exploded exploded;
92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  LocalExplode(&exploded);
93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  exploded.hour = 0;
94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  exploded.minute = 0;
95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  exploded.second = 0;
96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  exploded.millisecond = 0;
97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return FromLocalExploded(exploded);
98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static
101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottbool Time::FromString(const wchar_t* time_string, Time* parsed_time) {
102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DCHECK((time_string != NULL) && (parsed_time != NULL));
103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  std::string ascii_time_string = SysWideToUTF8(time_string);
104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (ascii_time_string.length() == 0)
105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return false;
106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  PRTime result_time = 0;
107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  PRStatus result = PR_ParseTimeString(ascii_time_string.c_str(), PR_FALSE,
108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                       &result_time);
109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (PR_SUCCESS != result)
110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return false;
111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  result_time += kTimeTToMicrosecondsOffset;
112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  *parsed_time = Time(result_time);
113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return true;
114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Time::Exploded -------------------------------------------------------------
1173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickinline bool is_in_range(int value, int lo, int hi) {
1193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return lo <= value && value <= hi;
1203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool Time::Exploded::HasValidValues() const {
1233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return is_in_range(month, 1, 12) &&
1243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick         is_in_range(day_of_week, 0, 6) &&
1253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick         is_in_range(day_of_month, 1, 31) &&
1263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick         is_in_range(hour, 0, 23) &&
1273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick         is_in_range(minute, 0, 59) &&
1283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick         is_in_range(second, 0, 60) &&
1293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick         is_in_range(millisecond, 0, 999);
1303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // namespace base
133