gnucash stable: Multiple changes pushed

Christopher Lam clam at code.gnucash.org
Fri Feb 13 18:09:01 EST 2026


Updated	 via  https://github.com/Gnucash/gnucash/commit/2b7043b4 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/47938d1a (commit)
	from  https://github.com/Gnucash/gnucash/commit/3cee6a3b (commit)



commit 2b7043b4ba9f63faf5d3dcb74100934e1212709e
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Sat Sep 14 21:57:52 2024 +0800

    [reports] use gnc_date_interval_format

diff --git a/bindings/guile/date-utilities.scm b/bindings/guile/date-utilities.scm
index 3b0f009883..fa80c6ccdb 100644
--- a/bindings/guile/date-utilities.scm
+++ b/bindings/guile/date-utilities.scm
@@ -167,10 +167,10 @@
   (gnc-print-time64 (gnc-mktime datevec) "%B %Y"))
 
 (define (gnc:date-get-week-year-string datevec)
-  (let* ((beginweekt64 (* (gnc:time64-get-week (gnc-mktime datevec)) 7 86400))
-         (begin-string (qof-print-date (+ beginweekt64 (* 3 86400))))
-         (end-string (qof-print-date (+ beginweekt64 (* 9 86400)))))
-    (format #f (G_ "~a to ~a") begin-string end-string)))
+  (define SECS-PER-DAY 86400)
+  (let ((beginweekt64 (* (gnc:time64-get-week (gnc-mktime datevec)) 7 SECS-PER-DAY)))
+    (gnc-date-interval-format (+ beginweekt64 (* 3 SECS-PER-DAY))
+                              (+ beginweekt64 (* 9 SECS-PER-DAY)))))
 
 ;; is leap year?
 (define (gnc:leap-year? year)
diff --git a/gnucash/report/reports/example/daily-reports.scm b/gnucash/report/reports/example/daily-reports.scm
index 5219a421f7..815e994dbb 100644
--- a/gnucash/report/reports/example/daily-reports.scm
+++ b/gnucash/report/reports/example/daily-reports.scm
@@ -256,10 +256,7 @@
                    chart (list
                           report-title
                           (string-append
-                           (format #f
-                                   (G_ "~a to ~a")
-                                   (qof-print-date from-date)
-                                   (qof-print-date to-date))
+                           (gnc-date-interval-format from-date to-date)
                            (if show-total?
                                (let ((total (apply + daily-totals)))
                                  (format
diff --git a/gnucash/report/reports/standard/account-piecharts.scm b/gnucash/report/reports/standard/account-piecharts.scm
index 439c6333e3..912fb6d300 100644
--- a/gnucash/report/reports/standard/account-piecharts.scm
+++ b/gnucash/report/reports/standard/account-piecharts.scm
@@ -510,10 +510,7 @@ balance at a given time"))
                 chart (list report-title
                             (string-append
                              (if do-intervals?
-                                 (format #f
-                                         (G_ "~a to ~a")
-                                         (qof-print-date from-date)
-                                         (qof-print-date to-date))
+                                 (gnc-date-interval-format from-date to-date)
                                  (format #f
                                          (G_ "Balance at ~a")
                                          (qof-print-date to-date)))
diff --git a/gnucash/report/reports/standard/balance-forecast.scm b/gnucash/report/reports/standard/balance-forecast.scm
index 78e906fb30..ddfaedd31a 100644
--- a/gnucash/report/reports/standard/balance-forecast.scm
+++ b/gnucash/report/reports/standard/balance-forecast.scm
@@ -273,9 +273,7 @@ date point, a projected minimum balance including scheduled transactions."))
         (gnc:html-chart-set-type! chart 'line)
         ;; Set the chart titles
         (gnc:html-chart-set-title!
-         chart (list report-title
-                     (format #f (G_ "~a to ~a")
-                       (qof-print-date from-date) (qof-print-date to-date))))
+         chart (list report-title (gnc-date-interval-format from-date to-date)))
         ;; Set the chart size
         (gnc:html-chart-set-width! chart plot-width)
         (gnc:html-chart-set-height! chart plot-height)
diff --git a/gnucash/report/reports/standard/balsheet-pnl.scm b/gnucash/report/reports/standard/balsheet-pnl.scm
index de8ed13865..cc81ce6eab 100644
--- a/gnucash/report/reports/standard/balsheet-pnl.scm
+++ b/gnucash/report/reports/standard/balsheet-pnl.scm
@@ -864,8 +864,7 @@ also show overall period profit & loss."))
              (display report-title)
              (display " ")
              (if (or (not (eq? incr 'disabled)) (eq? report-type 'pnl))
-                 (format #t (G_ "~a to ~a")
-                         (qof-print-date startdate) (qof-print-date enddate))
+                 (display (gnc-date-interval-format startdate enddate))
                  (display (qof-print-date enddate))))))
 
     (if (eq? (get-option gnc:pagename-general optname-options-summary) 'always)
diff --git a/gnucash/report/reports/standard/budget.scm b/gnucash/report/reports/standard/budget.scm
index ff03c435e9..1aa44e2619 100644
--- a/gnucash/report/reports/standard/budget.scm
+++ b/gnucash/report/reports/standard/budget.scm
@@ -465,9 +465,9 @@
               ((eq? (car column-list) 'total)
                (G_ "Total"))
               ((list? (car column-list))
-               (format #f (G_ "~a to ~a")
-                       (period-to-date-string (car (car column-list)))
-                       (period-to-date-string (last (car column-list)))))
+               (gnc-date-interval-format
+                (gnc-budget-get-period-start-date budget (car (car column-list)))
+                (gnc-budget-get-period-start-date budget (last (car column-list)))))
               (else
                (period-to-date-string (car column-list)))))
 
diff --git a/gnucash/report/reports/standard/cash-flow.scm b/gnucash/report/reports/standard/cash-flow.scm
index 3ec0d0f3af..69904a0f58 100644
--- a/gnucash/report/reports/standard/cash-flow.scm
+++ b/gnucash/report/reports/standard/cash-flow.scm
@@ -180,8 +180,7 @@
      doc (string-append
           (get-option gnc:pagename-general gnc:optname-reportname)
           " - "
-          (format #f (G_ "~a to ~a")
-                  (qof-print-date from-date-t64) (qof-print-date to-date-t64))))
+          (gnc-date-interval-format from-date-t64 to-date-t64)))
 
     (if (not (null? accounts))
 
diff --git a/gnucash/report/reports/standard/cashflow-barchart.scm b/gnucash/report/reports/standard/cashflow-barchart.scm
index 2189bcfd77..a72df612d5 100644
--- a/gnucash/report/reports/standard/cashflow-barchart.scm
+++ b/gnucash/report/reports/standard/cashflow-barchart.scm
@@ -254,11 +254,7 @@
           (gnc:report-percent-done 90)
 
           (gnc:html-chart-set-title!
-           chart (list report-title
-                       (format #f
-                               (G_ "~a to ~a")
-                               (qof-print-date from-date-t64)
-                               (qof-print-date to-date-t64))))
+           chart (list report-title (gnc-date-interval-format from-date-t64 to-date-t64)))
           (gnc:html-chart-set-width! chart width)
           (gnc:html-chart-set-height! chart height)
           (gnc:html-chart-set-y-axis-label!
diff --git a/gnucash/report/reports/standard/category-barchart.scm b/gnucash/report/reports/standard/category-barchart.scm
index 4adbccf4a1..ee63e271a3 100644
--- a/gnucash/report/reports/standard/category-barchart.scm
+++ b/gnucash/report/reports/standard/category-barchart.scm
@@ -518,12 +518,8 @@ Please deselect the accounts with negative balances."))
 
             (gnc:html-chart-set-title!
              chart (list report-title
-                         (format #f
-                                 (if do-intervals?
-                                     (G_ "~a to ~a")
-                                     (G_ "Balances ~a to ~a"))
-                                 (qof-print-date from-date-t64)
-                                 (qof-print-date to-date-t64))))
+                         (format #f (if do-intervals? "~a" (G_ "Balances ~a"))
+                                 (gnc-date-interval-format from-date-t64 to-date-t64))))
 
             (gnc:html-chart-set-width! chart width)
             (gnc:html-chart-set-height! chart height)
diff --git a/gnucash/report/reports/standard/investment-lots.scm b/gnucash/report/reports/standard/investment-lots.scm
index ae23c33cd7..40a897fcd3 100644
--- a/gnucash/report/reports/standard/investment-lots.scm
+++ b/gnucash/report/reports/standard/investment-lots.scm
@@ -1960,10 +1960,9 @@
     (gnc:html-document-set-title!
       document
       (format #f
-        (G_ "~a, ~a to ~a")
+        (G_ "~a, ~a")
         (get-option gnc:pagename-general gnc:optname-reportname)
-        (qof-print-date from-date)
-        (qof-print-date to-date)))
+        (gnc-date-interval-format from-date to-date)))
 
     (cond
       ((not (null? accounts))
@@ -1986,11 +1985,7 @@
                           (list colname-unrealized-gain))
                         '()))))
             (gnc:html-chart-set-title! chart
-              (list (N_ "Account Lot Gains")
-                (format #f
-                  (G_ "~a to ~a")
-                  (qof-print-date from-date)
-                  (qof-print-date to-date))))
+              (list (N_ "Account Lot Gains") (gnc-date-interval-format from-date to-date)))
             (gnc:html-chart-set-type! chart 'bar)
             (gnc:html-chart-set-width! chart chart-width)
             (gnc:html-chart-set-height! chart chart-height)
diff --git a/gnucash/report/reports/standard/net-charts.scm b/gnucash/report/reports/standard/net-charts.scm
index b5e1e5df99..d3695c750a 100644
--- a/gnucash/report/reports/standard/net-charts.scm
+++ b/gnucash/report/reports/standard/net-charts.scm
@@ -312,10 +312,7 @@
        (gnc:html-chart-set-width! chart width)
        (gnc:html-chart-set-height! chart height)
        (gnc:html-chart-set-title!
-        chart (list report-title
-                    (format #f (G_ "~a to ~a")
-                            (qof-print-date from-date-t64)
-                            (qof-print-date to-date-t64))))
+        chart (list report-title (gnc-date-interval-format from-date-t64 to-date-t64)))
        (gnc:html-chart-set-y-axis-label!
         chart (gnc-commodity-get-mnemonic report-currency))
        (gnc:html-chart-set-grid?! chart y-grid)
diff --git a/gnucash/report/reports/standard/new-owner-report.scm b/gnucash/report/reports/standard/new-owner-report.scm
index 4fdf13b1d6..420ea2bee7 100644
--- a/gnucash/report/reports/standard/new-owner-report.scm
+++ b/gnucash/report/reports/standard/new-owner-report.scm
@@ -1147,8 +1147,8 @@ and do not match the transaction."))))))))
 
           (gnc:html-document-add-object!
            document (gnc:make-html-text
-                     (string-append (G_ "Date Range") ": " (qof-print-date start-date)
-                                    " - " (qof-print-date end-date))))
+                     (string-append (G_ "Date Range") ": "
+                                    (gnc-date-interval-format start-date end-date))))
 
           (make-break! document)
 
diff --git a/gnucash/report/reports/standard/price-scatter.scm b/gnucash/report/reports/standard/price-scatter.scm
index 6d83e16686..370004bb91 100644
--- a/gnucash/report/reports/standard/price-scatter.scm
+++ b/gnucash/report/reports/standard/price-scatter.scm
@@ -182,10 +182,7 @@
            (string-append
             (gnc-commodity-get-mnemonic base-commodity)
             " - "
-            (format #f
-                    (G_ "~a to ~a")
-                    (qof-print-date from-date)
-                    (qof-print-date to-date)))))
+            (gnc-date-interval-format from-date to-date))))
     (gnc:html-chart-set-width! chart width)
     (gnc:html-chart-set-height! chart height)
     (gnc:html-chart-set! chart
diff --git a/gnucash/report/reports/standard/txn-columns.scm b/gnucash/report/reports/standard/txn-columns.scm
index 16f9cafd9d..a44fa75d68 100644
--- a/gnucash/report/reports/standard/txn-columns.scm
+++ b/gnucash/report/reports/standard/txn-columns.scm
@@ -183,7 +183,7 @@ Select a different subset of transactions, or increase the limit in the options.
                     1 3 "total-label-cell"
                     (gnc:make-html-text
                      (G_ "Total For ")
-                     (format #f "~a to ~a" (qof-print-date from-date) (qof-print-date to-date))))
+                     (gnc-date-interval-format from-date to-date)))
                    (map (lambda (acc total)
                           (gnc:make-html-table-cell/markup
                            "total-number-cell"
diff --git a/gnucash/report/trep-engine.scm b/gnucash/report/trep-engine.scm
index d85c592c51..483bca9c2b 100644
--- a/gnucash/report/trep-engine.scm
+++ b/gnucash/report/trep-engine.scm
@@ -2646,11 +2646,7 @@ be excluded from periodic reporting.")
            document
            (gnc:make-html-text
             (gnc:html-markup-h3
-             (format #f
-                     ;; Translators: Both ~a's are dates
-                     (G_ "From ~a to ~a")
-                     (qof-print-date begindate)
-                     (qof-print-date enddate)))))
+             (gnc-date-interval-format begindate enddate))))
 
           (when (eq? infobox-display 'always)
             (gnc:html-document-add-object!

commit 47938d1a2cc7f3abb74b08c3c14c08c2786f58a3
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Wed Feb 11 18:43:21 2026 +0800

    [gnc-date.cpp] gnc_date_interval_format localisable with ICU

diff --git a/bindings/engine.i b/bindings/engine.i
index 5b1d5b587c..8e9bce0d6e 100644
--- a/bindings/engine.i
+++ b/bindings/engine.i
@@ -116,6 +116,9 @@ engine-common.i */
 %newobject xaccTransGetPaymentAcctSplitList;
 %newobject xaccAccountGetSplitList;
 
+%newobject gnc_date_interval_format;
+gchar* gnc_date_interval_format (time64 from_date, time64 to_date);
+
 %include "engine-common.i"
 
 #if defined(SWIGGUILE)
diff --git a/libgnucash/engine/gnc-date.cpp b/libgnucash/engine/gnc-date.cpp
index 0f46cfcf87..cd5e64ba3f 100644
--- a/libgnucash/engine/gnc-date.cpp
+++ b/libgnucash/engine/gnc-date.cpp
@@ -45,6 +45,8 @@
 
 #include <cinttypes>
 #include <unicode/calendar.h>
+#include "unicode/dtitvfmt.h"
+#include "unicode/smpdtfmt.h"
 
 #include "gnc-date.h"
 #include "gnc-date-p.h"
@@ -613,6 +615,71 @@ qof_print_date (time64 t)
     return g_strdup (buff);
 }
 
+static icu::DateIntervalFormat*
+get_icu_date_interval_formatter ()
+{
+    static std::unique_ptr<icu::DateIntervalFormat> difmt;
+    if (!difmt)
+    {
+        auto locale = icu::Locale::getDefault();
+        UErrorCode status = U_ZERO_ERROR;
+        difmt.reset(icu::DateIntervalFormat::createInstance(UDAT_YEAR_NUM_MONTH_DAY, locale, status));
+        if (U_FAILURE(status))
+        {
+            PWARN ("icu::DateIntervalFormat::createInstance error %d", status);
+            return nullptr;
+        }
+    }
+    return difmt.get();
+}
+
+static gchar*
+icu_date_interval_format (time64 from_date, time64 to_date)
+{
+    auto difmt = get_icu_date_interval_formatter();
+    if (!difmt)
+        return nullptr;
+
+    if (from_date > to_date)
+        std::swap(from_date, to_date);
+
+    icu::DateInterval interval (from_date * 1000.0, to_date * 1000.0);
+    icu::UnicodeString result;
+    icu::FieldPosition fp;
+    UErrorCode status = U_ZERO_ERROR;
+    difmt->format (&interval, result, fp, status);
+    if (U_FAILURE(status))
+    {
+        PWARN("Error formatting interval: %d", status);
+        return nullptr;
+    }
+
+    std::string interval_string;
+    result.toUTF8String(interval_string);
+
+    return g_strdup (interval_string.c_str());
+}
+
+gchar*
+gnc_date_interval_format (time64 from_date, time64 to_date)
+{
+    gchar* rv = nullptr;
+
+    if (qof_date_format_get() == QOF_DATE_FORMAT_LOCALE)
+        rv = icu_date_interval_format (from_date, to_date);
+
+    // not using locale, or icu failure
+    if (!rv)
+    {
+        gchar from_buff[MAX_DATE_LENGTH+1], to_buff[MAX_DATE_LENGTH+1];
+        qof_print_date_buff (from_buff, MAX_DATE_LENGTH, from_date);
+        qof_print_date_buff (to_buff, MAX_DATE_LENGTH, to_date);
+        rv = g_strdup_printf (gettext("%s to %s"), from_buff, to_buff);
+    }
+
+    return rv;
+}
+
 /* ============================================================== */
 
 /* return the greatest integer <= a/b; works for b > 0 and positive or
diff --git a/libgnucash/engine/gnc-date.h b/libgnucash/engine/gnc-date.h
index d44bc2b289..3b4a50825e 100644
--- a/libgnucash/engine/gnc-date.h
+++ b/libgnucash/engine/gnc-date.h
@@ -482,6 +482,8 @@ size_t qof_print_gdate(char *buf, size_t bufflen, const GDate *gd);
 char * qof_print_date (time64 secs);
 
 
+gchar* gnc_date_interval_format (time64 from_date, time64 to_date);
+
 /* ------------------------------------------------------------------ */
 /* time printing utilities */
 



Summary of changes:
 bindings/engine.i                                  |  3 +
 bindings/guile/date-utilities.scm                  |  8 +--
 gnucash/report/reports/example/daily-reports.scm   |  5 +-
 .../report/reports/standard/account-piecharts.scm  |  5 +-
 .../report/reports/standard/balance-forecast.scm   |  4 +-
 gnucash/report/reports/standard/balsheet-pnl.scm   |  3 +-
 gnucash/report/reports/standard/budget.scm         |  6 +-
 gnucash/report/reports/standard/cash-flow.scm      |  3 +-
 .../report/reports/standard/cashflow-barchart.scm  |  6 +-
 .../report/reports/standard/category-barchart.scm  |  8 +--
 .../report/reports/standard/investment-lots.scm    | 11 +---
 gnucash/report/reports/standard/net-charts.scm     |  5 +-
 .../report/reports/standard/new-owner-report.scm   |  4 +-
 gnucash/report/reports/standard/price-scatter.scm  |  5 +-
 gnucash/report/reports/standard/txn-columns.scm    |  2 +-
 gnucash/report/trep-engine.scm                     |  6 +-
 libgnucash/engine/gnc-date.cpp                     | 67 ++++++++++++++++++++++
 libgnucash/engine/gnc-date.h                       |  2 +
 18 files changed, 96 insertions(+), 57 deletions(-)



More information about the gnucash-changes mailing list