Index: base/time_mac.cc |
diff --git a/base/time_mac.cc b/base/time_mac.cc |
index 6dfaa20e00fdc964bac80e6f915671b924b5b89b..e9781a611f8cfd7fa41767a6a5782e07a65c22ff 100644 |
--- a/base/time_mac.cc |
+++ b/base/time_mac.cc |
@@ -62,8 +62,7 @@ Time Time::NowFromSystemTime() { |
// static |
Time Time::FromExploded(bool is_local, const Exploded& exploded) { |
CFGregorianDate date; |
- date.second = exploded.second + |
- exploded.millisecond / static_cast<double>(kMillisecondsPerSecond); |
+ date.second = exploded.second; |
date.minute = exploded.minute; |
date.hour = exploded.hour; |
date.day = exploded.day_of_month; |
@@ -74,18 +73,24 @@ Time Time::FromExploded(bool is_local, const Exploded& exploded) { |
time_zone(is_local ? CFTimeZoneCopySystem() : NULL); |
CFAbsoluteTime seconds = CFGregorianDateGetAbsoluteTime(date, time_zone) + |
kCFAbsoluteTimeIntervalSince1970; |
- return Time(static_cast<int64>(seconds * kMicrosecondsPerSecond) + |
+ Time result(static_cast<int64>(seconds * kMicrosecondsPerSecond) + |
kWindowsEpochDeltaMicroseconds); |
+ |
+ // Need to add milliseconds in at the end because |
+ // CFGregorianDateGetAbsoluteTime deals only in second resolution. |
+ result += TimeDelta::FromMilliseconds(exploded.millisecond); |
+ return result; |
} |
void Time::Explode(bool is_local, Exploded* exploded) const { |
- CFAbsoluteTime seconds = |
+ double seconds = |
(static_cast<double>((us_ - kWindowsEpochDeltaMicroseconds) / |
kMicrosecondsPerSecond) - kCFAbsoluteTimeIntervalSince1970); |
base::mac::ScopedCFTypeRef<CFTimeZoneRef> |
time_zone(is_local ? CFTimeZoneCopySystem() : NULL); |
- CFGregorianDate date = CFAbsoluteTimeGetGregorianDate(seconds, time_zone); |
+ CFGregorianDate date = CFAbsoluteTimeGetGregorianDate( |
+ static_cast<CFAbsoluteTime>(seconds), time_zone); |
exploded->year = date.year; |
exploded->month = date.month; |
@@ -93,9 +98,8 @@ void Time::Explode(bool is_local, Exploded* exploded) const { |
exploded->hour = date.hour; |
exploded->minute = date.minute; |
exploded->second = date.second; |
- exploded->millisecond = |
- static_cast<int>(date.second * kMillisecondsPerSecond) % |
- kMillisecondsPerSecond; |
+ exploded->millisecond = static_cast<int>( |
+ static_cast<int64>(seconds * kMillisecondsPerSecond) % kMillisecondsPerSecond); |
} |
// TimeTicks ------------------------------------------------------------------ |