1 #ifndef POSIX_TIME_CONVERSION_HPP___ 2 #define POSIX_TIME_CONVERSION_HPP___ 3 4 /* Copyright (c) 2002-2005 CrystalClear Software, Inc. 5 * Use, modification and distribution is subject to the 6 * Boost Software License, Version 1.0. (See accompanying 7 * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) 8 * Author: Jeff Garland, Bart Garst 9 * $Date$ 10 */ 11 12 #include <cstring> 13 #include <boost/cstdint.hpp> 14 #include <boost/date_time/posix_time/ptime.hpp> 15 #include <boost/date_time/posix_time/posix_time_duration.hpp> 16 #include <boost/date_time/filetime_functions.hpp> 17 #include <boost/date_time/c_time.hpp> 18 #include <boost/date_time/time_resolution_traits.hpp> // absolute_value 19 #include <boost/date_time/gregorian/conversion.hpp> 20 21 namespace boost { 22 23 namespace posix_time { 24 25 //! Function that converts a time_t into a ptime. 26 inline from_time_t(std::time_t t)27 ptime from_time_t(std::time_t t) 28 { 29 return ptime(gregorian::date(1970,1,1)) + seconds(static_cast<long>(t)); 30 } 31 32 //! Function that converts a ptime into a time_t 33 inline to_time_t(ptime pt)34 std::time_t to_time_t(ptime pt) 35 { 36 return (pt - ptime(gregorian::date(1970,1,1))).total_seconds(); 37 } 38 39 //! Convert a time to a tm structure truncating any fractional seconds 40 inline to_tm(const boost::posix_time::ptime & t)41 std::tm to_tm(const boost::posix_time::ptime& t) { 42 std::tm timetm = boost::gregorian::to_tm(t.date()); 43 boost::posix_time::time_duration td = t.time_of_day(); 44 timetm.tm_hour = static_cast<int>(td.hours()); 45 timetm.tm_min = static_cast<int>(td.minutes()); 46 timetm.tm_sec = static_cast<int>(td.seconds()); 47 timetm.tm_isdst = -1; // -1 used when dst info is unknown 48 return timetm; 49 } 50 //! Convert a time_duration to a tm structure truncating any fractional seconds and zeroing fields for date components 51 inline to_tm(const boost::posix_time::time_duration & td)52 std::tm to_tm(const boost::posix_time::time_duration& td) { 53 std::tm timetm; 54 std::memset(&timetm, 0, sizeof(timetm)); 55 timetm.tm_hour = static_cast<int>(date_time::absolute_value(td.hours())); 56 timetm.tm_min = static_cast<int>(date_time::absolute_value(td.minutes())); 57 timetm.tm_sec = static_cast<int>(date_time::absolute_value(td.seconds())); 58 timetm.tm_isdst = -1; // -1 used when dst info is unknown 59 return timetm; 60 } 61 62 //! Convert a tm struct to a ptime ignoring is_dst flag 63 inline ptime_from_tm(const std::tm & timetm)64 ptime ptime_from_tm(const std::tm& timetm) { 65 boost::gregorian::date d = boost::gregorian::date_from_tm(timetm); 66 return ptime(d, time_duration(timetm.tm_hour, timetm.tm_min, timetm.tm_sec)); 67 } 68 69 70 #if defined(BOOST_HAS_FTIME) 71 72 //! Function to create a time object from an initialized FILETIME struct. 73 /*! Function to create a time object from an initialized FILETIME struct. 74 * A FILETIME struct holds 100-nanosecond units (0.0000001). When 75 * built with microsecond resolution the FILETIME's sub second value 76 * will be truncated. Nanosecond resolution has no truncation. 77 * 78 * \note FILETIME is part of the Win32 API, so it is not portable to non-windows 79 * platforms. 80 * 81 * \note The function is templated on the FILETIME type, so that 82 * it can be used with both native FILETIME and the ad-hoc 83 * boost::detail::winapi::FILETIME_ type. 84 */ 85 template< typename TimeT, typename FileTimeT > 86 inline from_ftime(const FileTimeT & ft)87 TimeT from_ftime(const FileTimeT& ft) 88 { 89 return boost::date_time::time_from_ftime<TimeT>(ft); 90 } 91 92 #endif // BOOST_HAS_FTIME 93 94 } } //namespace boost::posix_time 95 96 97 98 99 #endif 100 101