time.cc revision c7f5f8508d98d5952d42ed7648c2a8f30a4da156
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/string_util.h"
7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/sys_string_conversions.h"
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/third_party/nspr/prtime.h"
9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/logging.h"
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace base {
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// TimeDelta ------------------------------------------------------------------
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint TimeDelta::InDays() const {
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return static_cast<int>(delta_ / Time::kMicrosecondsPerDay);
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint TimeDelta::InHours() const {
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return static_cast<int>(delta_ / Time::kMicrosecondsPerHour);
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint TimeDelta::InMinutes() const {
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return static_cast<int>(delta_ / Time::kMicrosecondsPerMinute);
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottdouble TimeDelta::InSecondsF() const {
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return static_cast<double>(delta_) / Time::kMicrosecondsPerSecond;
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint64 TimeDelta::InSeconds() const {
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return delta_ / Time::kMicrosecondsPerSecond;
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottdouble TimeDelta::InMillisecondsF() const {
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return static_cast<double>(delta_) / Time::kMicrosecondsPerMillisecond;
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint64 TimeDelta::InMilliseconds() const {
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return delta_ / Time::kMicrosecondsPerMillisecond;
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint64 TimeDelta::InMillisecondsRoundedUp() const {
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return (delta_ + Time::kMicrosecondsPerMillisecond - 1) /
46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      Time::kMicrosecondsPerMillisecond;
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint64 TimeDelta::InMicroseconds() const {
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return delta_;
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Time -----------------------------------------------------------------------
54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static
56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTime Time::FromTimeT(time_t tt) {
57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (tt == 0)
58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return Time();  // Preserve 0 so we can tell it doesn't exist.
59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return Time((tt * kMicrosecondsPerSecond) + kTimeTToMicrosecondsOffset);
60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttime_t Time::ToTimeT() const {
63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (us_ == 0)
64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return 0;  // Preserve 0 so we can tell it doesn't exist.
65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return (us_ - kTimeTToMicrosecondsOffset) / kMicrosecondsPerSecond;
66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static
69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTime Time::FromDoubleT(double dt) {
70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return Time(static_cast<int64>((dt *
71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                  static_cast<double>(kMicrosecondsPerSecond)) +
72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                 kTimeTToMicrosecondsOffset));
73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottdouble Time::ToDoubleT() const {
76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (us_ == 0)
77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return 0;  // Preserve 0 so we can tell it doesn't exist.
78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return (static_cast<double>(us_ - kTimeTToMicrosecondsOffset) /
79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          static_cast<double>(kMicrosecondsPerSecond));
80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTime Time::LocalMidnight() const {
83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Exploded exploded;
84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  LocalExplode(&exploded);
85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  exploded.hour = 0;
86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  exploded.minute = 0;
87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  exploded.second = 0;
88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  exploded.millisecond = 0;
89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return FromLocalExploded(exploded);
90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static
93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottbool Time::FromString(const wchar_t* time_string, Time* parsed_time) {
94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DCHECK((time_string != NULL) && (parsed_time != NULL));
95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  std::string ascii_time_string = SysWideToUTF8(time_string);
96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (ascii_time_string.length() == 0)
97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return false;
98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  PRTime result_time = 0;
99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  PRStatus result = PR_ParseTimeString(ascii_time_string.c_str(), PR_FALSE,
100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                       &result_time);
101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (PR_SUCCESS != result)
102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return false;
103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  result_time += kTimeTToMicrosecondsOffset;
104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  *parsed_time = Time(result_time);
105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return true;
106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // namespace base
109