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