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 <erack@redhat.com>
Context
- [PATCH libreoffice-4-0-2] resolved fdo#44286 some historical dates were decremented · Eike Rathke (via Code Review)
Privacy Policy |
Impressum (Legal Info) |
Copyright information: Unless otherwise specified, all text and images
on this website are licensed under the
Creative Commons Attribution-Share Alike 3.0 License.
This does not include the source code of LibreOffice, which is
licensed under the Mozilla Public License (
MPLv2).
"LibreOffice" and "The Document Foundation" are
registered trademarks of their corresponding registered owners or are
in actual use as trademarks in one or more countries. Their respective
logos and icons are also subject to international copyright laws. Use
thereof is explained in our
trademark policy.