summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLionel Elie Mamane <lionel@mamane.lu>2013-12-21 10:37:11 +0100
committerLionel Elie Mamane <lionel@mamane.lu>2013-12-21 16:49:50 +0100
commita5ce8c77a0b2dca2ab5a3564feed1cd3b8104eaa (patch)
treeb36a66f43a83c7a422b6e7f645d9d4e9ea00fcb1
parentc3fe7450e39187c8574e57ebfb5d014ce263e053 (diff)
fdo#72916 correct rounding of time part of DateTime
Change-Id: I135478755f9e5a844119129b470fef8de2cd0409
-rw-r--r--connectivity/source/commontools/dbconversion.cxx16
-rw-r--r--include/connectivity/dbconversion.hxx2
2 files changed, 14 insertions, 4 deletions
diff --git a/connectivity/source/commontools/dbconversion.cxx b/connectivity/source/commontools/dbconversion.cxx
index b15dc92ca898..d6e48315806b 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>
@@ -322,10 +323,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 )
@@ -368,7 +374,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);