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