Subject: Re: [Boost-bugs] [Boost C++ Libraries] #9584: date_time::difference produces incorrect values
From: Boost C++ Libraries (noreply_at_[hidden])
Date: 2014-01-20 20:03:28
#9584: date_time::difference produces incorrect values
---------------------------------------------------+---------------------
Reporter: Alexey Spiridonov <bstbg.20.lesha@â¦> | Owner: artyom
Type: Bugs | Status: new
Milestone: To Be Determined | Component: locale
Version: Boost 1.54.0 | Severity: Problem
Resolution: | Keywords:
---------------------------------------------------+---------------------
Comment (by Alexey Spiridonov <bstbg.20.lesha@â¦>):
What does my *original* code print for you?
a) I'm clearly not intending to use the current time, since I'm
overwriting all of YMDHMS with the values from a fixed timestamp. The
current time should have no effect on this code.
b) How do you want me to be setting YMDHMS? The documentation does not
suggest a better way to set all of YMDHMS together, and in any case, why
is this incorrect? How can the results be different? If they can be, such
an API is extremely unsafe to use (and the documentation again provides no
warning).
c) I found no method that reveals the current back-end name. Can you
suggest one? This is Ubuntu 13.10 with a full install of Boost, and ICU is
installed also, so I assume that it's using ICU.
d) The off-by-one-second error I originally reported is not so good (it
might be due to rounding errors in the way I construct local_dt above),
and I'd encourage you to actually try my original code to see if you can
reproduce it. However, this seems even worse:
{{{#!c++
#include <boost/locale.hpp>
#include <iostream>
int main(int argc, char **argv) {
if (argc < 4) {
return 1;
}
using namespace std;
using namespace boost::locale;
locale loc = generator{}("");
auto cal = (strlen(argv[3]) == 0) ? calendar(loc) : calendar(loc,
argv[3]);
date_time a((double)atoi(argv[1]), cal);
date_time b((double)atoi(argv[2]), cal);
cout << a << " - " << b << " = " << a.difference(b, period::second()) <<
endl
<< b << " - " << a << " = " << b.difference(a, period::second()) <<
endl;
return 0;
}
}}}
Neither of its outputs is even remotely correct. If the library cannot
handle a 40-year difference, it should probably throw rather than make up
numbers...
{{{
g++ -std=c++11 bug.cpp -o bug -lboost_locale; ./bug 0 1390247464 ''
0 - 1.39025e+09 = 0
1.39025e+09 - 0 = 536870912
}}}
-- Ticket URL: <https://svn.boost.org/trac/boost/ticket/9584#comment:4> Boost C++ Libraries <http://www.boost.org/> Boost provides free peer-reviewed portable C++ source libraries.
This archive was generated by hypermail 2.1.7 : 2017-02-16 18:50:15 UTC