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