| #ifndef POSIX_TIME_CONVERSION_HPP___ |
| #define POSIX_TIME_CONVERSION_HPP___ |
| |
| /* Copyright (c) 2002-2005 CrystalClear Software, Inc. |
| * Use, modification and distribution is subject to the |
| * Boost Software License, Version 1.0. (See accompanying |
| * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) |
| * Author: Jeff Garland, Bart Garst |
| * $Date: 2010-06-09 14:10:13 -0400 (Wed, 09 Jun 2010) $ |
| */ |
| |
| #include <cstring> |
| #include <boost/date_time/posix_time/ptime.hpp> |
| #include <boost/date_time/posix_time/posix_time_duration.hpp> |
| #include <boost/date_time/filetime_functions.hpp> |
| #include <boost/date_time/c_time.hpp> |
| #include <boost/date_time/time_resolution_traits.hpp> // absolute_value |
| #include <boost/date_time/gregorian/conversion.hpp> |
| |
| namespace boost { |
| |
| namespace posix_time { |
| |
| |
| //! Function that converts a time_t into a ptime. |
| inline |
| ptime from_time_t(std::time_t t) |
| { |
| ptime start(gregorian::date(1970,1,1)); |
| return start + seconds(static_cast<long>(t)); |
| } |
| |
| //! Convert a time to a tm structure truncating any fractional seconds |
| inline |
| std::tm to_tm(const boost::posix_time::ptime& t) { |
| std::tm timetm = boost::gregorian::to_tm(t.date()); |
| boost::posix_time::time_duration td = t.time_of_day(); |
| timetm.tm_hour = td.hours(); |
| timetm.tm_min = td.minutes(); |
| timetm.tm_sec = td.seconds(); |
| timetm.tm_isdst = -1; // -1 used when dst info is unknown |
| return timetm; |
| } |
| //! Convert a time_duration to a tm structure truncating any fractional seconds and zeroing fields for date components |
| inline |
| std::tm to_tm(const boost::posix_time::time_duration& td) { |
| std::tm timetm; |
| std::memset(&timetm, 0, sizeof(timetm)); |
| timetm.tm_hour = date_time::absolute_value(td.hours()); |
| timetm.tm_min = date_time::absolute_value(td.minutes()); |
| timetm.tm_sec = date_time::absolute_value(td.seconds()); |
| timetm.tm_isdst = -1; // -1 used when dst info is unknown |
| return timetm; |
| } |
| |
| //! Convert a tm struct to a ptime ignoring is_dst flag |
| inline |
| ptime ptime_from_tm(const std::tm& timetm) { |
| boost::gregorian::date d = boost::gregorian::date_from_tm(timetm); |
| return ptime(d, time_duration(timetm.tm_hour, timetm.tm_min, timetm.tm_sec)); |
| } |
| |
| |
| #if defined(BOOST_HAS_FTIME) |
| |
| //! Function to create a time object from an initialized FILETIME struct. |
| /*! Function to create a time object from an initialized FILETIME struct. |
| * A FILETIME struct holds 100-nanosecond units (0.0000001). When |
| * built with microsecond resolution the FILETIME's sub second value |
| * will be truncated. Nanosecond resolution has no truncation. |
| * |
| * \note FILETIME is part of the Win32 API, so it is not portable to non-windows |
| * platforms. |
| * |
| * \note The function is templated on the FILETIME type, so that |
| * it can be used with both native FILETIME and the ad-hoc |
| * boost::date_time::winapi::file_time type. |
| */ |
| template< typename TimeT, typename FileTimeT > |
| inline |
| TimeT from_ftime(const FileTimeT& ft) |
| { |
| return boost::date_time::time_from_ftime<TimeT>(ft); |
| } |
| |
| #endif // BOOST_HAS_FTIME |
| |
| } } //namespace boost::posix_time |
| |
| |
| |
| |
| #endif |
| |