Date: prev next · Thread: first prev next last
2013 Archives by date, by thread · List index


Hi,

I have submitted a patch for review:

    https://gerrit.libreoffice.org/3036

To pull it, you can do:

    git pull ssh://gerrit.libreoffice.org:29418/core refs/changes/36/3036/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/3036
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
Gerrit-Owner: Eike Rathke <erack@redhat.com>


Context


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.