diff options
author | Lionel Elie Mamane <lionel@mamane.lu> | 2013-12-21 10:37:11 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2013-12-24 00:01:36 +0000 |
commit | d2928f81ed1a58eac9f90382dcfe73ea8c482ed6 (patch) | |
tree | 7670eaa491ccaaf4de5b75dcd32a7bd1f941bd2c | |
parent | a9fa817b6876814b6ebc45c2534a769e1fa84cac (diff) |
fdo#72916 correct rounding of time part of DateTime
Change-Id: I135478755f9e5a844119129b470fef8de2cd0409
Reviewed-on: https://gerrit.libreoffice.org/7163
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
-rw-r--r-- | connectivity/source/commontools/dbconversion.cxx | 16 | ||||
-rw-r--r-- | include/connectivity/dbconversion.hxx | 2 |
2 files changed, 14 insertions, 4 deletions
diff --git a/connectivity/source/commontools/dbconversion.cxx b/connectivity/source/commontools/dbconversion.cxx index 5aa5e1a69cd9..81b7744dd294 100644 --- a/connectivity/source/commontools/dbconversion.cxx +++ b/connectivity/source/commontools/dbconversion.cxx @@ -26,6 +26,7 @@ #include <com/sun/star/util/Time.hpp> #include <com/sun/star/util/DateTime.hpp> #include <rtl/ustrbuf.hxx> +#include <rtl/math.hxx> #include <unotools/datetime.hxx> #include <sstream> #include <iomanip> @@ -324,10 +325,15 @@ namespace dbtools return aRet; } // ------------------------------------------------------------------------- - utl::Time DBTypeConversion::toTime(double dVal) + utl::Time DBTypeConversion::toTime(double dVal, short nDigits) { sal_Int32 nDays = (sal_Int32)dVal; - sal_Int64 nNS = static_cast<sal_Int64>((dVal - (double)nDays) * fNanoSecondsPerDay + 0.5); + sal_Int64 nNS; + { + double fSeconds((dVal - (double)nDays) * (fNanoSecondsPerDay / nanoSecInSec)); + fSeconds = ::rtl::math::round( fSeconds, nDigits ); + nNS = fSeconds * nanoSecInSec; + } sal_Int16 nSign; if ( nNS < 0 ) @@ -370,7 +376,11 @@ namespace dbtools utl::DateTime DBTypeConversion::toDateTime(double dVal, const utl::Date& _rNullDate) { utl::Date aDate = toDate(dVal, _rNullDate); - utl::Time aTime = toTime(dVal); + // there is not enough precision in a double to have both a date + // and a time up to nanoseconds -> limit to microseconds to have + // correct rounding, that is e.g. 13:00:00.000000000 instead of + // 12:59:59.999999790 + utl::Time aTime = toTime(dVal, 6); utl::DateTime xRet; diff --git a/include/connectivity/dbconversion.hxx b/include/connectivity/dbconversion.hxx index 3fe7c0c011ef..82345b1a00ae 100644 --- a/include/connectivity/dbconversion.hxx +++ b/include/connectivity/dbconversion.hxx @@ -105,7 +105,7 @@ namespace dbtools static ::com::sun::star::util::Date toDate(double dVal, const ::com::sun::star::util::Date& _rNullDate = getStandardDate()); static ::com::sun::star::util::Date toDate(const OUString& _sSQLDate); - static ::com::sun::star::util::Time toTime(double dVal); + static ::com::sun::star::util::Time toTime(double dVal, short nDigits = 9); static ::com::sun::star::util::Time toTime(const OUString& _sSQLDate); static ::com::sun::star::util::DateTime toDateTime(double dVal, const ::com::sun::star::util::Date& _rNullDate = getStandardDate()); static ::com::sun::star::util::DateTime toDateTime(const OUString& _sSQLDate); |