| // Copyright (c) 2011 The Chromium Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "ppapi/shared_impl/time_conversion.h" | |
| namespace ppapi { | |
| PP_Time TimeToPPTime(base::Time t) { return t.ToDoubleT(); } | |
| base::Time PPTimeToTime(PP_Time t) { | |
| // The time code handles exact "0" values as special, and produces | |
| // a "null" Time object. But calling code would expect t==0 to represent the | |
| // epoch (according to the description of PP_Time). Hence we just return the | |
| // epoch in this case. | |
| if (t == 0.0) | |
| return base::Time::UnixEpoch(); | |
| return base::Time::FromDoubleT(t); | |
| } | |
| PP_TimeTicks TimeTicksToPPTimeTicks(base::TimeTicks t) { | |
| return static_cast<double>(t.ToInternalValue()) / | |
| base::Time::kMicrosecondsPerSecond; | |
| } | |
| double PPGetLocalTimeZoneOffset(const base::Time& time) { | |
| // Explode it to local time and then unexplode it as if it were UTC. Also | |
| // explode it to UTC and unexplode it (this avoids mismatching rounding or | |
| // lack thereof). The time zone offset is their difference. | |
| base::Time::Exploded exploded = {0}; | |
| base::Time::Exploded utc_exploded = {0}; | |
| time.LocalExplode(&exploded); | |
| time.UTCExplode(&utc_exploded); | |
| if (exploded.HasValidValues() && utc_exploded.HasValidValues()) { | |
| base::Time adj_time; | |
| if (base::Time::FromUTCExploded(exploded, &adj_time)) { | |
| base::Time cur; | |
| if (base::Time::FromUTCExploded(utc_exploded, &cur)) | |
| return (adj_time - cur).InSecondsF(); | |
| } | |
| } | |
| return 0.0; | |
| } | |
| } // namespace ppapi |