summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2013-03-25 21:21:41 +0100
committerLuboš Luňák <l.lunak@suse.cz>2013-03-28 16:23:27 +0000
commit947a54caa1bf830b986775c18d77a98482b12db4 (patch)
tree33f425e8c26e24d579de50c8e4a3d17458f866c5
parentfdo#58071: .dot files sometimes rejected by writer (diff)
downloadcore-947a54caa1bf830b986775c18d77a98482b12db4.tar.gz
core-947a54caa1bf830b986775c18d77a98482b12db4.zip
resolved fdo#44286 some historical dates were decremented
Depending on historical timezone data with odd offsets some historical dates were decremented by one day due to a rounding error. Change-Id: I3216b1c043fe5ab9035a558031f1a58efa0c3b3d (cherry picked from commit 6013fe19a40dd16ce435a2428f7405b51930689e) Reviewed-on: https://gerrit.libreoffice.org/3040 Reviewed-by: Petr Mladek <pmladek@suse.cz> Tested-by: Petr Mladek <pmladek@suse.cz> Reviewed-by: Fridrich Strba <fridrich@documentfoundation.org> Reviewed-by: Luboš Luňák <l.lunak@suse.cz> Tested-by: Luboš Luňák <l.lunak@suse.cz>
-rw-r--r--i18npool/source/calendar/calendar_gregorian.cxx19
1 files changed, 18 insertions, 1 deletions
diff --git a/i18npool/source/calendar/calendar_gregorian.cxx b/i18npool/source/calendar/calendar_gregorian.cxx
index e76c4312b913..fc7dcf646153 100644
--- a/i18npool/source/calendar/calendar_gregorian.cxx
+++ b/i18npool/source/calendar/calendar_gregorian.cxx
@@ -35,6 +35,7 @@
#include <com/sun/star/i18n/reservedWords.hpp>
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#include <comphelper/processfactory.hxx>
+#include <rtl/math.hxx>
#include <stdio.h>
#include <string.h>
@@ -292,8 +293,19 @@ Calendar_gregorian::getUniqueID() throw(RuntimeException)
void SAL_CALL
Calendar_gregorian::setDateTime( double timeInDays ) throw(RuntimeException)
{
+ // ICU handles dates in milliseconds as double values and uses floor()
+ // to obtain integer values, which may yield a date decremented by one
+ // for odd (historical) timezone values where the computed value due to
+ // rounding errors has a fractional part in milliseconds. Ensure we
+ // pass a value without fraction here. If not, that may lead to
+ // fdo#44286 or fdo#52619 and the like, e.g. when passing
+ // -2136315212000.000244 instead of -2136315212000.000000
+ double fM = timeInDays * U_MILLIS_PER_DAY;
+ double fR = rtl::math::round( fM );
+ SAL_INFO_IF( fM != fR, "i18npool",
+ "Calendar_gregorian::setDateTime: " << std::fixed << fM << " rounded to " << fR);
UErrorCode status;
- body->setTime(timeInDays * U_MILLIS_PER_DAY, status = U_ZERO_ERROR);
+ body->setTime( fR, status = U_ZERO_ERROR);
if ( !U_SUCCESS(status) ) throw ERROR;
getValue();
}
@@ -688,6 +700,11 @@ void Calendar_gregorian::setValue() throw(RuntimeException)
DUMP_ICU_CAL_MSG(("%s\n","setValue() after Zone/DST glitch 2nd resubmit"));
DUMP_I18N_CAL_MSG(("%s\n","setValue() after Zone/DST glitch 2nd resubmit"));
}
+ SAL_INFO( "i18npool", "Calendar_gregorian::setValue:" <<
+ " nZone0 " << nZone0 << ", nDST0 " << nDST0 <<
+ ", nZone1 " << nZone1 << ", nDST1 " << nDST1 <<
+ ", nZone2 " << nZone2 << ", nDST2 " << nDST2 <<
+ ", nZone3 " << nZone3 << ", nDST3 " << nDST3);
}
}
#if erDUMP_ICU_CALENDAR || erDUMP_I18N_CALENDAR