Index: base/time/time_mac.cc |
diff --git a/base/time/time_mac.cc b/base/time/time_mac.cc |
index c23c4917e757f492ab7a6cc151158a55901878ef..9863f871a0b99c6f065afcc120511b915fd7ef39 100644 |
--- a/base/time/time_mac.cc |
+++ b/base/time/time_mac.cc |
@@ -184,8 +184,61 @@ Time Time::FromExploded(bool is_local, const Exploded& exploded) { |
exploded.day_of_month, exploded.hour, exploded.minute, exploded.second, |
exploded.millisecond); |
CFAbsoluteTime seconds = absolute_time + kCFAbsoluteTimeIntervalSince1970; |
- return Time(static_cast<int64_t>(seconds * kMicrosecondsPerSecond) + |
- kWindowsEpochDeltaMicroseconds); |
+ |
+ base::Time t_time = |
mmenke
2016/05/20 19:44:56
nit: t_time seems like a weird variable name - it
maksims (do not use this acc)
2016/05/24 09:14:21
Done. I already have a "time" in the function argu
|
+ Time(static_cast<int64_t>(seconds * kMicrosecondsPerSecond) + |
+ kWindowsEpochDeltaMicroseconds); |
+ |
+ // If |exploded.day_of_month| is set to 31 |
+ // on a 28-30 day month, it will return the first day of the next month. |
+ // Thus round-trip the time and compare the initial |exploded| with |
+ // |utc_to_exploded| time. |
mmenke
2016/05/20 19:44:56
nit: Comment can be reformatted - first line of t
maksims (do not use this acc)
2016/05/24 09:14:21
Done.
|
+ base::Time::Exploded to_exploded; |
+ if (!is_local) |
+ t_time.UTCExplode(&to_exploded); |
+ else |
+ t_time.LocalExplode(&to_exploded); |
+ |
+ return to_exploded != exploded ? Time(0) : t_time; |
+} |
+ |
+// static |
+bool Time::FromExploded(bool is_local, const Exploded& exploded, Time& time) { |
+ base::ScopedCFTypeRef<CFTimeZoneRef> time_zone( |
+ is_local |
+ ? CFTimeZoneCopySystem() |
+ : CFTimeZoneCreateWithTimeIntervalFromGMT(kCFAllocatorDefault, 0)); |
+ base::ScopedCFTypeRef<CFCalendarRef> gregorian(CFCalendarCreateWithIdentifier( |
+ kCFAllocatorDefault, kCFGregorianCalendar)); |
+ CFCalendarSetTimeZone(gregorian, time_zone); |
+ CFAbsoluteTime absolute_time; |
+ // 'S' is not defined in componentDesc in Apple documentation, but can be |
+ // found at http://www.opensource.apple.com/source/CF/CF-855.17/CFCalendar.c |
+ CFCalendarComposeAbsoluteTime( |
+ gregorian, &absolute_time, "yMdHmsS", exploded.year, exploded.month, |
+ exploded.day_of_month, exploded.hour, exploded.minute, exploded.second, |
+ exploded.millisecond); |
+ CFAbsoluteTime seconds = absolute_time + kCFAbsoluteTimeIntervalSince1970; |
+ |
+ base::Time t_time = |
+ Time(static_cast<int64_t>(seconds * kMicrosecondsPerSecond) + |
+ kWindowsEpochDeltaMicroseconds); |
+ |
+ // If |exploded.day_of_month| is set to 31 |
+ // on a 28-30 day month, it will return the first day of the next month. |
+ // Thus round-trip the time and compare the initial |exploded| with |
+ // |utc_to_exploded| time. |
+ base::Time::Exploded to_exploded; |
+ if (!is_local) |
+ t_time.UTCExplode(&to_exploded); |
+ else |
+ t_time.LocalExplode(&to_exploded); |
+ |
+ time = to_exploded != exploded ? Time(0) : t_time; |
+ |
+ // If time is null, return false |
+ // which means time conversion failed |
+ return time.is_null() ? false : true; |
} |
void Time::Explode(bool is_local, Exploded* exploded) const { |