Opened 8 years ago

Last modified 5 years ago

#10285 assigned Bugs

local_time is not monotonic

Reported by: Gaetano Mendola <mendola@…> Owned by: James E. King, III
Milestone: To Be Determined Component: date_time
Version: Boost 1.55.0 Severity: Problem
Keywords: Cc: antomicx@…

Description

The following snippet seems to generate non monotonic local_date.

I'm using boost 1.55 on linux.

#include <boost/date_time/local_time/local_time.hpp> #include <boost/ptr_container/ptr_vector.hpp>

int main() {

const boost::local_time::time_zone_ptr theTimeZone(

new boost::local_time::posix_time_zone(

"CET+01CEST+01,M3.5.0/02:00,M10.5.0/03:00")

);

boost::local_time::local_date_time myOldValue(

boost::local_time::local_microsec_clock::local_time(theTimeZone));

for (size_t i = 0; ; ++i) {

const boost::local_time::local_date_time myLocalTime =

boost::local_time::local_microsec_clock::local_time(theTimeZone);

if (myLocalTime < myOldValue) {

std::cout << myOldValue << std::endl; std::cout << myLocalTime << std::endl; std::cout << boost::local_time::local_microsec_clock::local_time(theTimeZone) << std::endl; std::cout << "====================" << std::endl;

}

myOldValue = myLocalTime;

}

}

As you can see the program is not supposed to print anything ever, however this is what I'm getting:

2014-Jul-31 00:24:56.005625 CEST 2014-Jul-31 00:24:55.005631 CEST <== 1 second back 2014-Jul-31 00:24:56.005946 CEST ==================== 2014-Jul-31 00:24:58.005625 CEST 2014-Jul-31 00:24:57.005629 CEST <== 1 second back 2014-Jul-31 00:24:58.005824 CEST ==================== 2014-Jul-31 00:25:02.005624 CEST 2014-Jul-31 00:25:01.005628 CEST <== 1 second back 2014-Jul-31 00:25:02.005838 CEST ==================== 2014-Jul-31 00:25:04.005625 CEST 2014-Jul-31 00:25:03.005630 CEST <== 1 second back 2014-Jul-31 00:25:04.005826 CEST ==================== 2014-Jul-31 00:25:06.005624 CEST 2014-Jul-31 00:25:05.005633 CEST <== 1 second back 2014-Jul-31 00:25:06.005853 CEST ==================== 2014-Jul-31 00:25:07.005625 CEST 2014-Jul-31 00:25:06.005631 CEST <== 1 second back 2014-Jul-31 00:25:07.005846 CEST ==================== 2014-Jul-31 00:25:12.005625 CEST 2014-Jul-31 00:25:11.005631 CEST <== 1 second back 2014-Jul-31 00:25:12.005822 CEST ====================

as you can see when the local_date is near 0.005631 second fraction it goes back of one second and then forward again on the following call.

Change History (1)

comment:1 by James E. King, III, 5 years ago

Owner: changed from az_sw_dude to James E. King, III
Status: newassigned

I can confirm this behavior in boost 1.66.0 with gcc-7.2 on Ubuntu Artful. It looks like a rounding error, as the difference between old, new, and current is approx. 1 second:

jking@ubuntu:~/boost/libs/date_time/test$ ../../../bin.v2/libs/date_time/test/foo.test/gcc-gnu-7/debug/threadapi-pthread/foo
2018-Jan-06 16:40:15.004246000 CET
2018-Jan-06 16:40:14.004293000 CET
2018-Jan-06 16:40:15.004732000 CET
====================
2018-Jan-06 16:40:16.003909000 CET
2018-Jan-06 16:40:15.003974000 CET
2018-Jan-06 16:40:16.004328000 CET
====================
2018-Jan-06 16:40:24.004164000 CET
2018-Jan-06 16:40:23.004217000 CET
2018-Jan-06 16:40:24.004610000 CET
====================
2018-Jan-06 16:40:25.003827000 CET
2018-Jan-06 16:40:24.003878000 CET
2018-Jan-06 16:40:25.004240000 CET
====================
Note: See TracTickets for help on using tickets.