Hi, I have submitted a patch for review:
https://gerrit.libreoffice.org/3037 To pull it, you can do: git pull ssh://gerrit.libreoffice.org:29418/core refs/changes/37/3037/1 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) --- M i18npool/source/calendar/calendar_gregorian.cxx 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/i18npool/source/calendar/calendar_gregorian.cxx b/i18npool/source/calendar/calendar_gregorian.cxx index a2a5324..e01abaf 100644 --- a/i18npool/source/calendar/calendar_gregorian.cxx +++ b/i18npool/source/calendar/calendar_gregorian.cxx @@ -26,6 +26,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> @@ -283,8 +284,19 @@ 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(); } @@ -679,6 +691,11 @@ 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 -- To view, visit https://gerrit.libreoffice.org/3037 To unsubscribe, visit https://gerrit.libreoffice.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I3216b1c043fe5ab9035a558031f1a58efa0c3b3d Gerrit-PatchSet: 1 Gerrit-Project: core Gerrit-Branch: libreoffice-4-0-2 Gerrit-Owner: Eike Rathke <er...@redhat.com> _______________________________________________ LibreOffice mailing list LibreOffice@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice