Reputation: 6032
I discovered a strange result in Boost C++ date time library. There is inconsistency between microsec_clock
and second_clock
, and I don't understand why is that. I am using Windows XP 32-bits
My snip of code:
using namespace boost::posix_time;
...
ptime now = second_clock::universal_time();
std::cout << "Current Time is: "<< to_iso_extended_string(now)<< std::endl;
ptime now_2 = microsec_clock::universal_time();
std::cout << "Current Time is: "<< to_iso_extended_string(now_2)<< std::endl;
...
The print-out I expected are current time without miliseconds and with milliseonds. However, what I have in my pc is:
2009-10-14T16:07:38 1970-06-24T20:36:09.375890
I don't understand why there is a weired date (year 1970???) in my microsec_clock
time. Related documentation for Boost: link to boost date time
Upvotes: 6
Views: 16239
Reputation: 205034
Not sure what could be wrong for you; the exact same code works for me.
$ cat > test.cc #include <boost/date_time/gregorian/gregorian.hpp> #include <boost/date_time/posix_time/posix_time.hpp> using namespace boost::posix_time; int main() { ptime now = second_clock::universal_time(); std::cout << "Current Time is: "<< to_iso_extended_string(now)<< std::endl; ptime now_2 = microsec_clock::universal_time(); std::cout << "Current Time is: "<< to_iso_extended_string(now_2)<< std::endl; return 0; } ^D $ c++ -lboost_date_time test.cc $ ./a.out Current Time is: 2009-10-14T16:26:55 Current Time is: 2009-10-14T16:26:55.586295
Implementation-wise, second_clock
uses time
and microsec_clock
uses gettimeofday
or GetSystemTimeAsFileTime
underneath, depending on the platform. Something appears wrong with your platform -- what is your OS and version?
What is your Boost version? If it is 1.38 or lower, upgrade to 1.39 or apply the fix to #2809 manually.
--- boost/date_time/filetime_functions.hpp (revision 53621) +++ boost/date_time/filetime_functions.hpp (revision 53622) @@ -96,9 +96,7 @@ { /* shift is difference between 1970-Jan-01 & 1601-Jan-01 * in 100-nanosecond intervals */ - const uint64_t c1 = 27111902UL; - const uint64_t c2 = 3577643008UL; // issues warning without 'UL' - const uint64_t shift = (c1 << 32) + c2; + const uint64_t shift = 116444736000000000ULL; // (27111902 << 32) + 3577643008 union { FileTimeT as_file_time;
Windows FileTime has a different offset from UNIX time, and the code that was in Boost before would not generate the correct offset difference in certain optimizing compilers.
Upvotes: 5
Reputation: 99122
Unlike second_clock
, the microsec_clock::universal_time
documentation mentions: Returns the UTC time based on computer settings.
You should check your hardware clock settings (or where-ever microsec gets its values from).
edit:
If its not related to your computers settings it would have to be an misbehaviour in boost, which i highly doubt.
Upvotes: 1
Reputation: 4772
The 1970 date most likely comes from the way unix time is represented, as seconds from January 1 1970. I would guess that maybe it is somehow getting the system uptime in milliseconds and interpreting it as seconds since 1/1/1970. An uptime of a little over 4 hours would come up with this date.
Upvotes: 1