Bug in boost 1.32: date_time/microsec_time_clock.hpp

It is possible, that the following line boost::posix_time::ptime now = boost::posix_time::microsec_clock::local_time(); which invokes template<class time_type> class microsec_clock { static time_type local_time() { timeval tv; gettimeofday(&tv, 0); //gettimeofday does not support TZ adjust on Linux. return create_time(&tv); } static time_type create_time(timeval* tv) { time_t t = tv->tv_sec; boost::uint32_t fs = tv->tv_usec; ::std::time(&t); tm* curr = localtime(&t); .... returns a time with 1s off its correct value. The reason for this bug is the line with ::std::time(&t); that overwrites the second value just a few µs after the call to gettimofday. This new second value is used together with the fs value from gettimeofday. Example: tv from gettimofday: 12345s/999998 µs t from std::time: 12346s resulting time: 12346s/999998 µs !!!! Question: Why this call to std::time? I commented it out and it worked. Regards Martin

... snipped ...
returns a time with 1s off its correct value.
The reason for this bug is the line with ::std::time(&t);
that overwrites the second value just a few µs after the call to gettimofday. This new second value is used together with the fs value from gettimeofday.
Example: tv from gettimofday: 12345s/999998 µs t from std::time: 12346s resulting time: 12346s/999998 µs !!!!
Question: Why this call to std::time? I commented it out and it worked.
Regards Martin
Hello Martin, This bug has been fixed in cvs. We now use a single call to gettimeofday. That result is broken down into a struct tm using either std::localtime or std::gmtime. We also set the fractional seconds in the time_type with that same timeval result. Bart
participants (2)
-
Bart
-
martin troxler