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 |
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 |
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 |
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 |
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 |
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::date_time::winapi::file_time type. |
84 | */ |
85 | template< typename TimeT, typename FileTimeT > |
86 | inline |
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 | |