gnucash maint: Fix fencepost error in calculating the week_num for POSIX timezone rules.

John Ralls jralls at code.gnucash.org
Mon Mar 15 20:09:29 EDT 2021


Updated	 via  https://github.com/Gnucash/gnucash/commit/a11065b8 (commit)
	from  https://github.com/Gnucash/gnucash/commit/b51d227a (commit)



commit a11065b823f14fbc32bb1fc132304e36f486c8b0
Author: John Ralls <jralls at ceridwen.us>
Date:   Mon Mar 15 17:04:39 2021 -0700

    Fix fencepost error in calculating the week_num for POSIX timezone rules.
    
    Fixes CI failure caused by US starting DST in 2021, a year in which
    March began on a Monday.

diff --git a/bindings/python/time64.i b/bindings/python/time64.i
index cf3408a98..09bb4ee41 100644
--- a/bindings/python/time64.i
+++ b/bindings/python/time64.i
@@ -109,6 +109,8 @@
         PyDateTime_IMPORT;
         struct tm t;
         gnc_localtime_r(&$1, &t);
+        printf("\nConverting %d hours and %d minutes in zone %ld %s to python local time\n",
+               t.tm_hour, t.tm_min, t.tm_gmtoff/3600, t.tm_isdst ? "DST" : "STD");
         $result = PyDateTime_FromDateAndTime(t.tm_year + 1900, t.tm_mon + 1,
                                              t.tm_mday, t.tm_hour, t.tm_min,
                                              t.tm_sec, 0);
diff --git a/libgnucash/engine/gnc-timezone.cpp b/libgnucash/engine/gnc-timezone.cpp
index 33f0609ec..dc735a402 100644
--- a/libgnucash/engine/gnc-timezone.cpp
+++ b/libgnucash/engine/gnc-timezone.cpp
@@ -500,7 +500,7 @@ namespace DSTRule
 
     Transition::Transition(gregorian_date date) :
 	month(date.month()), dow(date.day_of_week()),
-	week(static_cast<week_num>((7 + date.day() - date.day_of_week()) / 7))
+	week(static_cast<week_num>((6 + date.day() - date.day_of_week()) / 7))
     {}
 
     bool
diff --git a/libgnucash/engine/test/gtest-gnc-datetime.cpp b/libgnucash/engine/test/gtest-gnc-datetime.cpp
index 446f810e8..b713aa2d6 100644
--- a/libgnucash/engine/test/gtest-gnc-datetime.cpp
+++ b/libgnucash/engine/test/gtest-gnc-datetime.cpp
@@ -518,15 +518,34 @@ TEST(gnc_datetime_functions, test_date)
     EXPECT_EQ(ymd.day - (12 + atime.offset() / 3600) / 24, 13);
 }
 /* This test works only in the America/LosAngeles time zone and
- * there's no way at present to make it more flexible.
-TEST(gnc_datetime_functions, test_timezone_offset)
+ * there's no straightforward wat to make it more flexible. It ensures
+ * that DST in that timezone transitions correctly for each day of the
+ * week in which March begines.
+
+ TEST(gnc_datetime_functions, test_timezone_offset)
 {
+    struct Timepair
+    {
+        time64 before;
+        time64 after;
+    };
+    std::array<Timepair, 7> years{
+        Timepair{1615633140, 1615719540}, //2021, Monday
+        Timepair{1457780340, 1457866740}, //2016, Tuesday
+        Timepair{1489229940, 1489316340}, //2017, Wednesday
+        Timepair{1520679540, 1520765940}, //2018, Thursday
+        Timepair{1552129140, 1552215540}, //2019, Friday
+        Timepair{1741431540, 1741517940}, //2025, Saturday
+        Timepair{1583578740, 1583665140}  //2020, Sunday
+    };
+    for (auto year : years)
+    {
+        GncDateTime before{year.before};
+        GncDateTime after{year.after};
+//        std::cerr << before.format_iso8601() << std::endl;
+        EXPECT_EQ(-28800, before.offset());
+        EXPECT_EQ(-25200, after.offset());
+    }
 
-    GncDateTime gncdt1(1488797940); //6 Mar 2017
-    EXPECT_EQ(-28800, gncdt1.offset());
-    GncDateTime gncdt2(1489661940);  //16 Mar 2017 10:59 Z
-    EXPECT_EQ(-25200, gncdt2.offset());
-    GncDateTime gncdt3(1490525940);  //26 Mar 2017
-    EXPECT_EQ(-25200, gncdt3.offset());
 }
 */



Summary of changes:
 bindings/python/time64.i                      |  2 ++
 libgnucash/engine/gnc-timezone.cpp            |  2 +-
 libgnucash/engine/test/gtest-gnc-datetime.cpp | 35 +++++++++++++++++++++------
 3 files changed, 30 insertions(+), 9 deletions(-)



More information about the gnucash-changes mailing list