gnucash maint: Multiple changes pushed

John Ralls jralls at code.gnucash.org
Thu Aug 16 14:02:23 EDT 2018


Updated	 via  https://github.com/Gnucash/gnucash/commit/88597d0b (commit)
	 via  https://github.com/Gnucash/gnucash/commit/c08dee67 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/e9098d08 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/35fabe26 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/20f6e4e6 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/755773ac (commit)
	 via  https://github.com/Gnucash/gnucash/commit/b32a8a93 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/62b17ca5 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/358cd979 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/fee589b2 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/92a8cf33 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/c8b372e3 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/b60aef9d (commit)
	 via  https://github.com/Gnucash/gnucash/commit/6f89bd62 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/e7961203 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/dd873240 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/6846a686 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/e3dce951 (commit)
	from  https://github.com/Gnucash/gnucash/commit/44c3dc83 (commit)



commit 88597d0b647076423208ae3e9670ca7415b4ea1c
Merge: 44c3dc8 c08dee6
Author: John Ralls <jralls at ceridwen.us>
Date:   Thu Aug 16 10:54:51 2018 -0700

    Merge branch 'remove-timespec' into maint


commit c08dee67bae803e4855f6c0a58ad50270a0e7541
Author: John Ralls <jralls at ceridwen.us>
Date:   Mon Aug 13 11:51:06 2018 -0700

    Preserve timespec-using functions in Guile bindings.
    
    There's an example of use in text-extras.scm, function
    gnc-pricedb-create.
    
    Unfortunately the deprecation messages issue no warnings.

diff --git a/libgnucash/engine/CMakeLists.txt b/libgnucash/engine/CMakeLists.txt
index 72f9417..dd9c8fb 100644
--- a/libgnucash/engine/CMakeLists.txt
+++ b/libgnucash/engine/CMakeLists.txt
@@ -10,6 +10,7 @@ set(engine_noinst_HEADERS
   SX-book.h
   SX-ttinfo.h
   TransactionP.h
+  engine-deprecated.h
   gnc-backend-prov.hpp
   gnc-date-p.h
   gnc-hooks-scm.h
@@ -149,6 +150,7 @@ set (engine_SOURCES
   Transaction.c
   cap-gains.c
   cashobjects.c
+  engine-deprecated.c
   gnc-aqbanking-templates.cpp
   gnc-budget.c
   gnc-commodity.c
@@ -304,6 +306,7 @@ set(engine_EXTRA_DIST
         design.txt
         engine.i
         engine-common.i
+        engine-deprecated.i
         extensions.txt
         iso-4217-currencies.xml
         iso-currencies-to-c.xsl
diff --git a/libgnucash/engine/engine-deprecated.c b/libgnucash/engine/engine-deprecated.c
new file mode 100644
index 0000000..eba2641
--- /dev/null
+++ b/libgnucash/engine/engine-deprecated.c
@@ -0,0 +1,208 @@
+/********************************************************************\
+ * engine-deprecated.i: Guile wrappers for deleted C functions.     *
+ * Copyright 2018 John Ralls <jralls at ceridwen.us>                   *
+ *                                                                  *
+ * This program is free software; you can redistribute it and/or    *
+ * modify it under the terms of the GNU General Public License as   *
+ * published by the Free Software Foundation; either version 2 of   *
+ * the License, or (at your option) any later version.              *
+ *                                                                  *
+ * This program is distributed in the hope that it will be useful,  *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of   *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *
+ * GNU General Public License for more details.                     *
+ *                                                                  *
+ * You should have received a copy of the GNU General Public License*
+ * along with this program; if not, contact:                        *
+ *                                                                  *
+ * Free Software Foundation           Voice:  +1-617-542-5942       *
+ * 51 Franklin Street, Fifth Floor    Fax:    +1-617-542-2652       *
+ * Boston, MA  02110-1301,  USA       gnu at gnu.org                   *
+ *                                                                  *
+\********************************************************************/
+
+/* The functions in this file have been removed from the C library and are
+ * provided here for backward compatibility. They will be removed completely
+ * from the next major release of GnuCash.
+ */
+
+#include "engine-deprecated.h"
+
+#include <libguile/deprecation.h>
+
+void xaccSplitSetDateReconciledTS(Split* s, Timespec *ts)
+{
+    scm_c_issue_deprecation_warning("xaccSplitSetDateReconciled is deprecated. Use xaccSplitSetDateReconciledSecs instead.");
+    xaccSplitSetDateReconciledSecs (s, ts->tv_sec);
+}
+
+void xaccSplitGetDateReconciledTS(Split* s, Timespec *ts)
+{
+    scm_c_issue_deprecation_warning("xaccSplitGetDateReconciled is deprecated. Use xaccSplitGetDateReconciledSecs instead.");
+    ts->tv_sec = xaccSplitGetDateReconciled (s);
+    ts->tv_nsec = 0;
+}
+
+Timespec xaccSplitRetDateReconciledTS(Split* s)
+{
+    Timespec ts = {0, 0};
+    scm_c_issue_deprecation_warning("xaccSplitSetDateReconciled is deprecated. Use xaccSplitSetDateReconciledSecs instead.");
+    ts.tv_sec = xaccSplitGetDateReconciled (s);
+    return ts;
+}
+
+Timespec
+gnc_transaction_get_date_posted(const Transaction *t)
+{
+    Timespec ts = {0, 0};
+    scm_c_issue_deprecation_warning("gnc_transaction_get_date_posted is deprecated. Use xaccTransRetDatePosted instead.");
+    ts.tv_sec = xaccTransRetDatePosted(t);
+    return ts;
+}
+
+Timespec
+gnc_transaction_get_date_entered(const Transaction *t)
+{
+    Timespec ts = {0, 0};
+    scm_c_issue_deprecation_warning("gnc_transaction_get_date_entered is deprecated. Use xaccTransGetDateEntered instead.");
+    ts.tv_sec = xaccTransRetDateEntered(t);
+    return ts;
+}
+
+Timespec
+gnc_split_get_date_reconciled(const Split *s)
+{
+    Timespec ts = {0, 0};
+    scm_c_issue_deprecation_warning("gnc_split_get_date_reconciled is deprecated. Use xaccSplitGetDateReconciled instead.");
+    ts.tv_sec = xaccSplitGetDateReconciled(s);
+    return ts;
+}
+
+void
+gnc_transaction_set_date(Transaction *t, Timespec ts)
+{
+    scm_c_issue_deprecation_warning("gnc_transaction_set_date is deprecated. Use xaccTransSetDatePostedSecs instead.");
+    xaccTransSetDatePostedSecs(t, ts.tv_sec);
+}
+
+Timespec
+gncTaxTableLastModified (const GncTaxTable *table)
+{
+    Timespec t = {0, 0};
+    scm_c_issue_deprecation_warning("gncTaxTableLastModified is deprecated. Use gncTaxTableLastModifiedSecs instead.");
+    t.tv_sec = gncTaxTableLastModifiedSecs (table);
+    return t;
+}
+
+void
+gncOwnerApplyPayment (const GncOwner *owner, Transaction **preset_txn,
+                           GList *lots, Account *posted_acc, Account *xfer_acc,
+                           gnc_numeric amount, gnc_numeric exch, Timespec date,
+                           const char *memo, const char *num,
+                           gboolean auto_pay)
+{
+    scm_c_issue_deprecation_warning("gncOwnerApplyPayment is deprecated. Use gncOwnerApplyPaymentSecs instead.");
+    gncOwnerApplyPaymentSecs (owner, preset_txn, lots, posted_acc,
+                              xfer_acc, amount, exch, date.tv_sec,
+                              memo, num, auto_pay);
+}
+
+GNCLot*
+gncOwnerCreatePaymentLot (const GncOwner *owner,
+                                  Transaction **preset_txn, Account *posted_acc,
+                                  Account *xfer_acc, gnc_numeric amount,
+                                  gnc_numeric exch, Timespec date,
+                                  const char *memo, const char *num)
+{
+    GNCLot* lot = NULL;
+    scm_c_issue_deprecation_warning("gncOwnerCreatePaymentLot is deprecated. Use gncOwnerCreatePaymentLotSecs instead.");
+    lot = gncOwnerCreatePaymentLotSecs (owner, preset_txn, posted_acc,
+                                        xfer_acc, amount, exch, date.tv_sec,
+                                        memo, num);
+    return lot;
+}
+
+void
+gnc_price_set_time (GNCPrice *p, Timespec t)
+{
+    scm_c_issue_deprecation_warning("gnc_price_set_time is deprecated. Use gnc_price_set_time64 instead.");
+    gnc_price_set_time64(p, t.tv_sec);
+}
+
+Timespec
+gnc_price_get_time (GNCPrice *p)
+{
+    Timespec t = {0, 0};
+    scm_c_issue_deprecation_warning("gnc_price_get_time is deprecated. Use gnc_price_get_time64 instead.");
+    t.tv_sec = gnc_price_get_time64(p);
+    return t;
+}
+
+GNCPrice*
+gnc_pricedb_lookup_at_time(GNCPriceDB *db,
+                           const gnc_commodity *commodity,
+                           const gnc_commodity *currency,
+                           Timespec t)
+{
+    scm_c_issue_deprecation_warning("gnc_pricedb_lookup_at_time is deprecated. Use gnc_pricedb_lookup_at_time64 instead.");
+    return gnc_pricedb_lookup_at_time64(db, commodity, currency, t.tv_sec);
+}
+
+GNCPrice*
+gnc_pricedb_lookup_day(GNCPriceDB *db,
+                       const gnc_commodity *commodity,
+                       const gnc_commodity *currency,
+                       Timespec t)
+{
+    scm_c_issue_deprecation_warning("gnc_pricedb_lookup_day is deprecated. Use gnc_pricedb_lookup_day_t64 instead.");
+    return gnc_pricedb_lookup_day_t64(db, commodity, currency, t.tv_sec);
+}
+
+GNCPrice*
+gnc_pricedb_lookup_nearest_in_time(GNCPriceDB *db,
+                                   const gnc_commodity *c,
+                                   const gnc_commodity *currency,
+                                   Timespec t)
+{
+    scm_c_issue_deprecation_warning("gnc_pricedb_lookup_nearest_in_time is deprecated. Use gnc_pricedb_lookup_nearest_in_time64 instead.");
+    return gnc_pricedb_lookup_nearest_in_time64(db, c, currency, t.tv_sec);
+}
+
+PriceList*
+gnc_pricedb_lookup_nearest_in_time_any_currency(GNCPriceDB *db,
+                                                const gnc_commodity *c,
+                                                Timespec t)
+{
+    scm_c_issue_deprecation_warning("gnc_pricedb_lookup_nearest_in_time_any_currency is deprecated. Use gnc_pricedb_lookup_nearest_in_time_any_currency_t64 instead.");
+    return gnc_pricedb_lookup_nearest_in_time_any_currency_t64(db, c, t.tv_sec);
+}
+
+GNCPrice*
+gnc_pricedb_lookup_latest_before(GNCPriceDB *db,
+                                 gnc_commodity *c,
+                                 gnc_commodity *currency,
+                                 Timespec t)
+{
+    scm_c_issue_deprecation_warning("gnc_pricedb_lookup_latest_before is deprecated. Use gnc_pricedb_lookup_latest_before_t64 instead.");
+    return gnc_pricedb_lookup_latest_before_t64(db, c, currency, t.tv_sec);
+}
+
+PriceList*
+gnc_pricedb_lookup_latest_before_any_currency(GNCPriceDB *db,
+                                              const gnc_commodity *c,
+                                              Timespec t)
+{
+    scm_c_issue_deprecation_warning("gnc_pricedb_lookup_latest_before_any_currency is deprecated. Use gnc_pricedb_lookup_latest_before_any_currency_t64 instead.");
+    return gnc_pricedb_lookup_latest_before_any_currency_t64(db, c, t.tv_sec);
+}
+
+gnc_numeric
+gnc_pricedb_convert_balance_nearest_price(GNCPriceDB *pdb,
+                                          gnc_numeric balance,
+                                          const gnc_commodity *balance_currency,
+                                          const gnc_commodity *new_currency,
+                                          Timespec t)
+{
+    scm_c_issue_deprecation_warning("gnc_pricedb_convert_balance_nearest_price is deprecated. Use gnc_pricedb_convert_balance_nearest_price_t64 instead.");
+    return gnc_pricedb_convert_balance_nearest_price_t64(pdb, balance, balance_currency, new_currency, t.tv_sec);
+}
diff --git a/libgnucash/engine/engine-deprecated.h b/libgnucash/engine/engine-deprecated.h
new file mode 100644
index 0000000..90bd4a1
--- /dev/null
+++ b/libgnucash/engine/engine-deprecated.h
@@ -0,0 +1,90 @@
+/********************************************************************\
+ * engine-deprecated.h: Guile wrappers for deleted C functions.     *
+ * Copyright 2018 John Ralls <jralls at ceridwen.us>                   *
+ *                                                                  *
+ * This program is free software; you can redistribute it and/or    *
+ * modify it under the terms of the GNU General Public License as   *
+ * published by the Free Software Foundation; either version 2 of   *
+ * the License, or (at your option) any later version.              *
+ *                                                                  *
+ * This program is distributed in the hope that it will be useful,  *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of   *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *
+ * GNU General Public License for more details.                     *
+ *                                                                  *
+ * You should have received a copy of the GNU General Public License*
+ * along with this program; if not, contact:                        *
+ *                                                                  *
+ * Free Software Foundation           Voice:  +1-617-542-5942       *
+ * 51 Franklin Street, Fifth Floor    Fax:    +1-617-542-2652       *
+ * Boston, MA  02110-1301,  USA       gnu at gnu.org                   *
+ *                                                                  *
+\********************************************************************/
+
+#include "config.h"
+#include "Split.h"
+#include "Transaction.h"
+#include "gncTaxTable.h"
+#include "gncOwner.h"
+
+typedef struct
+{
+    time64 tv_sec;
+    time64 tv_nsec;
+} Timespec;
+
+
+void xaccSplitSetDateReconciledTS(Split* s, Timespec *ts);
+void xaccSplitGetDateReconciledTS(Split* s, Timespec *ts);
+Timespec xaccSplitRetDateReconciledTS(Split* s);
+
+Timespec gnc_transaction_get_date_posted(const Transaction *t);
+Timespec gnc_transaction_get_date_entered(const Transaction *t);
+Timespec gnc_split_get_date_reconciled(const Split *s);
+void gnc_transaction_set_date(Transaction *t, Timespec ts);
+
+Timespec gncTaxTableLastModified (const GncTaxTable *table);
+
+void gncOwnerApplyPayment (const GncOwner *owner, Transaction **preset_txn,
+                           GList *lots, Account *posted_acc, Account *xfer_acc,
+                           gnc_numeric amount, gnc_numeric exch, Timespec date,
+                           const char *memo, const char *num,
+                           gboolean auto_pay);
+
+GNCLot* gncOwnerCreatePaymentLot (const GncOwner *owner,
+                                  Transaction **preset_txn, Account *posted_acc,
+                                  Account *xfer_acc, gnc_numeric amount,
+                                  gnc_numeric exch, Timespec date,
+                                  const char *memo, const char *num);
+
+void gnc_price_set_time (GNCPrice *p, Timespec t);
+Timespec gnc_price_get_time (GNCPrice *p);
+GNCPrice* gnc_pricedb_lookup_at_time(GNCPriceDB *db,
+                                     const gnc_commodity *commodity,
+                                     const gnc_commodity *currency,
+                                     Timespec t);
+GNCPrice* gnc_pricedb_lookup_day(GNCPriceDB *db,
+                                 const gnc_commodity *commodity,
+                                 const gnc_commodity *currency,
+                                 Timespec t);
+GNCPrice* gnc_pricedb_lookup_nearest_in_time(GNCPriceDB *db,
+                                             const gnc_commodity *c,
+                                             const gnc_commodity *currency,
+                                             Timespec t);
+PriceList* gnc_pricedb_lookup_nearest_in_time_any_currency(GNCPriceDB *db,
+                                                           const gnc_commodity *c,
+                                                           Timespec t);
+GNCPrice* gnc_pricedb_lookup_latest_before(GNCPriceDB *db,
+                                           gnc_commodity *c,
+                                           gnc_commodity *currency,
+                                           Timespec t);
+PriceList* gnc_pricedb_lookup_latest_before_any_currency(GNCPriceDB *db,
+                                                         const gnc_commodity *c,
+                                                         Timespec t);
+gnc_numeric
+gnc_pricedb_convert_balance_nearest_price(GNCPriceDB *pdb,
+                                          gnc_numeric balance,
+                                          const gnc_commodity *balance_currency,
+                                          const gnc_commodity *new_currency,
+                                          Timespec t);
+
diff --git a/libgnucash/engine/engine.i b/libgnucash/engine/engine.i
index 288f484..ec8dd3d 100644
--- a/libgnucash/engine/engine.i
+++ b/libgnucash/engine/engine.i
@@ -33,6 +33,7 @@
 #include "gnc-lot.h"
 #include "gnc-session.h"
 #include "gnc-hooks-scm.h"
+#include "engine-deprecated.h"
 #include "engine-helpers.h"
 #include "engine-helpers-guile.h"
 #include "policy.h"
@@ -80,6 +81,7 @@ engine-common.i */
 %newobject gnc_account_get_full_name;
 
 %include "engine-common.i"
+%include "engine-deprecated.h"
 
 %inline %{
 static const GncGUID * gncPriceGetGUID(GNCPrice *x)
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 80cf8c0..386ea54 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -624,6 +624,7 @@ libgnucash/engine/business-core.scm
 libgnucash/engine/cap-gains.c
 libgnucash/engine/cashobjects.c
 libgnucash/engine/commodity-table.scm
+libgnucash/engine/engine-deprecated.c
 libgnucash/engine/engine-helpers.c
 libgnucash/engine/engine-interface.scm
 libgnucash/engine/engine.scm

commit e9098d08d28167266a8cbe51a0864efed45b24ca
Author: John Ralls <jralls at ceridwen.us>
Date:   Mon Aug 13 11:48:56 2018 -0700

    Change ISO date format to remove fractional seconds.

diff --git a/libgnucash/engine/gnc-date.cpp b/libgnucash/engine/gnc-date.cpp
index 9f70cd8..fd394b3 100644
--- a/libgnucash/engine/gnc-date.cpp
+++ b/libgnucash/engine/gnc-date.cpp
@@ -1115,7 +1115,7 @@ char *
 gnc_time64_to_iso8601_buff (time64 time, char * buff)
 {
     constexpr size_t max_iso_date_length = 32;
-    const char* format = "%Y-%m-%d %H:%M:%s %q";
+    const char* format = "%Y-%m-%d %H:%M:%S %q";
 
     if (! buff) return NULL;
     try

commit 35fabe26908d8158d4b576dadfe09ca8cdc8b956
Author: John Ralls <jralls at ceridwen.us>
Date:   Sat Aug 4 18:06:29 2018 -0700

    Remove Timespec from gnc-date.

diff --git a/libgnucash/engine/gnc-date-p.h b/libgnucash/engine/gnc-date-p.h
index 96f6175..0a09d37 100644
--- a/libgnucash/engine/gnc-date-p.h
+++ b/libgnucash/engine/gnc-date-p.h
@@ -74,7 +74,6 @@ const char *qof_win32_get_time_format(QofWin32Picture picture);
 /* Test Access for static functions */
 typedef struct
 {
-    void (*timespec_normalize) (Timespec *t);
     GTimeZone* (*timezone_new_local) (void);
 } Testfuncs;
 
diff --git a/libgnucash/engine/gnc-date.cpp b/libgnucash/engine/gnc-date.cpp
index 23e2a81..9f70cd8 100644
--- a/libgnucash/engine/gnc-date.cpp
+++ b/libgnucash/engine/gnc-date.cpp
@@ -378,114 +378,12 @@ gnc_print_time64(time64 time, const char* format)
 /********************************************************************\
 \********************************************************************/
 
-static void
-timespec_normalize(Timespec *t)
-{
-    if (t->tv_nsec > NANOS_PER_SECOND)
-    {
-        t->tv_sec += (t->tv_nsec / NANOS_PER_SECOND);
-        t->tv_nsec = t->tv_nsec % NANOS_PER_SECOND;
-    }
-
-    if (t->tv_nsec < - NANOS_PER_SECOND)
-    {
-        t->tv_sec += - (-t->tv_nsec / NANOS_PER_SECOND);
-        t->tv_nsec = - (-t->tv_nsec % NANOS_PER_SECOND);
-    }
-
-    if (t->tv_sec > 0 && t->tv_nsec < 0)
-    {
-        t->tv_sec--;
-        t->tv_nsec = NANOS_PER_SECOND + t->tv_nsec;
-    }
-
-    if (t->tv_sec < 0 && t->tv_nsec > 0)
-    {
-        t->tv_sec++;
-        t->tv_nsec = - NANOS_PER_SECOND + t->tv_nsec;
-    }
-    return;
-}
-
-gboolean
-timespec_equal (const Timespec *ta, const Timespec *tb)
-{
-    Timespec pta, ptb;
-
-    if (ta == tb) return TRUE;
-/* Copy and normalize the copies */
-    pta = *ta;
-    ptb = *tb;
-    timespec_normalize (&pta);
-    timespec_normalize (&ptb);
-
-    if (pta.tv_sec != ptb.tv_sec) return FALSE;
-    if (pta.tv_nsec != ptb.tv_nsec) return FALSE;
-    return TRUE;
-}
-
-gint
-timespec_cmp(const Timespec *ta, const Timespec *tb)
-{
-    Timespec pta, ptb;
-
-    if (ta == tb) return 0;
-/* Copy and normalize the copies */
-    pta = *ta;
-    ptb = *tb;
-    timespec_normalize (&pta);
-    timespec_normalize (&ptb);
-
-    if (pta.tv_sec < ptb.tv_sec) return -1;
-    if (pta.tv_sec > ptb.tv_sec) return 1;
-    if (pta.tv_nsec < ptb.tv_nsec) return -1;
-    if (pta.tv_nsec > ptb.tv_nsec) return 1;
-    return 0;
-}
-
-Timespec
-timespec_diff(const Timespec *ta, const Timespec *tb)
-{
-    Timespec retval;
-    retval.tv_sec = ta->tv_sec - tb->tv_sec;
-    retval.tv_nsec = ta->tv_nsec - tb->tv_nsec;
-    timespec_normalize(&retval);
-    return retval;
-}
-
-Timespec
-timespec_abs(const Timespec *t)
-{
-    Timespec retval = *t;
-
-    timespec_normalize(&retval);
-    if (retval.tv_sec < 0)
-    {
-        retval.tv_sec = - retval.tv_sec;
-        retval.tv_nsec = - retval.tv_nsec;
-    }
-
-    return retval;
-}
 
 /* Converts any time on a day to midday that day.
 
  * given a timepair contains any time on a certain day (local time)
  * converts it to be midday that day.
  */
-Timespec
-timespecCanonicalDayTime(Timespec t)
-{
-    struct tm tm;
-    Timespec retval;
-    time64 t_secs = t.tv_sec + (t.tv_nsec / NANOS_PER_SECOND);
-    gnc_localtime_r(&t_secs, &tm);
-    gnc_tm_set_day_middle(&tm);
-    retval.tv_sec = gnc_mktime(&tm);
-    retval.tv_nsec = 0;
-    return retval;
-}
-
 time64
 time64CanonicalDayTime (time64 t)
 {
@@ -697,20 +595,6 @@ qof_print_date (time64 t)
     return g_strdup (buff);
 }
 
-const char *
-gnc_print_date (Timespec ts)
-{
-    static char buff[MAX_DATE_LENGTH];
-    time64 t;
-
-    memset (buff, 0, sizeof (buff));
-    t = ts.tv_sec + (time64)(ts.tv_nsec / 1000000000.0);
-
-    qof_print_date_buff (buff, MAX_DATE_LENGTH, t);
-
-    return buff;
-}
-
 /* ============================================================== */
 
 /* return the greatest integer <= a/b; works for b > 0 and positive or
@@ -1230,20 +1114,13 @@ gnc_iso8601_to_time64_gmt(const char *cstr)
 char *
 gnc_time64_to_iso8601_buff (time64 time, char * buff)
 {
-    Timespec ts = {time, 0};
-    return gnc_timespec_to_iso8601_buff (ts, buff);
-}
-
-char *
-gnc_timespec_to_iso8601_buff (Timespec ts, char * buff)
-{
     constexpr size_t max_iso_date_length = 32;
     const char* format = "%Y-%m-%d %H:%M:%s %q";
 
     if (! buff) return NULL;
     try
     {
-        GncDateTime gncdt(ts.tv_sec);
+        GncDateTime gncdt(time);
         auto sstr = gncdt.format(format);
 
         memset(buff, 0, sstr.length() + 1);
@@ -1252,117 +1129,63 @@ gnc_timespec_to_iso8601_buff (Timespec ts, char * buff)
     }
     catch(std::logic_error& err)
     {
-        PWARN("Error processing time64 %" PRId64 ": %s", ts.tv_sec, err.what());
+        PWARN("Error processing time64 %" PRId64 ": %s", time, err.what());
         return buff;
     }
     catch(std::runtime_error& err)
     {
-        PWARN("Error processing time64 %" PRId64 ": %s", ts.tv_sec, err.what());
+        PWARN("Error processing time64 %" PRId64 ": %s", time, err.what());
         return buff;
     }
 }
 
 #define THIRTY_TWO_YEARS 0x3c30fc00LL
 
-static Timespec
-gnc_dmy2timespec_internal (int day, int month, int year, DayPart day_part)
+static time64
+gnc_dmy2time64_internal (int day, int month, int year, DayPart day_part)
 {
     try
     {
         auto date = GncDate(year, month, day);
-        return { static_cast<time64>(GncDateTime (date, day_part)), 0 };
+        return static_cast<time64>(GncDateTime (date, day_part));
     }
     catch(const std::logic_error& err)
     {
         PWARN("Date computation error from Y-M-D %d-%d-%d: %s",
               year, month, day, err.what());
-        return {INT64_MAX, 0};
+        return INT64_MAX;
     }
     catch(const std::runtime_error& err)
     {
         PWARN("Date computation error from Y-M-D %d-%d-%d: %s",
               year, month, day, err.what());
-        return {INT64_MAX, 0};
+        return INT64_MAX;
     }
 }
 
 time64
 gnc_dmy2time64 (int day, int month, int year)
 {
-    return gnc_dmy2timespec_internal (day, month, year, DayPart::start).tv_sec;
+    return gnc_dmy2time64_internal (day, month, year, DayPart::start);
 }
 
 time64
 gnc_dmy2time64_end (int day, int month, int year)
 {
-    return gnc_dmy2timespec_internal (day, month, year, DayPart::end).tv_sec;
+    return gnc_dmy2time64_internal (day, month, year, DayPart::end);
 }
 
 time64
 gnc_dmy2time64_neutral (int day, int month, int year)
 {
-    return gnc_dmy2timespec_internal (day, month, year, DayPart::neutral).tv_sec;
-}
-
-Timespec
-gnc_dmy2timespec (int day, int month, int year)
-{
-    return gnc_dmy2timespec_internal (day, month, year, DayPart::start);
-}
-
-Timespec
-gnc_dmy2timespec_end (int day, int month, int year)
-{
-    return gnc_dmy2timespec_internal (day, month, year, DayPart::end);
-}
-
-Timespec
-gnc_dmy2timespec_neutral (int day, int month, int year)
-{
-    return gnc_dmy2timespec_internal (day, month, year, DayPart::neutral);
-}
-/********************************************************************\
-\********************************************************************/
-void
-timespecFromTime64 ( Timespec *ts, time64 t )
-{
-    ts->tv_sec = t;
-    ts->tv_nsec = 0;
-}
-
-Timespec
-timespec_now()
-{
-    Timespec ts;
-    ts.tv_sec = gnc_time(NULL);
-    ts.tv_nsec = 0;
-    return ts;
+    return gnc_dmy2time64_internal (day, month, year, DayPart::neutral);
 }
 
-time64
-timespecToTime64 (Timespec ts)
-{
-    return ts.tv_sec;
-}
 
 /* The GDate setter functions all in the end use g_date_set_time_t,
  * which in turn relies on localtime and is therefore subject to the
  * 2038 bug.
  */
-GDate timespec_to_gdate (Timespec ts)
-{
-    GDate result;
-
-    g_date_clear (&result, 1);
-    GncDateTime time(ts.tv_sec);
-    auto date = time.date().year_month_day();
-    g_date_set_dmy (&result, date.day, static_cast<GDateMonth>(date.month),
-                    date.year);
-    g_assert(g_date_valid (&result));
-
-    return result;
-}
-
 GDate time64_to_gdate (time64 t)
 {
     GDate result;
@@ -1411,13 +1234,6 @@ time64 gdate_to_time64 (GDate d)
                                      g_date_get_year(&d));
 }
 
-Timespec gdate_to_timespec (GDate d)
-{
-    return gnc_dmy2timespec_neutral (g_date_get_day(&d),
-                                     g_date_get_month(&d),
-                                     g_date_get_year(&d));
-}
-
 static void
 gnc_tm_get_day_start (struct tm *tm, time64 time_val)
 {
@@ -1538,14 +1354,6 @@ time64_get_type( void )
     return type;
 }
 
-Testfuncs*
-gnc_date_load_funcs (void)
-{
-    Testfuncs *tf = g_slice_new (Testfuncs);
-    tf->timespec_normalize = timespec_normalize;
-    return tf;
-}
-
 /* ================================================= */
 
 gboolean
@@ -1799,3 +1607,10 @@ gnc_gdate_set_prev_fiscal_year_end (GDate *date,
     gnc_gdate_set_fiscal_year_end(date, fy_end);
     g_date_subtract_years(date, 1);
 }
+
+Testfuncs*
+gnc_date_load_funcs (void)
+{
+    Testfuncs *tf = g_slice_new (Testfuncs);
+    return tf;
+}
diff --git a/libgnucash/engine/gnc-date.h b/libgnucash/engine/gnc-date.h
index 140dc92..b3dc51e 100644
--- a/libgnucash/engine/gnc-date.h
+++ b/libgnucash/engine/gnc-date.h
@@ -91,16 +91,6 @@ typedef struct
 } Time64;
 
 
-/** The Timespec is just like the unix 'struct timespec'
- * except that we use a 64-bit unsigned int to
- * store the seconds.  This should adequately cover dates in the
- * distant future as well as the distant past, as long as they're not
- * more than a couple dozen times the age of the universe
- * Values of this type can range from -9,223,372,036,854,775,808 to
- * 9,223,372,036,854,775,807.
- */
-typedef struct timespec64 Timespec;
-
 /** @name GValue
   @{
 */
@@ -295,97 +285,29 @@ void gnc_gdate_set_today (GDate* gd);
 void gnc_gdate_set_time64 (GDate* gd, time64 time);
 
 /** @} */
-
-/* Datatypes *******************************************************/
-
-/** \brief Use a 64-bit unsigned int timespec
- *
- * struct timespec64 is just like the unix 'struct timespec' except
- * that we use a 64-bit
- * unsigned int to store the seconds.  This should adequately cover
- * dates in the distant future as well as the distant past, as long as
- * they're not more than a couple dozen times the age of the universe.
- * Values of this type can range from -9,223,372,036,854,775,808 to
- * 9,223,372,036,854,775,807.
- */
-
-#ifndef SWIG   /* swig 1.1p5 can't hack the long long type */
-struct timespec64
-{
-    time64 tv_sec;
-    glong tv_nsec;
-};
-#endif /* SWIG */
-
-
-
-/* Prototypes ******************************************************/
-
-/** \name Timespec functions */
-// @{
-/** strict equality */
-gboolean timespec_equal(const Timespec *ta, const Timespec *tb);
-
-/** comparison:  if (ta < tb) -1; else if (ta > tb) 1; else 0; */
-gint      timespec_cmp(const Timespec *ta, const Timespec *tb);
-
-/** difference between ta and tb, results are normalized
- * ie tv_sec and tv_nsec of the result have the same size
- * abs(result.tv_nsec) <= 1000000000 */
-Timespec timespec_diff(const Timespec *ta, const Timespec *tb);
-
-/** absolute value, also normalized */
-Timespec timespec_abs(const Timespec *t);
-
-/** convert a timespec on a certain day (localtime) to
- * the timespec representing midday on that day. Watch out - this is *not* the
+/** convert a time64 on a certain day (localtime) to
+ * the time64 representing midday on that day. Watch out - this is *not* the
  * first second of the day, which is returned by various other functions
- * returning a Timespec. */
-Timespec timespecCanonicalDayTime(Timespec t);
-
+ * returning a time64. */
 time64 time64CanonicalDayTime(time64 t);
 
-/** Returns the current clock time as a Timespec, taken from time(2). */
-Timespec timespec_now (void);
-
-/** Turns a time64 into a Timespec */
-void timespecFromTime64 (Timespec *ts, time64 t );
-
-/** Turns a Timespec into a time64 */
-time64 timespecToTime64 (Timespec ts);
-
-GDate time64_to_gdate (time64 t);
-
-/** Turns a Timespec into a GDate */
-GDate timespec_to_gdate (Timespec ts);
-
-/** Turns a GDate into a Timespec, returning the first second of the day  */
-Timespec gdate_to_timespec (GDate d);
-
 /** Turns a GDate into a time64, returning the first second of the day */
 time64 gdate_to_time64 (GDate d);
 
 /** Convert a day, month, and year to a time64, returning the first second of the day */
 time64 gnc_dmy2time64 (gint day, gint month, gint year);
 
-time64 gnc_dmy2time64_neutral (gint day, gint month, gint year);
-
-time64 gnc_dmy2time64_end (gint day, gint month, gint year);
-
-/** Convert a day, month, and year to a Timespec, returning the first second of the day */
-Timespec gnc_dmy2timespec (gint day, gint month, gint year);
-
-/** Same as gnc_dmy2timespec, but last second of the day */
-Timespec gnc_dmy2timespec_end (gint day, gint month, gint year);
-
-/** Converts a day, month, and year to a Timespec representing 11:00:00 UTC
+/** Converts a day, month, and year to a time64 representing 11:00:00 UTC
  *  11:00:00 UTC falls on the same time in almost all timezones, the exceptions
  *  being the +13, +14, and -12 timezones used by countries along the
  *  International Date Line. Since users in those timezones would see dates
  *  immediately change by one day, the function checks the current timezone for
  *  those changes and adjusts the UTC time so that the date will be consistent.
  */
-Timespec gnc_dmy2timespec_neutral (gint day, gint month, gint year);
+time64 gnc_dmy2time64_neutral (gint day, gint month, gint year);
+
+/** Same as gnc_dmy2time64, but last second of the day */
+time64 gnc_dmy2time64_end (gint day, gint month, gint year);
 
 /** The gnc_iso8601_to_time64_gmt() routine converts an ISO-8601 style
  *    date/time string to time64.  Please note that ISO-8601 strings
@@ -405,8 +327,8 @@ Timespec gnc_dmy2timespec_neutral (gint day, gint month, gint year);
  */
 time64 gnc_iso8601_to_time64_gmt(const gchar *);
 
-/** The gnc_timespec_to_iso8601_buff() routine takes the input
- *    UTC Timespec value and prints it as an ISO-8601 style string.
+/** The gnc_time64_to_iso8601_buff() routine takes the input
+ *    UTC time64 value and prints it as an ISO-8601 style string.
  *    The buffer must be long enough to contain the NULL-terminated
  *    string (32 characters + NUL).  This routine returns a pointer
  *    to the null terminator (and can thus be used in the 'stpcpy'
@@ -421,7 +343,6 @@ time64 gnc_iso8601_to_time64_gmt(const gchar *);
  *    The string generated by this routine uses the local time zone
  *    on the machine on which it is executing to create the time string.
  */
-gchar * gnc_timespec_to_iso8601_buff (Timespec ts, gchar * buff);
 gchar * gnc_time64_to_iso8601_buff (time64, char * buff);
 // @}
 
@@ -555,13 +476,6 @@ size_t qof_print_gdate(char *buf, size_t bufflen, const GDate *gd);
  * **/
 char * qof_print_date (time64 secs);
 
-/** Convenience; calls through to qof_print_date_dmy_buff().
- *  Return: static global string.
- *  \warning This routine is not thread-safe, because it uses a single
- *      global buffer to store the return value.  Use qof_print_date_buff()
- *      or qof_print_date() instead.
- * **/
-const char * gnc_print_date(Timespec ts);
 
 /* ------------------------------------------------------------------ */
 /* time printing utilities */
@@ -706,6 +620,11 @@ guint gnc_gdate_hash( gconstpointer gd );
 
 /** \name GDate to time64 conversions */
 // @{
+/** Returns the GDate in which the time64 occurs.
+ * @param t The time64
+ * @returns A GDate for the day in which the time64 occurs.
+ */
+GDate time64_to_gdate (time64 t);
 
 /** The gnc_time64_get_day_start() routine will take the given time in
  *  GLib GDate format and adjust it to the first second of that day.
diff --git a/libgnucash/engine/test/CMakeLists.txt b/libgnucash/engine/test/CMakeLists.txt
index 7d698f5..a19c1fb 100644
--- a/libgnucash/engine/test/CMakeLists.txt
+++ b/libgnucash/engine/test/CMakeLists.txt
@@ -26,7 +26,6 @@ add_dependencies(check test-link)
 
 add_engine_test(test-load-engine test-load-engine.c)
 add_engine_test(test-guid test-guid.cpp)
-add_engine_test(test-date test-date.cpp)
 add_engine_test(test-object test-object.c)
 add_engine_test(test-commodities test-commodities.cpp)
 
@@ -271,7 +270,6 @@ set(test_engine_SOURCES_DIST
         test-business.c
         test-commodities.cpp
         test-customer.c
-        test-date.cpp
         test-employee.c
         test-engine-kvp-properties.c
         test-engine.c
diff --git a/libgnucash/engine/test/test-date.cpp b/libgnucash/engine/test/test-date.cpp
deleted file mode 100644
index acf502a..0000000
--- a/libgnucash/engine/test/test-date.cpp
+++ /dev/null
@@ -1,421 +0,0 @@
-/*
- * -- fix borken timezone test -- linas May 2004
- */
-/********************************************************************\
- * This program is free software; you can redistribute it and/or    *
- * modify it under the terms of the GNU General Public License as   *
- * published by the Free Software Foundation; either version 2 of   *
- * the License, or (at your option) any later version.              *
- *                                                                  *
- * This program is distributed in the hope that it will be useful,  *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of   *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *
- * GNU General Public License for more details.                     *
- *                                                                  *
- * You should have received a copy of the GNU General Public License*
- * along with this program; if not, contact:                        *
- *                                                                  *
- * Free Software Foundation           Voice:  +1-617-542-5942       *
- * 51 Franklin Street, Fifth Floor    Fax:    +1-617-542-2652       *
- * Boston, MA  02110-1301,  USA       gnu at gnu.org                   *
- *                                                                  *
-\********************************************************************/
-
-extern "C"
-{
-#include <config.h>
-#include <ctype.h>
-#include <glib.h>
-#include <time.h>
-
-#include "gnc-date.h"
-#include "gnc-module.h"
-#include "test-stuff.h"
-#include "test-engine-stuff.h"
-}
-
-static gboolean
-check_time (Timespec ts, gboolean always_print)
-{
-    Timespec ts_2;
-    char str[128];
-    gboolean ok;
-
-    ts.tv_nsec = MIN (ts.tv_nsec, 999999999);
-    ts.tv_nsec /= 1000;
-    ts.tv_nsec *= 1000;
-
-    gnc_timespec_to_iso8601_buff (ts, str);
-
-    /* The time, in seconds, everywhere on the planet, is always
-     * the same, and is independent of location.  In particular,
-     * the time, in seconds, is identical to the local time in
-     * Greenwich (GMT).
-     */
-    ts_2 = {gnc_iso8601_to_time64_gmt (str), 0};
-
-    ok = timespec_equal (&ts, &ts_2);
-
-    if (!ok || always_print)
-    {
-        fprintf (stderr,
-                 "\n%" G_GINT64_FORMAT ":%ld -> %s ->\n"
-                 "\t%" G_GINT64_FORMAT ":%ld"
-                 " (diff of %" G_GINT64_FORMAT " secs %ld nsecs)\n",
-                 ts.tv_sec, ts.tv_nsec, str,
-                 ts_2.tv_sec, ts_2.tv_nsec,
-                 ts.tv_sec - ts_2.tv_sec, ts.tv_nsec - ts_2.tv_nsec);
-
-        if (!ok)
-        {
-            failure ("timespec to iso8601 string conversion failed");
-            return FALSE;
-        }
-    }
-
-    success ("timespec to iso8601 string conversion passes");
-
-    return TRUE;
-}
-
-static gboolean
-check_conversion (const char * str, Timespec expected_ts)
-{
-    Timespec ts;
-    struct tm tm;
-    int day, month, year;
-    GDate d1, d2;
-
-    ts = {gnc_iso8601_to_time64_gmt (str), 0};
-
-    // We test the conversion to GDate against the gnc_localtime_r
-    // conversion, and also the conversion back to timespec and again
-    // to GDate so that it is still the original GDate
-    gnc_localtime_r (&ts.tv_sec, &tm);
-    day = tm.tm_mday;
-    month = tm.tm_mon + 1;
-    year = tm.tm_year + 1900;
-    d1 = timespec_to_gdate(ts);
-    d2 = timespec_to_gdate(gdate_to_timespec(d1));
-    if ((g_date_compare(&d1, &d2) != 0)
-            || (g_date_get_day(&d1) != day)
-            || (g_date_get_month(&d1) != month)
-            || (g_date_get_year(&d1) != year))
-    {
-        fprintf (stderr,
-                 "\nmis-converted \"%s\" to GDate. "
-                 "Got d1(Y-M-D) = %i-%i-%i, d2(Y-M-D) = %i-%i-%i\n",
-                 str, year, month, day,
-                 g_date_get_year(&d2), g_date_get_month(&d2), g_date_get_day(&d2));
-        failure ("misconverted timespec");
-        return FALSE;
-    }
-
-    if ((expected_ts.tv_sec != ts.tv_sec) || (expected_ts.tv_nsec != ts.tv_nsec))
-    {
-        fprintf (stderr,
-                 "\nmis-converted \"%s\" to %" G_GUINT64_FORMAT ".%09ld seconds\n"
-                 "\twas expecting %" G_GUINT64_FORMAT ".%09ld seconds\n",
-                 str, ts.tv_sec, ts.tv_nsec,
-                 expected_ts.tv_sec, expected_ts.tv_nsec);
-        failure ("misconverted timespec");
-        return FALSE;
-    }
-    success ("good conversion");
-    return TRUE;
-}
-
-static void
-run_test (void)
-{
-    Timespec ts;
-    int i;
-    gboolean do_print = FALSE;
-
-    /* Now leaving the 60's:
-     *
-     * Black Panthers
-     * Weather Underground
-     * Kent State
-     * Evacuation of Vietnam
-     * Impeachment
-     * Gas Crisis
-     * New York Garbage Crisis
-     * Stagflation
-     * Delapidated Bicentennial
-     * Sex Pistols
-     * Punk Rock
-     *
-     * Of course, anything had to be better than the miserable 70's,
-     * which explains why Reagan was elected.  Food for thought.
-     */
-    ts.tv_sec = 10 * 365 * 24 * 3600 + 2 * 24 * 3600;
-    ts.tv_nsec = 0;
-    check_conversion ("1979-12-31 15:00:00.000000 -0900", ts);
-    check_conversion ("1979-12-31 16:00:00.000000 -0800", ts);
-    check_conversion ("1979-12-31 17:00:00.000000 -0700", ts);
-    check_conversion ("1979-12-31 18:00:00.000000 -0600", ts);
-    check_conversion ("1979-12-31 19:00:00.000000 -0500", ts);
-    check_conversion ("1979-12-31 20:00:00.000000 -0400", ts);
-    check_conversion ("1979-12-31 21:00:00.000000 -0300", ts);
-    check_conversion ("1979-12-31 22:00:00.000000 -0200", ts);
-    check_conversion ("1979-12-31 23:00:00.000000 -0100", ts);
-
-    check_conversion ("1980-01-01 00:00:00.000000 -0000", ts);
-    check_conversion ("1980-01-01 00:00:00.000000 +0000", ts);
-
-    check_conversion ("1980-01-01 01:00:00.000000 +0100", ts);
-    check_conversion ("1980-01-01 02:00:00.000000 +0200", ts);
-    check_conversion ("1980-01-01 03:00:00.000000 +0300", ts);
-    check_conversion ("1980-01-01 04:00:00.000000 +0400", ts);
-    check_conversion ("1980-01-01 05:00:00.000000 +0500", ts);
-    check_conversion ("1980-01-01 06:00:00.000000 +0600", ts);
-    check_conversion ("1980-01-01 07:00:00.000000 +0700", ts);
-    check_conversion ("1980-01-01 08:00:00.000000 +0800", ts);
-
-    /* check minute-offsets as well */
-    check_conversion ("1980-01-01 08:01:00.000000 +0801", ts);
-    check_conversion ("1980-01-01 08:02:00.000000 +0802", ts);
-    check_conversion ("1980-01-01 08:03:00.000000 +0803", ts);
-    check_conversion ("1980-01-01 08:23:00.000000 +0823", ts);
-    check_conversion ("1980-01-01 08:35:00.000000 +0835", ts);
-    check_conversion ("1980-01-01 08:47:00.000000 +0847", ts);
-    check_conversion ("1980-01-01 08:59:00.000000 +0859", ts);
-
-    check_conversion ("1979-12-31 15:01:00.000000 -0859", ts);
-    check_conversion ("1979-12-31 15:02:00.000000 -0858", ts);
-    check_conversion ("1979-12-31 15:03:00.000000 -0857", ts);
-    check_conversion ("1979-12-31 15:23:00.000000 -0837", ts);
-    check_conversion ("1979-12-31 15:45:00.000000 -0815", ts);
-
-
-    /* The 90's */
-    ts.tv_sec = 20 * 365 * 24 * 3600 + 5 * 24 * 3600;
-    ts.tv_nsec = 0;
-    check_conversion ("1989-12-31 15:00:00.000000 -0900", ts);
-    check_conversion ("1989-12-31 16:00:00.000000 -0800", ts);
-    check_conversion ("1989-12-31 17:00:00.000000 -0700", ts);
-    check_conversion ("1989-12-31 18:00:00.000000 -0600", ts);
-    check_conversion ("1989-12-31 19:00:00.000000 -0500", ts);
-    check_conversion ("1989-12-31 20:00:00.000000 -0400", ts);
-    check_conversion ("1989-12-31 21:00:00.000000 -0300", ts);
-    check_conversion ("1989-12-31 22:00:00.000000 -0200", ts);
-    check_conversion ("1989-12-31 23:00:00.000000 -0100", ts);
-
-    check_conversion ("1990-01-01 00:00:00.000000 -0000", ts);
-    check_conversion ("1990-01-01 00:00:00.000000 +0000", ts);
-
-    check_conversion ("1990-01-01 01:00:00.000000 +0100", ts);
-    check_conversion ("1990-01-01 02:00:00.000000 +0200", ts);
-    check_conversion ("1990-01-01 03:00:00.000000 +0300", ts);
-    check_conversion ("1990-01-01 04:00:00.000000 +0400", ts);
-    check_conversion ("1990-01-01 05:00:00.000000 +0500", ts);
-    check_conversion ("1990-01-01 06:00:00.000000 +0600", ts);
-    check_conversion ("1990-01-01 07:00:00.000000 +0700", ts);
-    check_conversion ("1990-01-01 08:00:00.000000 +0800", ts);
-
-    /* check minute-offsets as well */
-    check_conversion ("1990-01-01 08:01:00.000000 +0801", ts);
-    check_conversion ("1990-01-01 08:02:00.000000 +0802", ts);
-    check_conversion ("1990-01-01 08:03:00.000000 +0803", ts);
-    check_conversion ("1990-01-01 08:23:00.000000 +0823", ts);
-    check_conversion ("1990-01-01 08:35:00.000000 +0835", ts);
-    check_conversion ("1990-01-01 08:47:00.000000 +0847", ts);
-    check_conversion ("1990-01-01 08:59:00.000000 +0859", ts);
-
-    check_conversion ("1989-12-31 15:01:00.000000 -0859", ts);
-    check_conversion ("1989-12-31 15:02:00.000000 -0858", ts);
-    check_conversion ("1989-12-31 15:03:00.000000 -0857", ts);
-    check_conversion ("1989-12-31 15:23:00.000000 -0837", ts);
-    check_conversion ("1989-12-31 15:45:00.000000 -0815", ts);
-
-
-    /* The naughties */
-    ts.tv_sec = 30 * 365 * 24 * 3600 + 7 * 24 * 3600;
-    ts.tv_nsec = 0;
-    check_conversion ("1999-12-31 15:00:00.000000 -0900", ts);
-    check_conversion ("1999-12-31 16:00:00.000000 -0800", ts);
-    check_conversion ("1999-12-31 17:00:00.000000 -0700", ts);
-    check_conversion ("1999-12-31 18:00:00.000000 -0600", ts);
-    check_conversion ("1999-12-31 19:00:00.000000 -0500", ts);
-    check_conversion ("1999-12-31 20:00:00.000000 -0400", ts);
-    check_conversion ("1999-12-31 21:00:00.000000 -0300", ts);
-    check_conversion ("1999-12-31 22:00:00.000000 -0200", ts);
-    check_conversion ("1999-12-31 23:00:00.000000 -0100", ts);
-
-    check_conversion ("2000-01-01 00:00:00.000000 -0000", ts);
-    check_conversion ("2000-01-01 00:00:00.000000 +0000", ts);
-
-    check_conversion ("2000-01-01 01:00:00.000000 +0100", ts);
-    check_conversion ("2000-01-01 02:00:00.000000 +0200", ts);
-    check_conversion ("2000-01-01 03:00:00.000000 +0300", ts);
-    check_conversion ("2000-01-01 04:00:00.000000 +0400", ts);
-    check_conversion ("2000-01-01 05:00:00.000000 +0500", ts);
-    check_conversion ("2000-01-01 06:00:00.000000 +0600", ts);
-    check_conversion ("2000-01-01 07:00:00.000000 +0700", ts);
-    check_conversion ("2000-01-01 08:00:00.000000 +0800", ts);
-
-    /* check minute-offsets as well */
-    check_conversion ("2000-01-01 08:01:00.000000 +0801", ts);
-    check_conversion ("2000-01-01 08:02:00.000000 +0802", ts);
-    check_conversion ("2000-01-01 08:03:00.000000 +0803", ts);
-    check_conversion ("2000-01-01 08:23:00.000000 +0823", ts);
-    check_conversion ("2000-01-01 08:35:00.000000 +0835", ts);
-    check_conversion ("2000-01-01 08:47:00.000000 +0847", ts);
-    check_conversion ("2000-01-01 08:59:00.000000 +0859", ts);
-
-    check_conversion ("1999-12-31 15:01:00.000000 -0859", ts);
-    check_conversion ("1999-12-31 15:02:00.000000 -0858", ts);
-    check_conversion ("1999-12-31 15:03:00.000000 -0857", ts);
-    check_conversion ("1999-12-31 15:23:00.000000 -0837", ts);
-    check_conversion ("1999-12-31 15:45:00.000000 -0815", ts);
-
-
-    /* The nows */
-    ts.tv_sec = 35 * 365 * 24 * 3600 + 9 * 24 * 3600;
-    ts.tv_nsec = 0;
-    check_conversion ("2004-12-31 15:00:00.000000 -0900", ts);
-    check_conversion ("2004-12-31 16:00:00.000000 -0800", ts);
-    check_conversion ("2004-12-31 17:00:00.000000 -0700", ts);
-    check_conversion ("2004-12-31 18:00:00.000000 -0600", ts);
-    check_conversion ("2004-12-31 19:00:00.000000 -0500", ts);
-    check_conversion ("2004-12-31 20:00:00.000000 -0400", ts);
-    check_conversion ("2004-12-31 21:00:00.000000 -0300", ts);
-    check_conversion ("2004-12-31 22:00:00.000000 -0200", ts);
-    check_conversion ("2004-12-31 23:00:00.000000 -0100", ts);
-
-    check_conversion ("2005-01-01 00:00:00.000000 -0000", ts);
-    check_conversion ("2005-01-01 00:00:00.000000 +0000", ts);
-
-    check_conversion ("2005-01-01 01:00:00.000000 +0100", ts);
-    check_conversion ("2005-01-01 02:00:00.000000 +0200", ts);
-    check_conversion ("2005-01-01 03:00:00.000000 +0300", ts);
-    check_conversion ("2005-01-01 04:00:00.000000 +0400", ts);
-    check_conversion ("2005-01-01 05:00:00.000000 +0500", ts);
-    check_conversion ("2005-01-01 06:00:00.000000 +0600", ts);
-    check_conversion ("2005-01-01 07:00:00.000000 +0700", ts);
-    check_conversion ("2005-01-01 08:00:00.000000 +0800", ts);
-
-    /* check minute-offsets as well */
-    check_conversion ("2005-01-01 08:01:00.000000 +0801", ts);
-    check_conversion ("2005-01-01 08:02:00.000000 +0802", ts);
-    check_conversion ("2005-01-01 08:03:00.000000 +0803", ts);
-    check_conversion ("2005-01-01 08:23:00.000000 +0823", ts);
-    check_conversion ("2005-01-01 08:35:00.000000 +0835", ts);
-    check_conversion ("2005-01-01 08:47:00.000000 +0847", ts);
-    check_conversion ("2005-01-01 08:59:00.000000 +0859", ts);
-
-    check_conversion ("2004-12-31 15:01:00.000000 -0859", ts);
-    check_conversion ("2004-12-31 15:02:00.000000 -0858", ts);
-    check_conversion ("2004-12-31 15:03:00.000000 -0857", ts);
-    check_conversion ("2004-12-31 15:23:00.000000 -0837", ts);
-    check_conversion ("2004-12-31 15:45:00.000000 -0815", ts);
-
-
-    /* Various leap-year days and near-leap times. */
-    ts = {gnc_iso8601_to_time64_gmt ("1980-02-29 00:00:00.000000 -0000"), 0};
-    check_time (ts, do_print);
-
-    ts = {gnc_iso8601_to_time64_gmt ("1979-02-28 00:00:00.000000 -0000"), 0};
-    check_time (ts, do_print);
-
-    ts = {gnc_iso8601_to_time64_gmt ("1990-02-28 00:00:00.000000 -0000"), 0};
-    check_time (ts, do_print);
-
-    ts = {gnc_iso8601_to_time64_gmt ("2000-02-29 00:00:00.000000 -0000"), 0};
-    check_time (ts, do_print);
-
-    ts = {gnc_iso8601_to_time64_gmt ("2004-02-29 00:00:00.000000 -0000"), 0};
-    check_time (ts, do_print);
-
-    ts = {gnc_iso8601_to_time64_gmt ("2008-02-29 00:00:00.000000 -0000"), 0};
-    check_time (ts, do_print);
-
-    ts = {gnc_iso8601_to_time64_gmt ("2008-02-29 00:01:00.000000 -0000"), 0};
-    check_time (ts, do_print);
-
-    ts = {gnc_iso8601_to_time64_gmt ("2008-02-29 02:02:00.000000 -0000"), 0};
-    check_time (ts, do_print);
-
-    ts = {gnc_iso8601_to_time64_gmt ("2008-02-28 23:23:23.000000 -0000"), 0};
-    check_time (ts, do_print);
-
-    /* Here's a date ten days after the 2038 rollover that should work
-       if/when we support it. */
-    ts.tv_nsec = 0;
-    ts.tv_sec = (long long int) 0x7fffffff + 3600 * 24 * 10;
-    check_time(ts, do_print);
-
-    /* Various 'special' times. What makes these so special? */
-    ts.tv_sec = 152098136;
-    ts.tv_nsec = 0;
-    check_time (ts, do_print);
-
-    ts.tv_sec = 1162088421;
-    ts.tv_nsec = 0;
-    check_time (ts, do_print);
-
-    ts.tv_sec = 325659000 - 6500;
-    ts.tv_nsec = 0;
-    check_time (ts, do_print);
-
-    ts.tv_sec = 1143943200;
-    ts.tv_nsec = 0;
-    check_time (ts, do_print);
-
-    ts.tv_sec = 1603591171;
-    ts.tv_nsec = 0;
-    check_time (ts, do_print);
-
-    ts.tv_sec = 1738909365;
-    ts.tv_nsec = 0;
-    check_time (ts, do_print);
-
-    ts.tv_sec = 1603591171;
-    ts.tv_nsec = 0;
-    check_time (ts, do_print);
-
-    ts.tv_sec = 1143943200 - 1;
-    ts.tv_nsec = 0;
-    check_time (ts, do_print);
-
-    ts.tv_sec = 1143943200;
-    ts.tv_nsec = 0;
-    check_time (ts, do_print);
-
-    ts.tv_sec = 1143943200 + (7 * 60 * 60);
-    ts.tv_nsec = 0;
-    check_time (ts, do_print);
-
-    ts.tv_sec = 1143943200 + (8 * 60 * 60);
-    ts.tv_nsec = 0;
-    check_time (ts, do_print);
-
-    ts.tv_sec = get_random_time ();
-
-    for (i = 0; i < 10000; i++)
-    {
-        ts.tv_sec += 10800;
-        if (!check_time (ts, FALSE))
-            return;
-    }
-
-    for (i = 0; i < 5000; i++)
-    {
-        ts.tv_sec = get_random_time ();
-
-        if (!check_time (ts, FALSE))
-            return;
-    }
-}
-
-int
-main (int argc, char **argv)
-{
-    run_test ();
-
-    success ("dates seem to work");
-
-    print_test_results();
-    exit(get_rv());
-}
diff --git a/libgnucash/engine/test/test-gnc-date.c b/libgnucash/engine/test/test-gnc-date.c
index c084b3d..2c38565 100644
--- a/libgnucash/engine/test/test-gnc-date.c
+++ b/libgnucash/engine/test/test-gnc-date.c
@@ -61,12 +61,12 @@ typedef struct
     TZOffset off_zulu;
     TZOffset off_05w;
     TZOffset off_0840e;
-    Timespec ts0;
-    Timespec ts1;
-    Timespec ts2;
-    Timespec ts3;
-    Timespec ts4;
-    Timespec ts5;
+    time64 t0;
+    time64 t1;
+    time64 t2;
+    time64 t3;
+    time64 t4;
+    time64 t5;
 } FixtureA;
 
 static int
@@ -83,15 +83,15 @@ offset_string (TZOffset tz)
 
 static void setup (FixtureA *f, gconstpointer pData)
 {
-    f->ts0 = (Timespec){gnc_time(NULL), 0};
+    f->t0 = gnc_time(NULL);
     f->off_zulu = (TZOffset){0, 0};
     f->off_05w = (TZOffset){-5, 0};
     f->off_0840e = (TZOffset){8, 40};
-    f->ts1 = (Timespec){607009407, 0}; //1989-3-27 13:43:27 Z
-    f->ts2 = (Timespec){1604748079, 0}; //2020-11-7 06:21:19 -05:00
-    f->ts3 = (Timespec){1341398864, 0}; //2012-07-04 19:27:44 +08:40
-    f->ts4 = (Timespec){-261104801, 0}; //1961-09-22 17:53:19 -05:00
-    f->ts5 = (Timespec){2873938879LL, 0}; //2061-01-25 23:21:19 -05:00
+    f->t1 = 607009407; //1989-3-27 13:43:27 Z
+    f->t2 = 1604748079; //2020-11-7 06:21:19 -05:00
+    f->t3 = 1341398864; //2012-07-04 19:27:44 +08:40
+    f->t4 = -261104801; //1961-09-22 17:53:19 -05:00
+    f->t5 = 2873938879LL; //2061-01-25 23:21:19 -05:00
 }
 
 typedef struct
@@ -492,217 +492,23 @@ test_gnc_setlocale (int category, gchar *locale)
               "if a suffix is needed it's in the suffixes array.");
     g_assert_not_reached ();
 }
-/* timespec_normalize
-static void
-timespec_normalize(Timespec *t)// Local: 2:0:0
-*/
-static void
-test_timespec_normalize (void)
-{
-    const int offset = 4396432;
-    const int factor = 2;
-    int base = 50;
-    Timespec t = { base, factor * NANOS_PER_SECOND + offset };
-    Testfuncs *tf = gnc_date_load_funcs ();
-
-    tf->timespec_normalize (&t);
-    g_assert_cmpint (t.tv_sec, ==, base + factor);
-    g_assert_cmpint (t.tv_nsec, ==, offset);
-
-    t.tv_sec = base;
-    t.tv_nsec = - factor * NANOS_PER_SECOND - offset;
-    tf->timespec_normalize (&t);
-    g_assert_cmpint (t.tv_sec, ==, base - factor - 1);
-    g_assert_cmpint (t.tv_nsec, ==, NANOS_PER_SECOND - offset);
-
-    t.tv_sec = - base;
-    t.tv_nsec = factor * NANOS_PER_SECOND + offset;
-    tf->timespec_normalize (&t);
-    g_assert_cmpint (t.tv_sec, ==, - base + factor + 1);
-    g_assert_cmpint (t.tv_nsec, ==, - NANOS_PER_SECOND + offset);
-
-    t.tv_sec = - base;
-    t.tv_nsec = - factor * NANOS_PER_SECOND - offset;
-    tf->timespec_normalize (&t);
-    g_assert_cmpint (t.tv_sec, ==, - base - factor);
-    g_assert_cmpint (t.tv_nsec, ==, - offset);
-
-    g_slice_free (Testfuncs, tf);
-}
-
-
-/* timespec_equal
-gboolean
-timespec_equal (const Timespec *ta, const Timespec *tb)// C: 19 in 8  Local: 0:0:0
-*/
-static void
-test_timespec_equal (void)
-{
-    const int sec_per_day = 24 * 3600;
-    const int sec_per_mo = 30 * sec_per_day;
-    const time64 sec_per_yr = 365 * sec_per_day;
-    const int nsec1 = 439652, nsec2 = 132794892, nsec3 = 1132794892;
-    const time64 secs1 = 23 * sec_per_yr + 5 * sec_per_mo + 11 * sec_per_day;
-    const time64 secs2 = 21 * sec_per_yr + 11 * sec_per_mo + 19 * sec_per_day;
-    const time64 secs3 = 72 * sec_per_yr + 2 * sec_per_mo + 26 * sec_per_day;
-    Timespec ta = { secs1, nsec1 };
-    Timespec tb = { secs2, nsec2 };
-    Timespec tc = { secs1, nsec1 };
-    Timespec td = { secs3, nsec1 };
-    Timespec te = { secs1, nsec2 };
-    Timespec tf = { secs2 - 1, nsec3 }; /* When normalized, equal to tb */
-
-    g_assert (timespec_equal (&ta, &ta));
-    g_assert (timespec_equal (&ta, &tc));
-    g_assert (!timespec_equal (&ta, &tb));
-    g_assert (!timespec_equal (&ta, &td));
-    g_assert (!timespec_equal (&ta, &te));
-    g_assert (timespec_equal (&tb, &tf));
-}
-/* timespec_cmp
-gint
-timespec_cmp(const Timespec *ta, const Timespec *tb)// C: 28 in 11  Local: 0:0:0
-*/
-static void
-test_timespec_cmp (void)
-{
-    const int sec_per_day = 24 * 3600;
-    const int sec_per_mo = 30 * sec_per_day;
-    const time64 sec_per_yr = 365 * sec_per_day;
-    const int nsec1 = 439652, nsec2 = 132794892, nsec3 = 1132794892;
-    const time64 secs1 = 23 * sec_per_yr + 5 * sec_per_mo + 11 * sec_per_day;
-    const time64 secs2 = 21 * sec_per_yr + 11 * sec_per_mo + 19 * sec_per_day;
-    const time64 secs3 = 72 * sec_per_yr + 2 * sec_per_mo + 26 * sec_per_day;
-    Timespec ta = { secs1, nsec1 };
-    Timespec tb = { secs2, nsec2 };
-    Timespec tc = { secs1, nsec1 };
-    Timespec td = { secs3, nsec1 };
-    Timespec te = { secs1, nsec2 };
-    Timespec tf = { secs2 - 1, nsec3 }; /* When normalized, equal to tb */
-    Timespec tg = { -secs2, nsec2 };
-    Timespec th = { secs1, -nsec1 };
-
-    g_assert_cmpint (timespec_cmp (&ta, &ta), ==, 0);
-    g_assert_cmpint (timespec_cmp (&ta, &tc), ==, 0);
-    g_assert_cmpint (timespec_cmp (&tf, &tb), ==, 0);
-    g_assert_cmpint (timespec_cmp (&ta, &tb), ==, 1);
-    g_assert_cmpint (timespec_cmp (&te, &ta), ==, 1);
-    g_assert_cmpint (timespec_cmp (&td, &ta), ==, 1);
-    g_assert_cmpint (timespec_cmp (&ta, &te), ==, -1);
-    g_assert_cmpint (timespec_cmp (&ta, &tg), ==, 1);
-    g_assert_cmpint (timespec_cmp (&th, &ta), ==, -1);
-
-}
-/* timespec_diff
-Timespec
-timespec_diff(const Timespec *ta, const Timespec *tb)// C: 4 in 1  Local: 0:0:0
-*/
-static void
-test_timespec_diff (void)
-{
-    const gint sec_per_day = 24 * 3600;
-    const gint sec_per_mo = 30 * sec_per_day;
-    const time64 sec_per_yr = 365 * sec_per_day;
-    const time64 nsec1 = 439652, nsec2 = 132794892, nsec3 = 1132794892;
-    const time64 secs1 = 23 * sec_per_yr + 5 * sec_per_mo + 11 * sec_per_day;
-    const time64 secs2 = 21 * sec_per_yr + 11 * sec_per_mo + 19 * sec_per_day;
-    const time64 secs3 = 72 * sec_per_yr + 2 * sec_per_mo + 26 * sec_per_day;
-    Timespec ta = { secs1, nsec1 };
-    Timespec tb = { secs2, nsec2 };
-    Timespec td = { secs3, nsec1 };
-    Timespec te = { secs1, nsec2 };
-    Timespec tf = { secs2 - 1, nsec3 }; /* When normalized, equal to tb */
-    Timespec tg = { -secs2, nsec2 };
-    Timespec th = { secs1, -nsec3 };
-
-    Timespec tt = timespec_diff (&ta, &ta);
-
-    g_assert_cmpint (tt.tv_sec, ==, 0);
-    g_assert_cmpint (tt.tv_nsec, ==, 0);
-
-    tt = timespec_diff (&ta, &tb);
-    g_assert_cmpint (tt.tv_sec, ==, secs1 - secs2 - 1);
-    g_assert_cmpint (tt.tv_nsec, ==, nsec1 - nsec2 + NANOS_PER_SECOND);
-
-    tt = timespec_diff (&ta, &te);
-    g_assert_cmpint (tt.tv_sec, ==, 0);
-    g_assert_cmpint (tt.tv_nsec, ==, nsec1 - nsec2);
-
-    tt = timespec_diff (&tb, &tf);
-    g_assert_cmpint (tt.tv_sec, ==, 0);
-    g_assert_cmpint (tt.tv_nsec, ==, 0);
-
-    tt = timespec_diff (&tf, &th);
-    if (sizeof (glong) > 4)
-    {
-        glong nsec_diff_norm = 2 * nsec3 - 2 * NANOS_PER_SECOND - NANOS_PER_SECOND;
-        g_assert_cmpint (tt.tv_sec, ==, secs2 - secs1 + 2);
-        g_assert_cmpint (tt.tv_nsec, ==,  nsec_diff_norm);
-    }
-    else
-    {
-        g_assert_cmpint (tt.tv_sec, ==, secs2 - secs1 - 3);
-        g_assert_cmpint (tt.tv_nsec, <, 0); /* Overflow nanosecs */
-    }
-    tt = timespec_diff (&tg, &td);
-    g_assert_cmpint (tt.tv_sec, ==, -secs2 - secs3 + 1);
-    g_assert_cmpint (tt.tv_nsec, ==, nsec2 - nsec1 - NANOS_PER_SECOND);
-
-}
-/* timespec_abs
-Timespec
-timespec_abs(const Timespec *t)// C: 4 in 1  Local: 0:0:0
-*/
-static void
-test_timespec_abs (void)
-{
-    const int sec_per_day = 24 * 3600;
-    const int sec_per_mo = 30 * sec_per_day;
-    const int sec_per_yr = 365 * sec_per_day;
-    const int nsec1 = 439652, nsec2 = 132794892, nsec3 = 1132794892;
-    const time64 secs1 = 23 * sec_per_yr + 5 * sec_per_mo + 11 * sec_per_day;
-    const time64 secs2 = 21 * sec_per_yr + 11 * sec_per_mo + 19 * sec_per_day;
-    Timespec ta = { secs1, nsec1 };
-    Timespec tf = { secs2 - 1, nsec3 }; /* When normalized, equal to tb */
-    Timespec tg = { -secs2, nsec2 };
-    Timespec th = { secs1, -nsec1 };
-
-    Timespec tt = timespec_abs (&ta);
-    g_assert_cmpint (tt.tv_sec, ==, secs1);
-    g_assert_cmpint (tt.tv_nsec, ==, nsec1);
-
-    tt = timespec_abs (&tf);
-    g_assert_cmpint (tt.tv_sec, ==, secs2);
-    g_assert_cmpint (tt.tv_nsec, ==, nsec2);
-
-    tt = timespec_abs (&tg);
-    g_assert_cmpint (tt.tv_sec, ==, secs2 - 1);
-    g_assert_cmpint (tt.tv_nsec, ==, NANOS_PER_SECOND - nsec2);
-
-    tt = timespec_abs (&th);
-    g_assert_cmpint (tt.tv_sec, ==, secs1 - 1);
-    g_assert_cmpint (tt.tv_nsec, ==, NANOS_PER_SECOND - nsec1);
-
-}
 /* timespecCanonicalDayTime
-Timespec
-timespecCanonicalDayTime(Timespec t)// C: 12 in 5 SCM: 19 in 10 Local: 0:0:0
+time64
+time64CanonicalDayTime(time64 t)// C: 12 in 5 SCM: 19 in 10 Local: 0:0:0
 */
-static Timespec
-compute_noon_of_day (Timespec *ts)
-{
-    Timespec nt = {0, 0};
-    time_t secs = (time_t)ts->tv_sec;
-    struct tm *time = localtime(&secs);
-    time->tm_hour = 12;
-    time->tm_min = 0;
-    time->tm_sec = 0;
-    nt.tv_sec = mktime(time);
-    return nt;
+static time64
+compute_noon_of_day (const time64 *t)
+{
+    struct tm time;
+    gnc_localtime_r(t, &time);
+    time.tm_hour = 12;
+    time.tm_min = 0;
+    time.tm_sec = 0;
+    return gnc_mktime(&time);
 }
 
 static void
-test_timespecCanonicalDayTime (void)
+test_time64CanonicalDayTime (void)
 {
     const int sec_per_day = 24 * 3600;
     const int sec_per_mo = 30 * sec_per_day;
@@ -713,21 +519,17 @@ test_timespecCanonicalDayTime (void)
     const time64 secs2 = 21 * sec_per_yr + 11 * sec_per_mo +
         19 * sec_per_day + 21 * 3600 + 9 * 60 + 48; /* 1991-11-19 21:09:48 Z */
 
-    Timespec t0 = { secs, 0 };
-    Timespec ta = { secs1, 0 };
-    Timespec tb = { secs2, 0 };
+    time64 n0 = compute_noon_of_day (&secs);
+    time64 na = compute_noon_of_day (&secs1);
+    time64 nb = compute_noon_of_day (&secs2);
 
-    Timespec n0 = compute_noon_of_day (&t0);
-    Timespec na = compute_noon_of_day (&ta);
-    Timespec nb = compute_noon_of_day (&tb);
+    time64 r0 = time64CanonicalDayTime (secs);
+    time64 ra = time64CanonicalDayTime (secs1);
+    time64 rb = time64CanonicalDayTime (secs2);
 
-    Timespec r0 = timespecCanonicalDayTime (t0);
-    Timespec ra = timespecCanonicalDayTime (ta);
-    Timespec rb = timespecCanonicalDayTime (tb);
-
-    g_assert_cmpint (n0.tv_sec, ==, r0.tv_sec);
-    g_assert_cmpint (na.tv_sec, ==, ra.tv_sec);
-    g_assert_cmpint (nb.tv_sec, ==, rb.tv_sec);
+    g_assert_cmpint (n0, ==, r0);
+    g_assert_cmpint (na, ==, ra);
+    g_assert_cmpint (nb, ==, rb);
 
 }
 
@@ -1339,74 +1141,6 @@ test_qof_print_date (void)
     setlocale (LC_TIME, locale);
     g_free (locale);
 }
-/* gnc_print_date
-const char *
-gnc_print_date (Timespec ts)// C: 11 in 9 SCM: 166 in 59 Local: 0:0:0
-*/
-static void
-test_gnc_print_date (void)
-{
-    gchar t_buff[MAX_DATE_LENGTH];
-    gchar *locale = g_strdup (setlocale (LC_TIME, NULL));
-    GDate *gd1 = g_date_new_dmy (23, 11, 1974);
-    GDate *gd2 = g_date_new_dmy (2, 2, 1961);
-    GDate *gd3 = g_date_new_dmy (16, 6, 2045);
-    Timespec tm1 = gdate_to_timespec (*gd1);
-    Timespec tm2 = gdate_to_timespec (*gd2);
-    Timespec tm3 = gdate_to_timespec (*gd3);
-
-
-    qof_date_format_set (QOF_DATE_FORMAT_UK);
-    g_assert_cmpstr (gnc_print_date (tm1), ==, "23/11/1974");
-    g_assert_cmpstr (gnc_print_date (tm2), ==, "02/02/1961");
-    g_assert_cmpstr (gnc_print_date (tm3), ==, "16/06/2045");
-
-    qof_date_format_set (QOF_DATE_FORMAT_CE);
-    g_assert_cmpstr (gnc_print_date (tm1), ==, "23.11.1974");
-    g_assert_cmpstr (gnc_print_date (tm2), ==, "02.02.1961");
-    g_assert_cmpstr (gnc_print_date (tm3), ==, "16.06.2045");
-
-    qof_date_format_set (QOF_DATE_FORMAT_US);
-    g_assert_cmpstr (gnc_print_date (tm1), ==, "11/23/1974");
-    g_assert_cmpstr (gnc_print_date (tm2), ==, "02/02/1961");
-    g_assert_cmpstr (gnc_print_date (tm3), ==, "06/16/2045");
-
-    qof_date_format_set (QOF_DATE_FORMAT_ISO);
-    g_assert_cmpstr (gnc_print_date (tm1), ==, "1974-11-23");
-    g_assert_cmpstr (gnc_print_date (tm2), ==, "1961-02-02");
-    g_assert_cmpstr (gnc_print_date (tm3), ==, "2045-06-16");
-
-    qof_date_format_set (QOF_DATE_FORMAT_LOCALE);
-    test_gnc_setlocale (LC_TIME, "en_US");
-    g_date_strftime (t_buff, MAX_DATE_LENGTH, GNC_D_FMT, gd1);
-    g_assert_cmpstr (gnc_print_date (tm1), ==, t_buff);
-    g_date_strftime (t_buff, MAX_DATE_LENGTH, GNC_D_FMT, gd2);
-    g_assert_cmpstr (gnc_print_date (tm2), ==, t_buff);
-    g_date_strftime (t_buff, MAX_DATE_LENGTH, GNC_D_FMT, gd3);
-    g_assert_cmpstr (gnc_print_date (tm3), ==, t_buff);
-
-    test_gnc_setlocale (LC_TIME, "en_GB");
-    g_date_strftime (t_buff, MAX_DATE_LENGTH, GNC_D_FMT, gd1);
-    g_assert_cmpstr (gnc_print_date (tm1), ==, t_buff);
-    g_date_strftime (t_buff, MAX_DATE_LENGTH, GNC_D_FMT, gd2);
-    g_assert_cmpstr (gnc_print_date (tm2), ==, t_buff);
-    g_date_strftime (t_buff, MAX_DATE_LENGTH, GNC_D_FMT, gd3);
-    g_assert_cmpstr (gnc_print_date (tm3), ==, t_buff);
-
-    test_gnc_setlocale (LC_TIME, "fr_FR");
-    g_date_strftime (t_buff, MAX_DATE_LENGTH, GNC_D_FMT, gd1);
-    g_assert_cmpstr (gnc_print_date (tm1), ==, t_buff);
-    g_date_strftime (t_buff, MAX_DATE_LENGTH, GNC_D_FMT, gd2);
-    g_assert_cmpstr (gnc_print_date (tm2), ==, t_buff);
-    g_date_strftime (t_buff, MAX_DATE_LENGTH, GNC_D_FMT, gd3);
-    g_assert_cmpstr (gnc_print_date (tm3), ==, t_buff);
-
-    setlocale (LC_TIME, locale);
-    g_free (locale);
-    g_date_free (gd1);
-    g_date_free (gd2);
-    g_date_free (gd3);
-}
 /* floordiv
 static int
 floordiv(int a, int b)// Local: 1:0:0
@@ -1622,9 +1356,9 @@ test_gnc_date_timestamp (void)
 
     g_free (timestr);
 }
-/* gnc_iso8601_to_timespec_gmt
-Timespec
-gnc_iso8601_to_timespec_gmt(const char *str)// C: 6 in 3  Local: 0:0:0
+/* gnc_iso8601_to_time64_gmt
+time64
+gnc_iso8601_to_time64_gmt(const char *str)// C: 6 in 3  Local: 0:0:0
 */
 static gint
 get_nanoseconds (GDateTime *gdt)
@@ -1642,44 +1376,43 @@ test_gnc_iso8601_to_time64_gmt (FixtureA *f, gconstpointer pData)
     g_assert_cmpint (t, ==, 0);
 
     t = gnc_iso8601_to_time64_gmt ("1989-03-27 13:43:27");
-    g_assert_cmpint (t, ==, f->ts1.tv_sec);
+    g_assert_cmpint (t, ==, f->t1);
 
     t = gnc_iso8601_to_time64_gmt ("2020-11-07 06:21:19 -05");
-    g_assert_cmpint (t, ==, f->ts2.tv_sec);
+    g_assert_cmpint (t, ==, f->t2);
 
     t = gnc_iso8601_to_time64_gmt ("2012-07-04 19:27:44.0+08:40");
-    g_assert_cmpint (t, ==, f->ts3.tv_sec);
+    g_assert_cmpint (t, ==, f->t3);
 
     t = gnc_iso8601_to_time64_gmt ("1961-09-22 17:53:19 -05");
-    g_assert_cmpint (t, ==, f->ts4.tv_sec);
+    g_assert_cmpint (t, ==, f->t4);
 
     t = gnc_iso8601_to_time64_gmt ("2061-01-25 23:21:19.0 -05:00");
-    g_assert_cmpint (t, ==, f->ts5.tv_sec);
+    g_assert_cmpint (t, ==, f->t5);
 }
-/* gnc_timespec_to_iso8601_buff
+/* gnc_time64_to_iso8601_buff
 char *
-gnc_timespec_to_iso8601_buff (Timespec ts, char * buff)// C: 18 in 7  Local: 0:0:0
+gnc_time64_to_iso8601_buff (time64 t, char * buff)// C: 18 in 7  Local: 0:0:0
 */
-static Timespec
-g_date_time_to_timespec (GDateTime *gdt)
+static time64
+g_date_time_to_time64 (GDateTime *gdt)
 {
-    Timespec t;
-    t.tv_sec = g_date_time_to_unix (gdt);
-    t.tv_nsec = g_date_time_get_microsecond (gdt) * 1000;
+    time64 t;
+    t = g_date_time_to_unix (gdt);
     return t;
 }
 
 #define ISO8601_SIZE MAX_DATE_LENGTH + 4
 static gchar*
-format_timestring (Timespec ts, TZOffset tz)
+format_timestring (time64 t, TZOffset tz)
 {
-  static const unsigned tzlen = MAX_DATE_LENGTH - 26;
-    char *fmt = "%Y-%m-%d %H:%M:%S";
+    static const unsigned tzlen = MAX_DATE_LENGTH - 26;
+    char *fmt = "%Y-%m-%d %H:%M:%S %z";
     struct tm tm;
-    char buf[MAX_DATE_LENGTH], *retval;
+    char buf[MAX_DATE_LENGTH + 1];
     char tzbuf[tzlen];
     memset(tzbuf, 0, sizeof(tzbuf));
-    gnc_localtime_r(&ts.tv_sec, &tm);
+    gnc_localtime_r(&t, &tm);
 #if PLATFORM(WINDOWS)
     strftime(tzbuf, sizeof(tzbuf), "%Z", &tm);
 #else
@@ -1687,74 +1420,73 @@ format_timestring (Timespec ts, TZOffset tz)
 #endif
     memset (buf, 0, sizeof(buf));
     strftime(buf, sizeof(buf), fmt, &tm);
-    retval = g_strdup_printf ("%s.%06ld %s", buf, ts.tv_nsec / 1000, tzbuf);
 
-    return retval;
+    return g_strdup(buf);
 }
 
 static void
-test_gnc_timespec_to_iso8601_buff (FixtureA *f, gconstpointer pData)
+test_gnc_time64_to_iso8601_buff (FixtureA *f, gconstpointer pData)
 {
 
     gchar buff[ISO8601_SIZE];
     gchar *time_str;
-    Timespec t = { 0, 0 };
+    time64 t = 0;
     gchar *end;
 
     memset (buff, 0, sizeof buff);
 
-    end = gnc_timespec_to_iso8601_buff (t, NULL);
+    end = gnc_time64_to_iso8601_buff (t, NULL);
     g_assert (end == NULL);
 
-    end = gnc_timespec_to_iso8601_buff (f->ts0, buff);
+    end = gnc_time64_to_iso8601_buff (f->t0, buff);
     g_assert_cmpint (end - buff, ==, strlen (buff));
-    time_str = format_timestring (f->ts0, f->off_zulu);
+    time_str = format_timestring (f->t0, f->off_zulu);
     g_assert_cmpstr (buff, ==, time_str);
     g_free (time_str);
 
-    end = gnc_timespec_to_iso8601_buff (f->ts1, buff);
-    time_str = format_timestring (f->ts1, f->off_zulu);
+    end = gnc_time64_to_iso8601_buff (f->t1, buff);
+    time_str = format_timestring (f->t1, f->off_zulu);
     g_assert_cmpstr (buff, ==, time_str);
     g_free (time_str);
 
 
-    end = gnc_timespec_to_iso8601_buff (f->ts2, buff);
-    time_str = format_timestring (f->ts2, f->off_05w);
+    end = gnc_time64_to_iso8601_buff (f->t2, buff);
+    time_str = format_timestring (f->t2, f->off_05w);
     g_assert_cmpstr (buff, ==, time_str);
     g_free (time_str);
 
-    end = gnc_timespec_to_iso8601_buff (f->ts3, buff);
-    time_str = format_timestring (f->ts3, f->off_0840e);
+    end = gnc_time64_to_iso8601_buff (f->t3, buff);
+    time_str = format_timestring (f->t3, f->off_0840e);
     g_assert_cmpstr (buff, ==, time_str);
     g_free (time_str);
 
-    end = gnc_timespec_to_iso8601_buff (f->ts4, buff);
-    time_str = format_timestring (f->ts4, f->off_05w);
+    end = gnc_time64_to_iso8601_buff (f->t4, buff);
+    time_str = format_timestring (f->t4, f->off_05w);
     g_assert_cmpstr (buff, ==, time_str);
     g_free (time_str);
 
-    end = gnc_timespec_to_iso8601_buff (f->ts5, buff);
-    time_str = format_timestring (f->ts5, f->off_05w);
+    end = gnc_time64_to_iso8601_buff (f->t5, buff);
+    time_str = format_timestring (f->t5, f->off_05w);
     g_assert_cmpstr (buff, ==, time_str);
     g_free (time_str);
 }
 
-/* gnc_dmy2timespec_internal
-static Timespec
-gnc_dmy2timespec_internal (int day, int month, int year, gboolean start_of_day)// Local: 2:0:0
+/* gnc_dmy2time64_internal
+static time64
+gnc_dmy2time64_internal (int day, int month, int year, gboolean start_of_day)// Local: 2:0:0
 */
 /* static void
-test_gnc_dmy2timespec_internal (void)
+test_gnc_dmy2time64_internal (void)
 {
 }*/
-/* gnc_dmy2timespec
-Timespec
-gnc_dmy2timespec (int day, int month, int year)// C: 8 in 5  Local: 1:0:0
+/* gnc_dmy2time64
+time64
+gnc_dmy2time64 (int day, int month, int year)// C: 8 in 5  Local: 1:0:0
 */
 static void
-test_gnc_dmy2timespec (FixtureB *f, gconstpointer pData)
+test_gnc_dmy2time64 (FixtureB *f, gconstpointer pData)
 {
-    gchar *msg1 = "[qof_dmy2timespec()] Date computation error from Y-M-D 1257-7-2: Time value is outside the supported year range.";
+    gchar *msg1 = "[qof_dmy2time64()] Date computation error from Y-M-D 1257-7-2: Time value is outside the supported year range.";
     gint loglevel = G_LOG_LEVEL_WARNING | G_LOG_FLAG_FATAL;
     gchar *logdomain = "qof.engine";
     TestErrorStruct check = {loglevel, logdomain, msg1, 0};
@@ -1769,27 +1501,27 @@ test_gnc_dmy2timespec (FixtureB *f, gconstpointer pData)
         struct tm tm = {0, 0, 0, f->test[i].day, f->test[i].mon - 1,
                         f->test[i].yr - 1900, 0, 0, -1};
 #endif
-        Timespec r_t = gnc_dmy2timespec (f->test[i].day, f->test[i].mon,
+        time64 r_t = gnc_dmy2time64 (f->test[i].day, f->test[i].mon,
                                          f->test[i].yr);
         struct tm time1 = tm, time2 = tm;
         int offset = gnc_mktime(&time1) - gnc_timegm(&time2);
         if (f->test[i].secs == INT64_MAX)
-            /* We use INT64_MAX as invalid timespec.secs.
+            /* We use INT64_MAX as invalid time64.secs.
              * As we can't *add* to the max, we can ignore the tz offset in this case. */
-            g_assert_cmpint (r_t.tv_sec, ==, INT64_MAX);
+            g_assert_cmpint (r_t, ==, INT64_MAX);
         else
-            g_assert_cmpint (r_t.tv_sec, ==, f->test[i].secs - offset);
+            g_assert_cmpint (r_t, ==, f->test[i].secs - offset);
     }
     g_log_set_default_handler (hdlr, 0);
 }
-/* gnc_dmy2timespec_end
-Timespec
-gnc_dmy2timespec_end (int day, int month, int year)// C: 1  Local: 0:0:0
+/* gnc_dmy2time64_end
+time64
+gnc_dmy2time64_end (int day, int month, int year)// C: 1  Local: 0:0:0
 */
 static void
-test_gnc_dmy2timespec_end (FixtureB *f, gconstpointer pData)
+test_gnc_dmy2time64_end (FixtureB *f, gconstpointer pData)
 {
-    gchar *msg1 = "[qof_dmy2timespec_end()] Date computation error from Y-M-D 1257-7-2: Time value is outside the supported year range.";
+    gchar *msg1 = "[qof_dmy2time64_end()] Date computation error from Y-M-D 1257-7-2: Time value is outside the supported year range.";
     gint loglevel = G_LOG_LEVEL_CRITICAL | G_LOG_FLAG_FATAL;
     gchar *logdomain = "qof.engine";
     TestErrorStruct check = {loglevel, logdomain, msg1, 0};
@@ -1804,15 +1536,15 @@ test_gnc_dmy2timespec_end (FixtureB *f, gconstpointer pData)
         struct tm tm = {59, 59, 23, f->test[i].day, f->test[i].mon - 1,
                         f->test[i].yr - 1900, 0, 0, -1};
 #endif
-        Timespec r_t = gnc_dmy2timespec_end (f->test[i].day, f->test[i].mon,
+        time64 r_t = gnc_dmy2time64_end (f->test[i].day, f->test[i].mon,
                                              f->test[i].yr);
         int offset = gnc_mktime(&tm) - gnc_timegm(&tm);
         if (f->test[i].secs == INT64_MAX)
-            /* We use INT64_MAX as invalid timespec.secs.
+            /* We use INT64_MAX as invalid time64.secs.
              * As we can't *add* to the max, we can ignore the tz offset in this case. */
-            g_assert_cmpint (r_t.tv_sec, ==, INT64_MAX);
+            g_assert_cmpint (r_t, ==, INT64_MAX);
         else
-            g_assert_cmpint (r_t.tv_sec, ==, f->test[i].secs - offset);
+            g_assert_cmpint (r_t, ==, f->test[i].secs - offset);
     }
     g_log_set_default_handler (hdlr, 0);
 }
@@ -1833,18 +1565,18 @@ offset_adjust(GDateTime *gdt)
      return new_gdt;
 }
 
-/*gnc_dmy2timespec_neutral*/
+/*gnc_dmy2time64_neutral*/
 static void
-test_gnc_dmy2timespec_neutral (FixtureB *f, gconstpointer pData)
+test_gnc_dmy2time64_neutral (FixtureB *f, gconstpointer pData)
 {
-    gchar *msg1 = "[qof_dmy2timespec_neutral()] Date computation error from Y-M-D 1257-7-2: Time value is outside the supported year range.";
+    gchar *msg1 = "[qof_dmy2time64_neutral()] Date computation error from Y-M-D 1257-7-2: Time value is outside the supported year range.";
     gint loglevel = G_LOG_LEVEL_CRITICAL | G_LOG_FLAG_FATAL;
     gchar *logdomain = "qof.engine";
     TestErrorStruct check = {loglevel, logdomain, msg1, 0};
     GLogFunc hdlr = g_log_set_default_handler ((GLogFunc)test_null_handler, &check);
     struct tm check_tz;
     gnc_localtime_r(&(f->test[0].secs), &check_tz);
-    /* gnc_dmy2timespec_neutral returns the timespec for 10:59:00 Z
+    /* gnc_dmy2time64_neutral returns the time64 for 10:59:00 Z
      * for timezones in the range -11 to +13. If the timezone being
      * tested is outside that range then the day of the month will be
      * different from the one in the test fixture and we skip the
@@ -1855,10 +1587,10 @@ test_gnc_dmy2timespec_neutral (FixtureB *f, gconstpointer pData)
          g_test_log_set_fatal_handler ((GTestLogFatalFunc)test_checked_handler, &check);
          for (int i = 0; i < sizeof(f->test)/sizeof(TimeMap); ++i)
          {
-              Timespec r_t = gnc_dmy2timespec_neutral (f->test[i].day, f->test[i].mon,
+              time64 r_t = gnc_dmy2time64_neutral (f->test[i].day, f->test[i].mon,
                                                        f->test[i].yr);
 
-              g_assert_cmpint (r_t.tv_sec, ==, f->test[i].secs);
+              g_assert_cmpint (r_t, ==, f->test[i].secs);
          }
     }
     g_log_set_default_handler (hdlr, 0);
@@ -1872,83 +1604,59 @@ gnc_timezone (const struct tm *tm)// C: 5 in 2  Local: 2:0:0
 test_gnc_timezone (void)
 {
 }*/
-/* timespecFromtime64
-void
-timespecFromtime64( Timespec *ts, time64 t )// C: 22 in 11  Local: 0:0:0
-*/
-/* static void
-test_timespecFromtime64 (void)
-{
-}*/
-/* timespec_now
-Timespec
-timespec_now()// C: 2 in 2  Local: 0:0:0
-*/
-/* static void
-test_timespec_now (void)
-{
-}*/
-/* timespecTotime64
-time64
-timespecTotime64 (Timespec ts)// C: 10 in 6  Local: 1:0:0
-*/
-/* static void
-test_timespecTotime64 (void)
-{
-}*/
-/* timespec_to_gdate
-GDate timespec_to_gdate (Timespec ts)// C: 5 in 4  Local: 0:0:0
+/* time64_to_gdate
+GDate time64_to_gdate (time64 t)// C: 5 in 4  Local: 0:0:0
 */
 static void
-test_timespec_to_gdate (FixtureA *f, gconstpointer pData)
+test_time64_to_gdate (FixtureA *f, gconstpointer pData)
 {
     GDate date1, date2;
     struct tm tm;
 
     g_date_clear (&date2, 1);
 
-    date1 = timespec_to_gdate (f->ts0);
-    gnc_localtime_r(&f->ts0.tv_sec, &tm);
+    date1 = time64_to_gdate (f->t0);
+    gnc_localtime_r(&f->t0, &tm);
     g_date_set_dmy (&date2, tm.tm_mday, tm.tm_mon + 1, tm.tm_year + 1900);
     g_assert_cmpint (g_date_get_julian (&date1), ==,
                      g_date_get_julian (&date2));
 
-    date1 = timespec_to_gdate (f->ts1);
-    gnc_localtime_r(&f->ts1.tv_sec, &tm);
+    date1 = time64_to_gdate (f->t1);
+    gnc_localtime_r(&f->t1, &tm);
     g_date_set_dmy (&date2, tm.tm_mday, tm.tm_mon + 1, tm.tm_year + 1900);
     g_assert_cmpint (g_date_get_julian (&date1), ==,
                      g_date_get_julian (&date2));
 
-    date1 = timespec_to_gdate (f->ts2);
-    gnc_localtime_r(&f->ts2.tv_sec, &tm);
+    date1 = time64_to_gdate (f->t2);
+    gnc_localtime_r(&f->t2, &tm);
     g_date_set_dmy (&date2, tm.tm_mday, tm.tm_mon + 1, tm.tm_year + 1900);
     g_assert_cmpint (g_date_get_julian (&date1), ==,
                      g_date_get_julian (&date2));
 
-    date1 = timespec_to_gdate (f->ts3);
-    gnc_localtime_r(&f->ts3.tv_sec, &tm);
+    date1 = time64_to_gdate (f->t3);
+    gnc_localtime_r(&f->t3, &tm);
     g_date_set_dmy (&date2, tm.tm_mday, tm.tm_mon + 1, tm.tm_year + 1900);
     g_assert_cmpint (g_date_get_julian (&date1), ==,
                      g_date_get_julian (&date2));
 
-    date1 = timespec_to_gdate (f->ts4);
-    gnc_localtime_r(&f->ts4.tv_sec, &tm);
+    date1 = time64_to_gdate (f->t4);
+    gnc_localtime_r(&f->t4, &tm);
     g_date_set_dmy (&date2, tm.tm_mday, tm.tm_mon + 1, tm.tm_year + 1900);
     g_assert_cmpint (g_date_get_julian (&date1), ==,
                      g_date_get_julian (&date2));
 
-    date1 = timespec_to_gdate (f->ts5);
-    gnc_localtime_r(&f->ts5.tv_sec, &tm);
+    date1 = time64_to_gdate (f->t5);
+    gnc_localtime_r(&f->t5, &tm);
     g_date_set_dmy (&date2, tm.tm_mday, tm.tm_mon + 1, tm.tm_year + 1900);
     g_assert_cmpint (g_date_get_julian (&date1), ==,
                      g_date_get_julian (&date2));
 }
 
-/* gdate_to_timespec
-Timespec gdate_to_timespec (GDate d)// C: 7 in 6  Local: 0:0:0
+/* gdate_to_time64
+time64 gdate_to_time64 (GDate d)// C: 7 in 6  Local: 0:0:0
 */
 static void
-test_gdate_to_timespec (FixtureB *f, gconstpointer pData)
+test_gdate_to_time64 (FixtureB *f, gconstpointer pData)
 {
 
     gchar *msg = "g_date_set_dmy: assertion 'g_date_valid_dmy (day, m, y)' failed";
@@ -1958,7 +1666,7 @@ test_gdate_to_timespec (FixtureB *f, gconstpointer pData)
     GLogFunc hdlr = g_log_set_default_handler ((GLogFunc)test_null_handler, &check);
     struct tm check_tz;
     gnc_localtime_r(&(f->test[0].secs), &check_tz);
-    /* gdate_to_timespec returns the timespec for 10:59:00 Z
+    /* gdate_to_time64 returns the time64 for 10:59:00 Z
      * for timezones in the range -11 to +13. If the timezone being
      * tested is outside that range then the day of the month will be
      * different from the one in the test fixture and we skip the
@@ -1970,15 +1678,15 @@ test_gdate_to_timespec (FixtureB *f, gconstpointer pData)
          for (int i = 0; i < sizeof(f->test)/sizeof(TimeMap); ++i)
          {
               GDate gd, gd2;
-              Timespec r_t;
+              time64 r_t;
               g_date_clear(&gd, 1);
               g_date_clear(&gd2, 1);
               g_date_set_dmy(&gd, f->test[i].day, f->test[i].mon, f->test[i].yr);
-              r_t = gdate_to_timespec(gd);
-              g_assert_cmpint (r_t.tv_sec, ==, f->test[i].secs);
+              r_t = gdate_to_time64(gd);
+              g_assert_cmpint (r_t, ==, f->test[i].secs);
               if (f->test[i].secs < INT64_MAX)
               {
-                   gd2 = timespec_to_gdate(r_t);
+                   gd2 = time64_to_gdate(r_t);
                    g_assert (g_date_compare (&gd2, &gd) == 0);
               }
          }
@@ -2020,40 +1728,40 @@ test_gnc_time64_get_day_start (FixtureA *f, gconstpointer pData)
     struct tm tm;
     time64 t_time, r_time;
 
-    gnc_localtime_r(&f->ts0.tv_sec, &tm);
+    gnc_localtime_r(&f->t0, &tm);
     tm_day_begin(&tm);
     t_time = gnc_mktime(&tm);
-    r_time = gnc_time64_get_day_start (f->ts0.tv_sec);
+    r_time = gnc_time64_get_day_start (f->t0);
     g_assert_cmpint (t_time, ==, r_time);
 
-    gnc_localtime_r(&f->ts1.tv_sec, &tm);
+    gnc_localtime_r(&f->t1, &tm);
     tm_day_begin(&tm);
     t_time = gnc_mktime(&tm);
-    r_time = gnc_time64_get_day_start (f->ts1.tv_sec);
+    r_time = gnc_time64_get_day_start (f->t1);
     g_assert_cmpint (t_time, ==, r_time);
 
-    gnc_localtime_r(&f->ts2.tv_sec, &tm);
+    gnc_localtime_r(&f->t2, &tm);
     tm_day_begin(&tm);
     t_time = gnc_mktime(&tm);
-    r_time = gnc_time64_get_day_start (f->ts2.tv_sec);
+    r_time = gnc_time64_get_day_start (f->t2);
     g_assert_cmpint (t_time, ==, r_time);
 
-    gnc_localtime_r(&f->ts3.tv_sec, &tm);
+    gnc_localtime_r(&f->t3, &tm);
     tm_day_begin(&tm);
     t_time = gnc_mktime(&tm);
-    r_time = gnc_time64_get_day_start (f->ts3.tv_sec);
+    r_time = gnc_time64_get_day_start (f->t3);
     g_assert_cmpint (t_time, ==, r_time);
 
-    gnc_localtime_r(&f->ts4.tv_sec, &tm);
+    gnc_localtime_r(&f->t4, &tm);
     tm_day_begin(&tm);
     t_time = gnc_mktime(&tm);
-    r_time = gnc_time64_get_day_start (f->ts4.tv_sec);
+    r_time = gnc_time64_get_day_start (f->t4);
     g_assert_cmpint (t_time, ==, r_time);
 
-    gnc_localtime_r(&f->ts5.tv_sec, &tm);
+    gnc_localtime_r(&f->t5, &tm);
     tm_day_begin(&tm);
     t_time = gnc_mktime(&tm);
-    r_time = gnc_time64_get_day_start (f->ts5.tv_sec);
+    r_time = gnc_time64_get_day_start (f->t5);
     g_assert_cmpint (t_time, ==, r_time);
 
  }
@@ -2075,40 +1783,40 @@ test_gnc_time64_get_day_end (FixtureA *f, gconstpointer pData)
     struct tm tm;
     time64 t_time, r_time;
 
-    gnc_localtime_r(&f->ts0.tv_sec, &tm);
+    gnc_localtime_r(&f->t0, &tm);
     tm_day_end(&tm);
     t_time = gnc_mktime(&tm);
-    r_time = gnc_time64_get_day_end (f->ts0.tv_sec);
+    r_time = gnc_time64_get_day_end (f->t0);
     g_assert_cmpint (t_time, ==, r_time);
 
-    gnc_localtime_r(&f->ts1.tv_sec, &tm);
+    gnc_localtime_r(&f->t1, &tm);
     tm_day_end(&tm);
     t_time = gnc_mktime(&tm);
-    r_time = gnc_time64_get_day_end (f->ts1.tv_sec);
+    r_time = gnc_time64_get_day_end (f->t1);
     g_assert_cmpint (t_time, ==, r_time);
 
-    gnc_localtime_r(&f->ts2.tv_sec, &tm);
+    gnc_localtime_r(&f->t2, &tm);
     tm_day_end(&tm);
     t_time = gnc_mktime(&tm);
-    r_time = gnc_time64_get_day_end (f->ts2.tv_sec);
+    r_time = gnc_time64_get_day_end (f->t2);
     g_assert_cmpint (t_time, ==, r_time);
 
-    gnc_localtime_r(&f->ts3.tv_sec, &tm);
+    gnc_localtime_r(&f->t3, &tm);
     tm_day_end(&tm);
     t_time = gnc_mktime(&tm);
-    r_time = gnc_time64_get_day_end (f->ts3.tv_sec);
+    r_time = gnc_time64_get_day_end (f->t3);
     g_assert_cmpint (t_time, ==, r_time);
 
-    gnc_localtime_r(&f->ts4.tv_sec, &tm);
+    gnc_localtime_r(&f->t4, &tm);
     tm_day_end(&tm);
     t_time = gnc_mktime(&tm);
-    r_time = gnc_time64_get_day_end (f->ts4.tv_sec);
+    r_time = gnc_time64_get_day_end (f->t4);
     g_assert_cmpint (t_time, ==, r_time);
 
-    gnc_localtime_r(&f->ts5.tv_sec, &tm);
+    gnc_localtime_r(&f->t5, &tm);
     tm_day_end(&tm);
     t_time = gnc_mktime(&tm);
-    r_time = gnc_time64_get_day_end (f->ts5.tv_sec);
+    r_time = gnc_time64_get_day_end (f->t5);
     g_assert_cmpint (t_time, ==, r_time);
 
 }
@@ -2149,26 +1857,26 @@ gnc_dow_abbrev(gchar *buf, int buf_len, int dow)// C: 4 in 2  Local: 0:0:0
 test_gnc_dow_abbrev (void)
 {
 }*/
-/* timespec_boxed_copy_func
+/* time64_boxed_copy_func
 static gpointer
-timespec_boxed_copy_func( gpointer in_timespec )// Local: 0:1:0
+time64_boxed_copy_func( gpointer in_time64 )// Local: 0:1:0
 */
 /* static void
-test_timespec_boxed_copy_func (void)
+test_time64_boxed_copy_func (void)
 {
 }*/
-/* timespec_boxed_free_func
+/* time64_boxed_free_func
 static void
-timespec_boxed_free_func( gpointer in_timespec )// Local: 0:1:0
+time64_boxed_free_func( gpointer in_time64 )// Local: 0:1:0
 */
 /* static void
-test_timespec_boxed_free_func (void)
+test_time64_boxed_free_func (void)
 {
 }*/
 // Not Used
-/* timespec_get_type
+/* time64_get_type
 GType
-timespec_get_type( void )// Local: 0:0:0
+time64_get_type( void )// Local: 0:0:0
 */
 
 
@@ -2187,12 +1895,7 @@ test_suite_gnc_date (void)
     GNC_TEST_ADD_FUNC (suitename, "gnc date string to dateformat", test_gnc_date_string_to_dateformat);
     GNC_TEST_ADD_FUNC (suitename, "gnc date monthformat to string", test_gnc_date_monthformat_to_string);
     GNC_TEST_ADD_FUNC (suitename, "gnc date string to monthformat", test_gnc_date_string_to_monthformat);
-    GNC_TEST_ADD_FUNC (suitename, "timespec normalize", test_timespec_normalize);
-    GNC_TEST_ADD_FUNC (suitename, "timespec equal", test_timespec_equal);
-    GNC_TEST_ADD_FUNC (suitename, "timespec cmp", test_timespec_cmp);
-    GNC_TEST_ADD_FUNC (suitename, "timespec diff", test_timespec_diff);
-    GNC_TEST_ADD_FUNC (suitename, "timespec abs", test_timespec_abs);
-    GNC_TEST_ADD_FUNC (suitename, "timespecCanonicalDayTime", test_timespecCanonicalDayTime);
+    GNC_TEST_ADD_FUNC (suitename, "time64CanonicalDayTime", test_time64CanonicalDayTime);
     GNC_TEST_ADD_FUNC (suitename, "date get last mday", test_gnc_date_get_last_mday);
     GNC_TEST_ADD_FUNC (suitename, "qof date format set", test_qof_date_format_set);
 // GNC_TEST_ADD_FUNC (suitename, "qof date completion set", test_qof_date_completion_set);
@@ -2200,7 +1903,6 @@ test_suite_gnc_date (void)
     GNC_TEST_ADD_FUNC (suitename, "qof print date buff", test_qof_print_date_buff);
     GNC_TEST_ADD_FUNC (suitename, "qof print gdate", test_qof_print_gdate);
     GNC_TEST_ADD_FUNC (suitename, "qof print date", test_qof_print_date);
-    GNC_TEST_ADD_FUNC (suitename, "gnc print date", test_gnc_print_date);
 // GNC_TEST_ADD_FUNC (suitename, "floordiv", test_floordiv);
 // GNC_TEST_ADD_FUNC (suitename, "qof scan date internal", test_qof_scan_date_internal);
     GNC_TEST_ADD_FUNC (suitename, "qof scan date", test_qof_scan_date);
@@ -2211,18 +1913,15 @@ test_suite_gnc_date (void)
 // GNC_TEST_ADD_FUNC (suitename, "qof strftime", test_qof_strftime);
     GNC_TEST_ADD_FUNC (suitename, "gnc_date_timestamp", test_gnc_date_timestamp);
     GNC_TEST_ADD (suitename, "gnc iso8601 to time64 gmt", FixtureA, NULL, setup, test_gnc_iso8601_to_time64_gmt, NULL);
-    GNC_TEST_ADD (suitename, "gnc timespec to iso8601 buff", FixtureA, NULL, setup, test_gnc_timespec_to_iso8601_buff, NULL);
-// GNC_TEST_ADD_FUNC (suitename, "gnc dmy2timespec internal", test_gnc_dmy2timespec_internal);
+    GNC_TEST_ADD (suitename, "gnc time64 to iso8601 buff", FixtureA, NULL, setup, test_gnc_time64_to_iso8601_buff, NULL);
+// GNC_TEST_ADD_FUNC (suitename, "gnc dmy2time64 internal", test_gnc_dmy2time64_internal);
 
-    GNC_TEST_ADD (suitename, "gnc dmy2timespec", FixtureB, NULL, setup_begin, test_gnc_dmy2timespec, NULL);
-    GNC_TEST_ADD (suitename, "gnc dmy2timespec end", FixtureB, NULL, setup_end, test_gnc_dmy2timespec_end, NULL);
-    GNC_TEST_ADD (suitename, "gnc dmy2timespec Neutral", FixtureB, NULL, setup_neutral, test_gnc_dmy2timespec_neutral, NULL);
+    GNC_TEST_ADD (suitename, "gnc dmy2time64", FixtureB, NULL, setup_begin, test_gnc_dmy2time64, NULL);
+    GNC_TEST_ADD (suitename, "gnc dmy2time64 end", FixtureB, NULL, setup_end, test_gnc_dmy2time64_end, NULL);
+    GNC_TEST_ADD (suitename, "gnc dmy2time64 Neutral", FixtureB, NULL, setup_neutral, test_gnc_dmy2time64_neutral, NULL);
 // GNC_TEST_ADD_FUNC (suitename, "gnc timezone", test_gnc_timezone);
-// GNC_TEST_ADD_FUNC (suitename, "timespecFromTime t", test_timespecFromtime64);
-// GNC_TEST_ADD_FUNC (suitename, "timespec now", test_timespec_now);
-// GNC_TEST_ADD_FUNC (suitename, "timespecToTime t", test_timespecTotime64);
-    GNC_TEST_ADD (suitename, "timespec to gdate", FixtureA, NULL, setup, test_timespec_to_gdate, NULL);
-    GNC_TEST_ADD (suitename, "gdate to timespec", FixtureB, NULL, setup_neutral, test_gdate_to_timespec, NULL);
+    GNC_TEST_ADD (suitename, "time64 to gdate", FixtureA, NULL, setup, test_time64_to_gdate, NULL);
+    GNC_TEST_ADD (suitename, "gdate to time64", FixtureB, NULL, setup_neutral, test_gdate_to_time64, NULL);
 // GNC_TEST_ADD_FUNC (suitename, "gnc tm get day start", test_gnc_tm_get_day_start);
 // GNC_TEST_ADD_FUNC (suitename, "gnc tm get day end", test_gnc_tm_get_day_end);
     GNC_TEST_ADD (suitename, "gnc time64 get day start", FixtureA, NULL, setup, test_gnc_time64_get_day_start, NULL);
@@ -2231,7 +1930,7 @@ test_suite_gnc_date (void)
 // GNC_TEST_ADD_FUNC (suitename, "gnc timet get today start", test_gnc_time64_get_today_start);
 // GNC_TEST_ADD_FUNC (suitename, "gnc timet get today end", test_gnc_time64_get_today_end);
 // GNC_TEST_ADD_FUNC (suitename, "gnc dow abbrev", test_gnc_dow_abbrev);
-// GNC_TEST_ADD_FUNC (suitename, "timespec boxed copy func", test_timespec_boxed_copy_func);
-// GNC_TEST_ADD_FUNC (suitename, "timespec boxed free func", test_timespec_boxed_free_func);
+// GNC_TEST_ADD_FUNC (suitename, "time64 boxed copy func", test_time64_boxed_copy_func);
+// GNC_TEST_ADD_FUNC (suitename, "time64 boxed free func", test_time64_boxed_free_func);
     g_time_zone_unref(tz);
 }

commit 20f6e4e690cf9d29a9181f5cb7f628eb38179bad
Author: John Ralls <jralls at ceridwen.us>
Date:   Sat Aug 4 14:18:39 2018 -0700

    Remove Timespec from the SQL backend.

diff --git a/libgnucash/backend/dbi/test/test-backend-dbi-basic.cpp b/libgnucash/backend/dbi/test/test-backend-dbi-basic.cpp
index 4c0d7ac..534c185 100644
--- a/libgnucash/backend/dbi/test/test-backend-dbi-basic.cpp
+++ b/libgnucash/backend/dbi/test/test-backend-dbi-basic.cpp
@@ -138,7 +138,7 @@ setup_memory (Fixture* fixture, gconstpointer pData)
     frame->set ({"int64-val"}, new KvpValue (INT64_C (100)));
     frame->set ({"double-val"}, new KvpValue (3.14159));
     frame->set ({"numeric-val"}, new KvpValue (gnc_numeric_zero ()));
-    frame->set ({"timespec-val"}, new KvpValue (gnc_time(nullptr)));
+    frame->set ({"time-val"}, new KvpValue (gnc_time(nullptr)));
     frame->set ({"string-val"}, new KvpValue ("abcdefghijklmnop"));
     auto guid = qof_instance_get_guid (QOF_INSTANCE (acct1));
     frame->set ({"guid-val"}, new KvpValue (const_cast<GncGUID*> (guid_copy (
diff --git a/libgnucash/backend/sql/gnc-entry-sql.cpp b/libgnucash/backend/sql/gnc-entry-sql.cpp
index f68e210..b22bc55 100644
--- a/libgnucash/backend/sql/gnc-entry-sql.cpp
+++ b/libgnucash/backend/sql/gnc-entry-sql.cpp
@@ -70,9 +70,9 @@ static void entry_set_bill (gpointer pObject, gpointer val);
 static EntryVec col_table
 ({
     gnc_sql_make_table_entry<CT_GUID>("guid", 0, COL_NNUL | COL_PKEY, "guid"),
-    gnc_sql_make_table_entry<CT_TIME64>("date", 0, COL_NNUL, ENTRY_DATE,
+    gnc_sql_make_table_entry<CT_TIME>("date", 0, COL_NNUL, ENTRY_DATE,
                                           true),
-    gnc_sql_make_table_entry<CT_TIME64>("date_entered", 0, 0,
+    gnc_sql_make_table_entry<CT_TIME>("date_entered", 0, 0,
                                           ENTRY_DATE_ENTERED, true),
     gnc_sql_make_table_entry<CT_STRING>(
         "description", MAX_DESCRIPTION_LEN, 0, "description"),
diff --git a/libgnucash/backend/sql/gnc-invoice-sql.cpp b/libgnucash/backend/sql/gnc-invoice-sql.cpp
index 29a18fd..b134bc7 100644
--- a/libgnucash/backend/sql/gnc-invoice-sql.cpp
+++ b/libgnucash/backend/sql/gnc-invoice-sql.cpp
@@ -67,9 +67,9 @@ static EntryVec col_table
     gnc_sql_make_table_entry<CT_GUID>("guid", 0, COL_NNUL | COL_PKEY, "guid"),
     gnc_sql_make_table_entry<CT_STRING>("id", MAX_ID_LEN, COL_NNUL, INVOICE_ID,
                                         true),
-    gnc_sql_make_table_entry<CT_TIME64>("date_opened", 0, 0, INVOICE_OPENED,
+    gnc_sql_make_table_entry<CT_TIME>("date_opened", 0, 0, INVOICE_OPENED,
                                           true),
-    gnc_sql_make_table_entry<CT_TIME64>("date_posted", 0, 0, INVOICE_POSTED,
+    gnc_sql_make_table_entry<CT_TIME>("date_posted", 0, 0, INVOICE_POSTED,
                                           true),
     gnc_sql_make_table_entry<CT_STRING>("notes", MAX_NOTES_LEN, COL_NNUL,
                                         "notes"),
diff --git a/libgnucash/backend/sql/gnc-order-sql.cpp b/libgnucash/backend/sql/gnc-order-sql.cpp
index 50cde38..453a7a4 100644
--- a/libgnucash/backend/sql/gnc-order-sql.cpp
+++ b/libgnucash/backend/sql/gnc-order-sql.cpp
@@ -66,9 +66,9 @@ static EntryVec col_table
     gnc_sql_make_table_entry<CT_STRING>(
         "reference", MAX_REFERENCE_LEN, COL_NNUL, "reference"),
     gnc_sql_make_table_entry<CT_BOOLEAN>("active", 0, COL_NNUL, "order"),
-    gnc_sql_make_table_entry<CT_TIMESPEC>("date_opened", 0, COL_NNUL,
+    gnc_sql_make_table_entry<CT_TIME>("date_opened", 0, COL_NNUL,
                                           "date-opened"),
-    gnc_sql_make_table_entry<CT_TIMESPEC>("date_closed", 0, COL_NNUL,
+    gnc_sql_make_table_entry<CT_TIME>("date_closed", 0, COL_NNUL,
                                           "date-closed"),
     gnc_sql_make_table_entry<CT_OWNERREF>("owner", 0, COL_NNUL,
                                           ORDER_OWNER, true),
diff --git a/libgnucash/backend/sql/gnc-price-sql.cpp b/libgnucash/backend/sql/gnc-price-sql.cpp
index 6a12872..1fcc5d5 100644
--- a/libgnucash/backend/sql/gnc-price-sql.cpp
+++ b/libgnucash/backend/sql/gnc-price-sql.cpp
@@ -63,7 +63,7 @@ static const EntryVec col_table
                                               "commodity"),
     gnc_sql_make_table_entry<CT_COMMODITYREF>("currency_guid", 0, COL_NNUL,
                                               "currency"),
-    gnc_sql_make_table_entry<CT_TIMESPEC>("date", 0, COL_NNUL, "date"),
+    gnc_sql_make_table_entry<CT_TIME>("date", 0, COL_NNUL, "date"),
     gnc_sql_make_table_entry<CT_STRING>("source", PRICE_MAX_SOURCE_LEN, 0,
                                         "source"),
     gnc_sql_make_table_entry<CT_STRING>("type", PRICE_MAX_TYPE_LEN, 0, "type"),
diff --git a/libgnucash/backend/sql/gnc-slots-sql.cpp b/libgnucash/backend/sql/gnc-slots-sql.cpp
index 6cb48ff..cf1fc7b 100644
--- a/libgnucash/backend/sql/gnc-slots-sql.cpp
+++ b/libgnucash/backend/sql/gnc-slots-sql.cpp
@@ -90,8 +90,8 @@ static  gpointer get_string_val (gpointer pObject);
 static void set_string_val (gpointer pObject,  gpointer pValue);
 static  gpointer get_double_val (gpointer pObject);
 static void set_double_val (gpointer pObject,  gpointer pValue);
-static Timespec get_timespec_val (gpointer pObject);
-static void set_timespec_val (gpointer pObject, Timespec *ts);
+static time64 get_time_val (gpointer pObject);
+static void set_time_val (gpointer pObject, time64 t);
 static  gpointer get_guid_val (gpointer pObject);
 static void set_guid_val (gpointer pObject,  gpointer pValue);
 static gnc_numeric get_numeric_val (gpointer pObject);
@@ -112,7 +112,7 @@ enum
     int64_val_col,
     string_val_col,
     double_val_col,
-    timespec_val_col,
+    time_val_col,
     guid_val_col,
     numeric_val_col,
     gdate_val_col
@@ -140,9 +140,9 @@ static const EntryVec col_table
     gnc_sql_make_table_entry<CT_DOUBLE>("double_val", 0, 0,
                                         (QofAccessFunc)get_double_val,
                                         set_double_val),
-    gnc_sql_make_table_entry<CT_TIMESPEC>("timespec_val", 0, 0,
-                                          (QofAccessFunc)get_timespec_val,
-                                          (QofSetterFunc)set_timespec_val),
+    gnc_sql_make_table_entry<CT_TIME>("time_val", 0, 0,
+                                          (QofAccessFunc)get_time_val,
+                                          (QofSetterFunc)set_time_val),
     gnc_sql_make_table_entry<CT_GUID>("guid_val", 0, 0,
                                       (QofAccessFunc)get_guid_val,
                                       set_guid_val),
@@ -390,24 +390,24 @@ set_double_val (gpointer pObject,  gpointer pValue)
     set_slot_from_value (pInfo, value);
 }
 
-static Timespec
-get_timespec_val (gpointer pObject)
+static time64
+get_time_val (gpointer pObject)
 {
     slot_info_t* pInfo = (slot_info_t*)pObject;
 
-    g_return_val_if_fail (pObject != NULL, gnc_dmy2timespec (1, 1, 1970));
+    g_return_val_if_fail (pObject != NULL, 0);
 
 //if( kvp_value_get_type( pInfo->pKvpValue ) == KvpValue::Type::TIME64 ) {
     auto t = pInfo->pKvpValue->get<Time64> ();
-    return {t.t, 0};
+    return t.t;
 }
 
 static void
-set_timespec_val (gpointer pObject, Timespec *ts)
+set_time_val (gpointer pObject, time64 time)
 {
     slot_info_t* pInfo = (slot_info_t*)pObject;
     KvpValue* value = NULL;
-    Time64 t{ts->tv_sec};
+    Time64 t{time};
     g_return_if_fail (pObject != NULL);
 
     if (pInfo->value_type != KvpValue::Type::TIME64) return;
diff --git a/libgnucash/backend/sql/gnc-sql-backend.hpp b/libgnucash/backend/sql/gnc-sql-backend.hpp
index bde8700..051b3ed 100644
--- a/libgnucash/backend/sql/gnc-sql-backend.hpp
+++ b/libgnucash/backend/sql/gnc-sql-backend.hpp
@@ -246,7 +246,7 @@ protected:
     bool m_loading;        /**< We are performing an initial load */
     bool m_in_query;       /**< We are processing a query */
     bool m_is_pristine_db; /**< Are we saving to a new pristine db? */
-    const char* m_timespec_format = nullptr; /**< Server-specific date-time string format */
+    const char* m_time_format = nullptr; /**< Server-specific date-time string format */
     VersionVec m_versions;    /**< Version number for each table */
 private:
     bool write_account_tree(Account*);
diff --git a/libgnucash/backend/sql/gnc-sql-column-table-entry.cpp b/libgnucash/backend/sql/gnc-sql-column-table-entry.cpp
index 6daed1d..e48c165 100644
--- a/libgnucash/backend/sql/gnc-sql-column-table-entry.cpp
+++ b/libgnucash/backend/sql/gnc-sql-column-table-entry.cpp
@@ -367,29 +367,22 @@ GncSqlColumnTableEntryImpl<CT_GUID>::add_to_query(QofIdTypeConst obj_name,
     }
 }
 /* ----------------------------------------------------------------- */
-typedef Timespec (*TimespecAccessFunc) (const gpointer);
-typedef void (*TimespecSetterFunc) (const gpointer, Timespec*);
-
-#define TIMESPEC_COL_SIZE (4+3+3+3+3+3)
+typedef time64 (*Time64AccessFunc) (const gpointer);
+typedef void (*Time64SetterFunc) (const gpointer, time64);
+constexpr int TIME_COL_SIZE = 4 + 3 + 3 + 3 + 3 + 3;
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_TIMESPEC>::load (const GncSqlBackend* sql_be,
-                                               GncSqlRow& row,
-                                               QofIdTypeConst obj_name,
-                                               gpointer pObject) const noexcept
+GncSqlColumnTableEntryImpl<CT_TIME>::load (const GncSqlBackend* sql_be,
+                                            GncSqlRow& row,
+                                            QofIdTypeConst obj_name,
+                                            gpointer pObject)
+    const noexcept
 {
-
-    Timespec ts = {0, 0};
-    gboolean isOK = FALSE;
-
-
-    g_return_if_fail (pObject != NULL);
+    time64 t{0};
     g_return_if_fail (m_gobj_param_name != nullptr || get_setter(obj_name) != nullptr);
-
     try
     {
-        auto val = row.get_time64_at_col(m_col_name);
-        timespecFromTime64 (&ts, val);
+        t = row.get_time64_at_col (m_col_name);
     }
     catch (std::invalid_argument&)
     {
@@ -397,121 +390,64 @@ GncSqlColumnTableEntryImpl<CT_TIMESPEC>::load (const GncSqlBackend* sql_be,
         {
             auto val = row.get_string_at_col(m_col_name);
             GncDateTime time(val);
-            ts.tv_sec = static_cast<time64>(time);
+            t = static_cast<time64>(time);
         }
         catch (const std::invalid_argument& err)
         {
             if (strcmp(err.what(), "Column empty.") != 0)
             {
-                auto val = row.get_string_at_col(m_col_name);
+                auto val = row.get_string_at_col (m_col_name);
                 PWARN("An invalid date %s was found in your database."
                       "It has been set to 1 January 1970.", val.c_str());
             }
-            ts.tv_sec = 0;
         }
     }
-    set_parameter(pObject, &ts,
-                  reinterpret_cast<TimespecSetterFunc>(get_setter(obj_name)),
-                  m_gobj_param_name);
- }
-
-template<> void
-GncSqlColumnTableEntryImpl<CT_TIMESPEC>::add_to_table(ColVec& vec) const noexcept
-{
-    GncSqlColumnInfo info{*this, BCT_DATETIME, TIMESPEC_COL_SIZE, FALSE};
-    vec.emplace_back(std::move(info));
-}
-
-template<> void
-GncSqlColumnTableEntryImpl<CT_TIMESPEC>::add_to_query(QofIdTypeConst obj_name,
-                                                      const gpointer pObject,
-                                                      PairVec& vec) const noexcept
-{
-    TimespecAccessFunc ts_getter;
-    Timespec ts;
-/* Can't use get_row_value_from_object because g_object_get returns a
- * Timespec* and the getter returns a Timespec. Will be fixed by the
- * replacement of timespecs with time64s.
- */
-    g_return_if_fail (obj_name != NULL);
-    g_return_if_fail (pObject != NULL);
-    
-    if (m_gobj_param_name != NULL)
-    {
-        Timespec* pts;
-        g_object_get (pObject, m_gobj_param_name, &pts, NULL);
-        ts = *pts;
-    }
-    else
+    if (m_gobj_param_name != nullptr)
     {
-        ts_getter = (TimespecAccessFunc)get_getter (obj_name);
-        g_return_if_fail (ts_getter != NULL);
-        ts = (*ts_getter) (pObject);
-    }
-    if (ts.tv_sec > MINTIME && ts.tv_sec < MAXTIME)
-    {
-        GncDateTime time(ts.tv_sec);
-        vec.emplace_back (std::make_pair (std::string{m_col_name},
-                                          time.format_zulu ("'%Y-%m-%d %H:%M:%S'")));
+        Time64 t64{t};
+        set_parameter(pObject, &t64, m_gobj_param_name);
     }
     else
     {
-        vec.emplace_back (std::make_pair (std::string{m_col_name},
-                                          "NULL"));
+        set_parameter(pObject, t,
+                      reinterpret_cast<Time64SetterFunc>(get_setter(obj_name)),
+                      nullptr);
     }
 }
-/* ----------------------------------------------------------------- */
-typedef time64 (*Time64AccessFunc) (const gpointer);
-typedef void (*Time64SetterFunc) (const gpointer, time64);
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_TIME64>::load (const GncSqlBackend* sql_be,
-                                            GncSqlRow& row,
-                                            QofIdTypeConst obj_name,
-                                            gpointer pObject)
-    const noexcept
+GncSqlColumnTableEntryImpl<CT_TIME>::add_to_table(ColVec& vec) const noexcept
 {
-    time64 t;
-    g_return_if_fail (m_gobj_param_name != nullptr || get_setter(obj_name) != nullptr);
-    try
-    {
-        t = row.get_time64_at_col (m_col_name);
-    }
-    catch (std::invalid_argument&)
-    {
-        try
-        {
-            auto val = row.get_string_at_col(m_col_name);
-            GncDateTime time(val);
-            t = static_cast<time64>(time);
-        }
-        catch (std::invalid_argument&)
-        {
-            return;
-        }
-    }
-    set_parameter(pObject, t,
-                  reinterpret_cast<Time64SetterFunc>(get_setter(obj_name)),
-                  m_gobj_param_name);
-}
 
-template<> void
-GncSqlColumnTableEntryImpl<CT_TIME64>::add_to_table(ColVec& vec) const noexcept
-{
-
-    GncSqlColumnInfo info{*this, BCT_DATETIME, TIMESPEC_COL_SIZE, FALSE};
+    GncSqlColumnInfo info{*this, BCT_DATETIME, TIME_COL_SIZE, FALSE};
     vec.emplace_back(std::move(info));
 }
 
 template<> void
-GncSqlColumnTableEntryImpl<CT_TIME64>::add_to_query(QofIdTypeConst obj_name,
+GncSqlColumnTableEntryImpl<CT_TIME>::add_to_query(QofIdTypeConst obj_name,
                                                    const gpointer pObject,
                                                    PairVec& vec) const noexcept
 {
-    auto t = get_row_value_from_object<time64>(obj_name, pObject);
-    if (t > MINTIME && t < MAXTIME)
+    /* We still can't use get_row_value_from_object because while g_value could
+     * contentedly store a time64 in an int64, KVP wouldn't be able to tell them
+     * apart, so we have the struct Time64 hack, see engine/gnc-date.c.
+     */
+    time64 t64;
+    if (m_gobj_param_name != nullptr)
+    {
+        Time64* t;
+        g_object_get (pObject, m_gobj_param_name, &t, nullptr);
+        t64 = t->t;
+    }
+    else
+    {
+        auto getter = (Time64AccessFunc)get_getter (obj_name);
+        g_return_if_fail(getter != nullptr);
+        t64 = (*getter)(pObject);
+    }
+    if (t64 > MINTIME && t64 < MAXTIME)
     {
-        GncDateTime time(t);
+        GncDateTime time(t64);
         vec.emplace_back (std::make_pair (std::string{m_col_name},
                                           time.format_zulu ("'%Y-%m-%d %H:%M:%S'")));
     }
@@ -539,7 +475,7 @@ GncSqlColumnTableEntryImpl<CT_GDATE>::load (const GncSqlBackend* sql_be,
     g_date_clear (&date, 1);
     try
     {
-        /* timespec_to_gdate applies the tz, and gdates are saved
+        /* time64_to_gdate applies the tz, and gdates are saved
          * as ymd, so we don't want that.
          */
         auto time = row.get_time64_at_col(m_col_name);
@@ -667,7 +603,7 @@ GncSqlColumnTableEntryImpl<CT_NUMERIC>::add_to_query(QofIdTypeConst obj_name,
                                                      const gpointer pObject,
                                                      PairVec& vec) const noexcept
 {
-/* We can't use get_row_value_from_object for the same reason as Timespec. */
+/* We can't use get_row_value_from_object for the same reason as time64. */
     NumericGetterFunc getter;
     gnc_numeric n;
 
diff --git a/libgnucash/backend/sql/gnc-sql-column-table-entry.hpp b/libgnucash/backend/sql/gnc-sql-column-table-entry.hpp
index b365d4a..7ea6e93 100644
--- a/libgnucash/backend/sql/gnc-sql-column-table-entry.hpp
+++ b/libgnucash/backend/sql/gnc-sql-column-table-entry.hpp
@@ -71,8 +71,7 @@ enum GncSqlObjectType
     CT_GUID,
     CT_INT,
     CT_INT64,
-    CT_TIMESPEC,
-    CT_TIME64,
+    CT_TIME,
     CT_GDATE,
     CT_NUMERIC,
     CT_DOUBLE,
diff --git a/libgnucash/backend/sql/gnc-transaction-sql.cpp b/libgnucash/backend/sql/gnc-transaction-sql.cpp
index df1c950..780cfcf 100644
--- a/libgnucash/backend/sql/gnc-transaction-sql.cpp
+++ b/libgnucash/backend/sql/gnc-transaction-sql.cpp
@@ -90,8 +90,8 @@ static const EntryVec tx_col_table
     gnc_sql_make_table_entry<CT_COMMODITYREF>("currency_guid", 0, COL_NNUL,
                                               "currency"),
     gnc_sql_make_table_entry<CT_STRING>("num", TX_MAX_NUM_LEN, COL_NNUL, "num"),
-    gnc_sql_make_table_entry<CT_TIMESPEC>("post_date", 0, 0, "post-date"),
-    gnc_sql_make_table_entry<CT_TIMESPEC>("enter_date", 0, 0, "enter-date"),
+    gnc_sql_make_table_entry<CT_TIME>("post_date", 0, 0, "post-date"),
+    gnc_sql_make_table_entry<CT_TIME>("enter_date", 0, 0, "enter-date"),
     gnc_sql_make_table_entry<CT_STRING>("description", TX_MAX_DESCRIPTION_LEN,
                                         0, "description"),
 };
@@ -116,7 +116,7 @@ static const EntryVec split_col_table
     gnc_sql_make_table_entry<CT_STRING>("reconcile_state", 1, COL_NNUL,
                                        (QofAccessFunc)get_split_reconcile_state,
                                         set_split_reconcile_state),
-    gnc_sql_make_table_entry<CT_TIMESPEC>("reconcile_date", 0, 0,
+    gnc_sql_make_table_entry<CT_TIME>("reconcile_date", 0, 0,
                                           "reconcile-date"),
     gnc_sql_make_table_entry<CT_NUMERIC>("value", 0, COL_NNUL, "value"),
     gnc_sql_make_table_entry<CT_NUMERIC>("quantity", 0, COL_NNUL, "amount"),
@@ -127,7 +127,7 @@ static const EntryVec split_col_table
 
 static const EntryVec post_date_col_table
 {
-    gnc_sql_make_table_entry<CT_TIMESPEC>("post_date", 0, 0, "post-date"),
+    gnc_sql_make_table_entry<CT_TIME>("post_date", 0, 0, "post-date"),
 };
 
 static const EntryVec account_guid_col_table
diff --git a/libgnucash/backend/sql/test/utest-gnc-backend-sql.cpp b/libgnucash/backend/sql/test/utest-gnc-backend-sql.cpp
index a990385..81e95e1 100644
--- a/libgnucash/backend/sql/test/utest-gnc-backend-sql.cpp
+++ b/libgnucash/backend/sql/test/utest-gnc-backend-sql.cpp
@@ -597,30 +597,6 @@ gnc_sql_add_objectref_guid_col_info_to_list (,// 1
 test_gnc_sql_add_objectref_guid_col_info_to_list (Fixture *fixture, gconstpointer pData)
 {
 }*/
-/* load_timespec
-static void
-load_timespec (const GncSqlBackend* sql_be, GncSqlRow& row,// 2
-*/
-/* static void
-test_load_timespec (Fixture *fixture, gconstpointer pData)
-{
-}*/
-/* add_timespec_col_info_to_list
-static void
-add_timespec_col_info_to_list (const GncSqlBackend* sql_be, const GncSqlColumnTableEntry& table_row,// 2
-*/
-/* static void
-test_add_timespec_col_info_to_list (Fixture *fixture, gconstpointer pData)
-{
-}*/
-/* add_value_timespec_to_vec
-static void
-add_gvalue_timespec_to_slist (const GncSqlBackend* sql_be, QofIdTypeConst obj_name,// 2
-*/
-/* static void
-test_add_value_timespec_to_vec (Fixture *fixture, gconstpointer pData)
-{
-}*/
 /* load_date
 static void
 load_date (const GncSqlBackend* sql_be, GncSqlRow& row,// 2
@@ -915,9 +891,6 @@ test_suite_gnc_backend_sql (void)
 // GNC_TEST_ADD (suitename, "add value guid to vec", Fixture, nullptr, test_add_value_guid_to_vec,  teardown);
 // GNC_TEST_ADD (suitename, "gnc sql add gvalue objectref guid to slist", Fixture, nullptr, test_gnc_sql_add_objectref_guid_to_vec,  teardown);
 // GNC_TEST_ADD (suitename, "gnc sql add objectref guid col info to list", Fixture, nullptr, test_gnc_sql_add_objectref_guid_col_info_to_list,  teardown);
-// GNC_TEST_ADD (suitename, "load timespec", Fixture, nullptr, test_load_timespec,  teardown);
-// GNC_TEST_ADD (suitename, "add timespec col info to list", Fixture, nullptr, test_add_timespec_col_info_to_list,  teardown);
-// GNC_TEST_ADD (suitename, "add value timespec to vec", Fixture, nullptr, test_add_value_timespec_to_vec,  teardown);
 // GNC_TEST_ADD (suitename, "load date", Fixture, nullptr, test_load_date,  teardown);
 // GNC_TEST_ADD (suitename, "add date col info to list", Fixture, nullptr, test_add_date_col_info_to_list,  teardown);
 // GNC_TEST_ADD (suitename, "add value date to vec", Fixture, nullptr, test_add_value_date_to_vec,  teardown);

commit 755773ac4cf225bbd78000a8290a4809d3b09a18
Author: John Ralls <jralls at ceridwen.us>
Date:   Fri Aug 3 14:00:07 2018 -0700

    Clean up timespec comments in the XML backend.
    
    Noting where the word must stay; most significantly for KVP types and for
    parsing Version 1 XML files.

diff --git a/libgnucash/backend/xml/sixtp-dom-generators.cpp b/libgnucash/backend/xml/sixtp-dom-generators.cpp
index bbb6c70..6cdf405 100644
--- a/libgnucash/backend/xml/sixtp-dom-generators.cpp
+++ b/libgnucash/backend/xml/sixtp-dom-generators.cpp
@@ -271,6 +271,9 @@ add_kvp_value_node (xmlNodePtr node, const gchar* tag, KvpValue* val)
         add_text_to_node (val_node, "guid", guidstr);
         break;
     }
+    /* Note: The type attribute must remain 'timespec' to maintain
+     * compatibility.
+     */
     case KvpValue::Type::TIME64:
     {
         auto t = val->get<Time64> ();
diff --git a/libgnucash/backend/xml/sixtp-dom-parsers.cpp b/libgnucash/backend/xml/sixtp-dom-parsers.cpp
index 5d9cae9..0bde990 100644
--- a/libgnucash/backend/xml/sixtp-dom-parsers.cpp
+++ b/libgnucash/backend/xml/sixtp-dom-parsers.cpp
@@ -348,6 +348,8 @@ struct kvp_val_converter
     const gchar* tag;
     KvpValue* (*converter) (xmlNodePtr node);
 };
+/* Note: The type attribute must remain 'timespec' to maintain compatibility.
+ */
 
 struct kvp_val_converter val_converters[] =
 {
@@ -531,17 +533,16 @@ dom_tree_to_time64 (xmlNodePtr node)
     /* Turn something like this
 
        <date-posted>
-         <s>Mon, 05 Jun 2000 23:16:19 -0500</s>
-         <ns>658864000</ns>
+         <ts:date>Mon, 05 Jun 2000 23:16:19 -0500</ts:date>
        </date-posted>
 
-       into a time64.  If this returns FALSE, the effects on *ts are
-       undefined.  The XML is valid if it has at least one of <s> or <ns>
-       and no more than one of each.  Order is irrelevant. */
+       into a time64, returning INT64_MAX that we're using to flag an erroneous
+       date if there's a problem. Only one ts:date element is permitted for any
+       date attribute.
+    */
 
     time64 ret {INT64_MAX};
-    gboolean seen_s = FALSE;
-    gboolean seen_ns = FALSE;
+    gboolean seen = FALSE;
     xmlNodePtr n;
 
     for (n = node->xmlChildrenNode; n; n = n->next)
@@ -554,7 +555,7 @@ dom_tree_to_time64 (xmlNodePtr node)
         case XML_ELEMENT_NODE:
             if (g_strcmp0 ("ts:date", (char*)n->name) == 0)
             {
-                if (seen_s)
+                if (seen)
                 {
                     return INT64_MAX;
                 }
@@ -568,21 +569,21 @@ dom_tree_to_time64 (xmlNodePtr node)
 
                     ret = gnc_iso8601_to_time64_gmt (content);
                     g_free (content);
-                    seen_s = TRUE;
+                    seen = TRUE;
                 }
             }
             break;
         default:
             PERR ("unexpected sub-node.");
-            return time_parse_failure ();
+            return INT64_MAX;
             break;
         }
     }
 
-    if (!seen_s)
+    if (!seen)
     {
         PERR ("no ts:date node found.");
-        return time_parse_failure ();
+        return INT64_MAX;
     }
 
     return ret;
diff --git a/libgnucash/backend/xml/sixtp-utils.cpp b/libgnucash/backend/xml/sixtp-utils.cpp
index 03933c7..12ecd87 100644
--- a/libgnucash/backend/xml/sixtp-utils.cpp
+++ b/libgnucash/backend/xml/sixtp-utils.cpp
@@ -346,7 +346,7 @@ simple_chars_only_parser_new (sixtp_end_handler end_handler)
 }
 
 /****************************************************************************/
-/* generic timespec handler.
+/* generic timespec handler for XML Version 1 files.
 
    A collection of node functions intended to parse a sub-node set
    that looks like this:
diff --git a/libgnucash/backend/xml/test/test-dom-converters1.cpp b/libgnucash/backend/xml/test/test-dom-converters1.cpp
index 29182d1..aa2b6c3 100644
--- a/libgnucash/backend/xml/test/test-dom-converters1.cpp
+++ b/libgnucash/backend/xml/test/test-dom-converters1.cpp
@@ -138,7 +138,7 @@ test_dom_tree_to_time64 (void)
         time64 test_spec2 = dom_tree_to_time64 (test_node);
         if (!dom_tree_valid_time64 (test_spec2, (const xmlChar*)"test-spec"))
         {
-            failure_args ("dom_tree_to_timespec",
+            failure_args ("dom_tree_to_time64",
                           __FILE__, __LINE__, "NULL return");
             printf ("Node looks like:\n");
             xmlElemDump (stdout, NULL, test_node);

commit b32a8a9390da697cfddad9b33296efdb1d32f264
Author: John Ralls <jralls at ceridwen.us>
Date:   Fri Aug 3 13:52:47 2018 -0700

    Remove time64_to_string and string_to_time64 and their tests.
    
    Each was used exactly once and simply wrapped a function call.
    Also replace static function time_parse_failure that just returned a
    constant with the constant.

diff --git a/libgnucash/backend/xml/sixtp-dom-generators.cpp b/libgnucash/backend/xml/sixtp-dom-generators.cpp
index 4d8fff4..bbb6c70 100644
--- a/libgnucash/backend/xml/sixtp-dom-generators.cpp
+++ b/libgnucash/backend/xml/sixtp-dom-generators.cpp
@@ -131,18 +131,12 @@ commodity_ref_to_dom_tree (const char* tag, const gnc_commodity* c)
     return ret;
 }
 
-char*
-time64_to_string (time64 time)
-{
-    return gnc_print_time64 (time, TIMESPEC_TIME_FORMAT " %q");
-}
-
 xmlNodePtr
 time64_to_dom_tree (const char* tag, const time64 time)
 {
     xmlNodePtr ret;
     g_return_val_if_fail (time != INT64_MAX, NULL);
-    auto date_str = time64_to_string (time);
+    auto date_str = gnc_print_time64 (time, "%Y-%m-%d %H:%M:%S %q");
     if (!date_str)
         return NULL;
     ret = xmlNewNode (NULL, BAD_CAST tag);
diff --git a/libgnucash/backend/xml/sixtp-dom-generators.h b/libgnucash/backend/xml/sixtp-dom-generators.h
index 68a4cf0..daf5bac 100644
--- a/libgnucash/backend/xml/sixtp-dom-generators.h
+++ b/libgnucash/backend/xml/sixtp-dom-generators.h
@@ -41,7 +41,6 @@ xmlNodePtr boolean_to_dom_tree (const char* tag, gboolean val);
 xmlNodePtr guid_to_dom_tree (const char* tag, const GncGUID* gid);
 xmlNodePtr commodity_ref_to_dom_tree (const char* tag, const gnc_commodity* c);
 xmlNodePtr time64_to_dom_tree (const char* tag, time64);
-gchar* time64_to_string (time64);
 xmlNodePtr gdate_to_dom_tree (const char* tag, const GDate* spec);
 xmlNodePtr gnc_numeric_to_dom_tree (const char* tag, const gnc_numeric* num);
 xmlNodePtr qof_instance_slots_to_dom_tree (const char* tag,
diff --git a/libgnucash/backend/xml/sixtp-dom-parsers.cpp b/libgnucash/backend/xml/sixtp-dom-parsers.cpp
index 1408004..5d9cae9 100644
--- a/libgnucash/backend/xml/sixtp-dom-parsers.cpp
+++ b/libgnucash/backend/xml/sixtp-dom-parsers.cpp
@@ -524,12 +524,6 @@ dom_tree_to_gnc_numeric (xmlNodePtr node)
     return ret;
 }
 
-static time64
-time_parse_failure ()
-{
-    return INT64_MAX;
-}
-
 
 time64
 dom_tree_to_time64 (xmlNodePtr node)
@@ -562,21 +556,17 @@ dom_tree_to_time64 (xmlNodePtr node)
             {
                 if (seen_s)
                 {
-                    return time_parse_failure ();
+                    return INT64_MAX;
                 }
                 else
                 {
                     gchar* content = dom_tree_to_text (n);
                     if (!content)
                     {
-                        return time_parse_failure ();
+                        return INT64_MAX;
                     }
 
-                    if (!string_to_time64 (content, &ret))
-                    {
-                        g_free (content);
-                        return time_parse_failure ();
-                    }
+                    ret = gnc_iso8601_to_time64_gmt (content);
                     g_free (content);
                     seen_s = TRUE;
                 }
diff --git a/libgnucash/backend/xml/sixtp-utils.cpp b/libgnucash/backend/xml/sixtp-utils.cpp
index 5c7dfbd..03933c7 100644
--- a/libgnucash/backend/xml/sixtp-utils.cpp
+++ b/libgnucash/backend/xml/sixtp-utils.cpp
@@ -362,13 +362,6 @@ simple_chars_only_parser_new (sixtp_end_handler end_handler)
    all goes well, returns the time64 as the result.
 */
 
-gboolean
-string_to_time64 (const gchar* str, time64* time)
-{
-    *time = gnc_iso8601_to_time64_gmt (str);
-    return (TRUE);
-}
-
 /* Top level timespec node:
 
    input: user end handler *
@@ -436,17 +429,17 @@ generic_timespec_secs_end_handler (gpointer data_for_children,
 {
     gchar* txt = NULL;
     Time64ParseInfo* info = (Time64ParseInfo*) parent_data;
-    gboolean ok;
 
     g_return_val_if_fail (parent_data, FALSE);
 
     txt = concatenate_child_result_chars (data_from_children);
     g_return_val_if_fail (txt, FALSE);
 
-    ok = string_to_time64 (txt, & info->time);
+    info->time = gnc_iso8601_to_time64_gmt (txt);
     g_free (txt);
 
-    g_return_val_if_fail (ok, FALSE);
+// gnc_iso8601_to_time64_gmt returns INT64_MAX on failure.
+    g_return_val_if_fail (info->time < INT64_MAX, FALSE);
 
     info->s_block_count++;
     return (TRUE);
diff --git a/libgnucash/backend/xml/sixtp-utils.h b/libgnucash/backend/xml/sixtp-utils.h
index 4129fe3..2ee7aa1 100644
--- a/libgnucash/backend/xml/sixtp-utils.h
+++ b/libgnucash/backend/xml/sixtp-utils.h
@@ -35,10 +35,6 @@ typedef struct
     guint s_block_count;
 } Time64ParseInfo;
 
-#define TIMESPEC_TIME_FORMAT  "%Y-%m-%d %H:%M:%S"
-#define TIMESPEC_PARSE_TIME_FORMAT  "%Y-%m-%d %H:%M:%S"
-#define TIMESPEC_SEC_FORMAT_MAX 256
-
 gboolean isspace_str (const gchar* str, int nomorethan);
 
 gboolean allow_and_ignore_only_whitespace (GSList* sibling_data,
@@ -84,8 +80,6 @@ gboolean generic_return_chars_end_handler (gpointer data_for_children,
 
 sixtp* simple_chars_only_parser_new (sixtp_end_handler end_handler);
 
-gboolean string_to_time64 (const gchar* str, time64* ts);
-
 gboolean generic_timespec_start_handler (GSList* sibling_data,
                                          gpointer parent_data,
                                          gpointer global_data,
diff --git a/libgnucash/backend/xml/test/CMakeLists.txt b/libgnucash/backend/xml/test/CMakeLists.txt
index 1468dfe..77b126c 100644
--- a/libgnucash/backend/xml/test/CMakeLists.txt
+++ b/libgnucash/backend/xml/test/CMakeLists.txt
@@ -57,7 +57,7 @@ set(test_backend_xml_module_SOURCES
 )
 
 set_local_dist(test_backend_xml_DIST_local CMakeLists.txt grab-types.pl
-  README test-date-converting.cpp test-dom-converters1.cpp
+  README test-dom-converters1.cpp
   test-dom-parser1.cpp test-file-stuff.cpp test-file-stuff.h test-kvp-frames.cpp
   test-load-backend.cpp test-load-example-account.cpp  test-load-xml2.cpp
   test-save-in-lang.cpp test-string-converters.cpp test-xml2-is-file.cpp
@@ -65,7 +65,6 @@ set_local_dist(test_backend_xml_DIST_local CMakeLists.txt grab-types.pl
   test-xml-pricedb.cpp test-xml-transaction.cpp)
 set(test_backend_xml_DIST ${test_backend_xml_DIST_local} ${test_backend_xml_test_files_DIST} PARENT_SCOPE)
 
-add_xml_test(test-date-converting "${test_backend_xml_base_SOURCES};test-date-converting.cpp")
 add_xml_test(test-dom-converters1 "${test_backend_xml_base_SOURCES};test-dom-converters1.cpp")
 add_xml_test(test-kvp-frames      "${test_backend_xml_base_SOURCES};test-kvp-frames.cpp")
 add_xml_test(test-load-backend  test-load-backend.cpp)
diff --git a/libgnucash/backend/xml/test/test-date-converting.cpp b/libgnucash/backend/xml/test/test-date-converting.cpp
deleted file mode 100644
index d940d81..0000000
--- a/libgnucash/backend/xml/test/test-date-converting.cpp
+++ /dev/null
@@ -1,67 +0,0 @@
-/********************************************************************\
- * This program is free software; you can redistribute it and/or    *
- * modify it under the terms of the GNU General Public License as   *
- * published by the Free Software Foundation; either version 2 of   *
- * the License, or (at your option) any later version.              *
- *                                                                  *
- * This program is distributed in the hope that it will be useful,  *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of   *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *
- * GNU General Public License for more details.                     *
- *                                                                  *
- * You should have received a copy of the GNU General Public License*
- * along with this program; if not, contact:                        *
- *                                                                  *
- * Free Software Foundation           Voice:  +1-617-542-5942       *
- * 51 Franklin Street, Fifth Floor    Fax:    +1-617-542-2652       *
- * Boston, MA  02110-1301,  USA       gnu at gnu.org                   *
- *                                                                  *
-\********************************************************************/
-extern "C"
-{
-#include <config.h>
-
-#include "test-engine-stuff.h"
-
-#include <stdlib.h>
-}
-
-#include "test-file-stuff.h"
-#include "sixtp-utils.h"
-#include "sixtp-dom-generators.h"
-#include "test-stuff.h"
-
-#define GNC_V2_STRING "gnc-v2"
-const gchar* gnc_v2_xml_version_string = GNC_V2_STRING;
-
-int
-main (int argc, char** argv)
-{
-    int i;
-
-    for (i = 0; i < 20; i++)
-    {
-        time64 spec2;
-        auto spec1 = get_random_time ();
-        auto sec_str = time64_to_string (spec1);
-        if (!string_to_time64 (sec_str, &spec2))
-        {
-            failure_args ("string_to_timespec_secs", __FILE__, __LINE__,
-                          "string is %s", sec_str);
-        }
-        else if (spec1 != spec2)
-        {
-            failure_args ("timespec_secs", __FILE__, __LINE__,
-                          "not equal ints are %" G_GINT64_FORMAT
-                          " and %" G_GINT64_FORMAT "\n",
-                          spec1, spec2);
-        }
-        else
-        {
-            success ("timespec");
-        }
-        g_free (sec_str);
-    }
-    print_test_results ();
-    exit (get_rv ());
-}

commit 62b17ca5db863e3d08182f17c14bdba8c2046f65
Author: John Ralls <jralls at ceridwen.us>
Date:   Fri Aug 3 12:51:11 2018 -0700

    Timespec removal, engine odds-and-ends.

diff --git a/libgnucash/engine/engine.i b/libgnucash/engine/engine.i
index 9cc7c9d..288f484 100644
--- a/libgnucash/engine/engine.i
+++ b/libgnucash/engine/engine.i
@@ -211,7 +211,6 @@ SplitList * qof_query_run_subquery (QofQuery *q, const QofQuery *q);
 %ignore GNC_ERROR_REMAINDER;
 %include <gnc-numeric.h>
 
-Timespec timespecCanonicalDayTime(Timespec t);
 time64 time64CanonicalDayTime(time64 t);
 
 %include <gnc-budget.h>
diff --git a/libgnucash/engine/qofinstance-p.h b/libgnucash/engine/qofinstance-p.h
index 8fcff1b..45d4eeb 100644
--- a/libgnucash/engine/qofinstance-p.h
+++ b/libgnucash/engine/qofinstance-p.h
@@ -51,7 +51,7 @@ void qof_instance_set_slots (QofInstance *, KvpFrame *);
  *  used for comparing version in local memory to that in remote
  *  server.
  */
-void qof_instance_set_last_update (QofInstance *inst, Timespec ts);
+void qof_instance_set_last_update (QofInstance *inst, time64 time);
 
 /** Set the dirty flag of just the instance. Don't modify the
  *  collection flag at all. */
diff --git a/libgnucash/engine/qofinstance.cpp b/libgnucash/engine/qofinstance.cpp
index 06ae8ca..670f91b 100644
--- a/libgnucash/engine/qofinstance.cpp
+++ b/libgnucash/engine/qofinstance.cpp
@@ -86,7 +86,7 @@ typedef struct QofInstancePrivate
      *  SQL backend, this field is reserved for SQL use, to compare
      *  the version in local memory to the remote, server version.
      */
-    Timespec last_update;
+    time64 last_update;
 
     /*  Keep track of nesting level of begin/end edit calls */
     int editlevel;
@@ -264,8 +264,7 @@ qof_instance_init (QofInstance *inst)
     priv = GET_PRIVATE(inst);
     priv->book = NULL;
     inst->kvp_data = new KvpFrame;
-    priv->last_update.tv_sec = 0;
-    priv->last_update.tv_nsec = -1;
+    priv->last_update = 0;
     priv->editlevel = 0;
     priv->do_free = FALSE;
     priv->dirty = FALSE;
@@ -415,7 +414,7 @@ qof_instance_set_property (GObject         *object,
                            GParamSpec      *pspec)
 {
     QofInstance *inst;
-    Timespec *ts;
+    Time64 t;
 
     g_return_if_fail(QOF_IS_INSTANCE(object));
 
@@ -435,8 +434,8 @@ qof_instance_set_property (GObject         *object,
 			      static_cast<QofBook*>(g_value_get_object(value)));
         break;
     case PROP_LAST_UPDATE:
-        ts = static_cast<Timespec*>(g_value_get_pointer(value));
-        qof_instance_set_last_update(inst, *ts);
+        t = *(static_cast<Time64*>(g_value_get_pointer(value)));
+        qof_instance_set_last_update(inst, t.t);
         break;
     case PROP_DESTROYING:
         qof_instance_set_destroying(inst, g_value_get_boolean(value));
@@ -598,10 +597,10 @@ qof_instance_set_slots (QofInstance *inst, KvpFrame *frm)
 }
 
 void
-qof_instance_set_last_update (QofInstance *inst, Timespec ts)
+qof_instance_set_last_update (QofInstance *inst, time64 t)
 {
     if (!inst) return;
-    GET_PRIVATE(inst)->last_update = ts;
+    GET_PRIVATE(inst)->last_update = t;
 }
 
 gint
@@ -640,11 +639,8 @@ qof_instance_version_cmp (const QofInstance *left, const QofInstance *right)
 
     lpriv = GET_PRIVATE(left);
     rpriv = GET_PRIVATE(right);
-    if (lpriv->last_update.tv_sec  < rpriv->last_update.tv_sec) return -1;
-    if (lpriv->last_update.tv_sec  > rpriv->last_update.tv_sec) return +1;
-    if (lpriv->last_update.tv_nsec < rpriv->last_update.tv_nsec) return -1;
-    if (lpriv->last_update.tv_nsec > rpriv->last_update.tv_nsec) return +1;
-    return 0;
+    return lpriv->last_update < rpriv->last_update ? -1 :
+        lpriv->last_update > rpriv->last_update ? 1 : 0;
 }
 
 gboolean
diff --git a/libgnucash/engine/qofquery.cpp b/libgnucash/engine/qofquery.cpp
index 07278df..f91d204 100644
--- a/libgnucash/engine/qofquery.cpp
+++ b/libgnucash/engine/qofquery.cpp
@@ -1827,9 +1827,12 @@ qof_query_printValueForParam (QofQueryPredData *pd, GString * gs)
     if (!g_strcmp0 (pd->type_name, QOF_TYPE_DATE))
     {
         query_date_t pdata = (query_date_t) pd;
+        char datebuff[MAX_DATE_LENGTH + 1];
+        memset (datebuff, 0, sizeof(datebuff));
+        qof_print_date_buff (datebuff, sizeof(datebuff), pdata->date);
         g_string_append_printf (gs, " Match type %s",
                                 qof_query_printDateMatch (pdata->options));
-        g_string_append_printf (gs, " query_date: %s", gnc_print_date ({pdata->date, 0}));
+        g_string_append_printf (gs, " query_date: %s", datebuff);
         return;
     }
     if (!g_strcmp0 (pd->type_name, QOF_TYPE_CHAR))
diff --git a/libgnucash/engine/qofquerycore.cpp b/libgnucash/engine/qofquerycore.cpp
index 91c5afa..f9c8b98 100644
--- a/libgnucash/engine/qofquerycore.cpp
+++ b/libgnucash/engine/qofquerycore.cpp
@@ -450,7 +450,7 @@ date_to_string (gpointer object, QofParam *getter)
     time64 tt = ((query_date_getter)getter->param_getfcn)(object, getter);
 
     if (tt != INT64_MAX)
-        return g_strdup (gnc_print_date ({tt, 0}));
+        return qof_print_date (tt);
 
     return NULL;
 }
diff --git a/libgnucash/engine/test-core/test-engine-stuff.cpp b/libgnucash/engine/test-core/test-engine-stuff.cpp
index 24caa5a..05f3203 100644
--- a/libgnucash/engine/test-core/test-engine-stuff.cpp
+++ b/libgnucash/engine/test-core/test-engine-stuff.cpp
@@ -157,20 +157,6 @@ kvp_type_excluded (KvpValue::Type kvp_type)
 
 static gboolean zero_nsec = FALSE;
 
-void
-random_timespec_zero_nsec (gboolean zero_nsec_in)
-{
-    zero_nsec = zero_nsec_in;
-}
-
-static gboolean usec_resolution = FALSE;
-
-void
-random_timespec_usec_resolution (gboolean usec_resolution_in)
-{
-    usec_resolution = usec_resolution_in;
-}
-
 /* ========================================================== */
 
 static inline gboolean
@@ -236,20 +222,6 @@ get_random_time (void)
     return ret;
 }
 
-Timespec*
-get_random_timespec(void)
-{
-    Timespec *ret;
-
-    ret = g_new0(Timespec, 1);
-
-    while (ret->tv_sec <= 0)
-        ret->tv_sec = rand();
-
-    ret->tv_nsec = 0;
-    return ret;
-}
-
 GncGUID*
 get_random_guid(void)
 {
diff --git a/libgnucash/engine/test-core/test-engine-stuff.h b/libgnucash/engine/test-core/test-engine-stuff.h
index 5f8d69d..bc661da 100644
--- a/libgnucash/engine/test-core/test-engine-stuff.h
+++ b/libgnucash/engine/test-core/test-engine-stuff.h
@@ -45,10 +45,8 @@ typedef struct KvpValueImpl KvpValue;
 typedef struct KvpFrameImpl KvpFrame;
 #define __KVP_FRAME
 #endif
-Timespec* get_random_timespec(void);
+
 time64 get_random_time(void);
-void random_timespec_zero_nsec (gboolean zero_nsec);
-void random_timespec_usec_resolution (gboolean usec_resolution);
 
 KvpValue* get_random_kvp_value(int type);
 
diff --git a/libgnucash/engine/test/test-date.cpp b/libgnucash/engine/test/test-date.cpp
index 86f802d..acf502a 100644
--- a/libgnucash/engine/test/test-date.cpp
+++ b/libgnucash/engine/test/test-date.cpp
@@ -391,7 +391,7 @@ run_test (void)
     ts.tv_nsec = 0;
     check_time (ts, do_print);
 
-    ts = *get_random_timespec ();
+    ts.tv_sec = get_random_time ();
 
     for (i = 0; i < 10000; i++)
     {
@@ -402,7 +402,7 @@ run_test (void)
 
     for (i = 0; i < 5000; i++)
     {
-        ts = *get_random_timespec ();
+        ts.tv_sec = get_random_time ();
 
         if (!check_time (ts, FALSE))
             return;
diff --git a/libgnucash/engine/test/test-qofinstance.cpp b/libgnucash/engine/test/test-qofinstance.cpp
index 292e250..6e04b49 100644
--- a/libgnucash/engine/test/test-qofinstance.cpp
+++ b/libgnucash/engine/test/test-qofinstance.cpp
@@ -194,7 +194,7 @@ test_instance_new_destroy( void )
     QofInstance *inst;
     QofInstanceClass *klass;
     /* test var */
-    Timespec *timespec_priv;
+    Time64 *time_priv;
     const char *msg1 = "qof_instance_get_collection: assertion 'QOF_IS_INSTANCE(ptr)' failed";
     const char *msg2 = "qof_instance_get_editlevel: assertion 'QOF_IS_INSTANCE(ptr)' failed";
     const char *msg3 = "qof_instance_get_destroying: assertion 'QOF_IS_INSTANCE(ptr)' failed";
@@ -217,9 +217,8 @@ test_instance_new_destroy( void )
     g_assert( !qof_instance_get_collection( inst ) );
     g_assert( qof_instance_get_book( inst ) == NULL );
     g_assert( inst->kvp_data );
-    g_object_get( inst, "last-update", &timespec_priv, NULL);
-    g_assert_cmpint( timespec_priv->tv_sec, == , 0 );
-    g_assert_cmpint( timespec_priv->tv_nsec, == , -1 );
+    g_object_get( inst, "last-update", &time_priv, NULL);
+    g_assert_cmpint( time_priv->t, == , 0 );
     g_assert_cmpint( qof_instance_get_editlevel( inst ), == , 0 );
     g_assert( !qof_instance_get_destroying( inst ) );
     g_assert( !qof_instance_get_dirty_flag( inst ) );
@@ -311,7 +310,7 @@ test_instance_version_cmp( void )
 {
     QofInstance *left, *right;
     int result;
-    Timespec timespec_left, timespec_right;
+    time64 time_left = 0, time_right = 1;
 
     /* set up*/
     left = static_cast<QofInstance*>(g_object_new( QOF_TYPE_INSTANCE, NULL ));
@@ -330,48 +329,24 @@ test_instance_version_cmp( void )
     g_assert_cmpint( result, == , 1 );
 
     g_test_message( "Test left tv_sec lesser than right" );
-    timespec_left.tv_sec = 0;
-    timespec_right.tv_sec = 1;
-    qof_instance_set_last_update( left, timespec_left );
-    qof_instance_set_last_update( right, timespec_right );
+    qof_instance_set_last_update( left, time_left );
+    qof_instance_set_last_update( right, time_right );
     result = qof_instance_version_cmp( left, right );
     g_assert_cmpint( result, == , -1 );
 
     g_test_message( "Test right tv_sec lesser than left" );
-    timespec_left.tv_sec = 1;
-    timespec_right.tv_sec = 0;
-    qof_instance_set_last_update( left, timespec_left );
-    qof_instance_set_last_update( right, timespec_right );
-    result = qof_instance_version_cmp( left, right );
-    g_assert_cmpint( result, == , 1 );
-
-    g_test_message( "Test left tv_nsec lesser than right" );
-    timespec_left.tv_sec = 1;
-    timespec_left.tv_nsec = 0;
-    timespec_right.tv_sec = 1;
-    timespec_right.tv_nsec = 1;
-    qof_instance_set_last_update( left, timespec_left );
-    qof_instance_set_last_update( right, timespec_right );
-    result = qof_instance_version_cmp( left, right );
-    g_assert_cmpint( result, == , -1 );
-
-    g_test_message( "Test right tv_sec lesser than left" );
-    timespec_left.tv_sec = 1;
-    timespec_left.tv_nsec = 1;
-    timespec_right.tv_sec = 1;
-    timespec_right.tv_nsec = 0;
-    qof_instance_set_last_update( left, timespec_left );
-    qof_instance_set_last_update( right, timespec_right );
+    time_left = 1;
+    time_right = 0;
+    qof_instance_set_last_update( left, time_left );
+    qof_instance_set_last_update( right, time_right );
     result = qof_instance_version_cmp( left, right );
     g_assert_cmpint( result, == , 1 );
 
     g_test_message( "Test both equal" );
-    timespec_left.tv_sec = 1;
-    timespec_left.tv_nsec = 1;
-    timespec_right.tv_sec = 1;
-    timespec_right.tv_nsec = 1;
-    qof_instance_set_last_update( left, timespec_left );
-    qof_instance_set_last_update( right, timespec_right );
+    time_left = 1;
+    time_right = 1;
+    qof_instance_set_last_update( left, time_left );
+    qof_instance_set_last_update( right, time_right );
     result = qof_instance_version_cmp( left, right );
     g_assert_cmpint( result, == , 0 );
 

commit 358cd979d9376c1795124d18f8cfe0eb551d4d03
Author: John Ralls <jralls at ceridwen.us>
Date:   Thu Aug 2 18:19:15 2018 -0700

    Remove Timespec from the main engine classes (Transaction, Split, & Account.

diff --git a/libgnucash/backend/xml/gnc-transaction-xml-v2.cpp b/libgnucash/backend/xml/gnc-transaction-xml-v2.cpp
index 6a397f6..e7c4c92 100644
--- a/libgnucash/backend/xml/gnc-transaction-xml-v2.cpp
+++ b/libgnucash/backend/xml/gnc-transaction-xml-v2.cpp
@@ -63,15 +63,6 @@ add_time64 (xmlNodePtr node, const gchar * tag, time64 time, gboolean always)
         xmlAddChild (node, time64_to_dom_tree (tag, time));
 }
 
-static void
-add_timespec (xmlNodePtr node, const gchar* tag, Timespec tms, gboolean always)
-{
-    if (always || tms.tv_sec)
-    {
-        xmlAddChild (node, time64_to_dom_tree (tag, tms.tv_sec));
-    }
-}
-
 static xmlNodePtr
 split_to_dom_tree (const gchar* tag, Split* spl)
 {
@@ -113,8 +104,8 @@ split_to_dom_tree (const gchar* tag, Split* spl)
                          BAD_CAST tmp);
     }
 
-    add_timespec (ret, "split:reconcile-date",
-                  xaccSplitRetDateReconciledTS (spl), FALSE);
+    add_time64 (ret, "split:reconcile-date",
+                xaccSplitGetDateReconciled (spl), FALSE);
 
     add_gnc_num (ret, "split:value", xaccSplitGetValue (spl));
 
@@ -445,12 +436,11 @@ set_tran_time64 (xmlNodePtr node, Transaction * trn,
 
 static inline gboolean
 set_tran_date (xmlNodePtr node, Transaction* trn,
-               void (*func) (Transaction* trn, const Timespec* tm))
+               void (*func) (Transaction* trn, const time64 tm))
 {
     time64 time = dom_tree_to_time64 (node);
     if (!dom_tree_valid_time64 (time, node->name)) time = 0;
-    Timespec ts {time, 0};
-    func (trn, &ts);
+    func (trn, time);
     return TRUE;
 }
 
diff --git a/libgnucash/engine/Account.cpp b/libgnucash/engine/Account.cpp
index 141609d..72ae32b 100644
--- a/libgnucash/engine/Account.cpp
+++ b/libgnucash/engine/Account.cpp
@@ -3311,19 +3311,6 @@ xaccAccountGetBalanceAsOfDate (Account *acc, time64 date)
     priv = GET_PRIVATE(acc);
     balance = priv->balance;
 
-    /* Since transaction post times are stored as a Timespec,
-     * convert date into a Timespec as well rather than converting
-     * each transaction's Timespec into a time64.
-     *
-     * FIXME: CAS: I think this comment is a bogus justification for
-     * using xaccTransGetDatePostedTS.  There's no benefit to using
-     * Timespec when the input argument is time64, and it's hard to
-     * imagine that casting long long to long and comparing two longs is
-     * worse than comparing two long longs every time.  IMO,
-     * xaccAccountGetPresentBalance gets this right, and its algorithm
-     * should be used here.
-     */
-
     lp = priv->splits;
     while ( lp && !found )
     {
@@ -3432,7 +3419,6 @@ xaccAccountConvertBalanceToCurrencyAsOfDate(const Account *acc, /* for book */
 {
     QofBook *book;
     GNCPriceDB *pdb;
-    Timespec ts;
 
     if (gnc_numeric_zero_p (balance) ||
             gnc_commodity_equiv (balance_currency, new_currency))
diff --git a/libgnucash/engine/Recurrence.c b/libgnucash/engine/Recurrence.c
index c9805f4..093836a 100644
--- a/libgnucash/engine/Recurrence.c
+++ b/libgnucash/engine/Recurrence.c
@@ -391,23 +391,23 @@ time64
 recurrenceGetPeriodTime(const Recurrence *r, guint period_num, gboolean end)
 {
     GDate date;
-    Timespec ts;
+    time64 time;
     recurrenceNthInstance(r, period_num + (end ? 1 : 0), &date);
     if (end)
     {
         g_date_subtract_days(&date, 1);
-        ts = gnc_dmy2timespec_end (g_date_get_day(&date),
+        time = gnc_dmy2time64_end (g_date_get_day(&date),
                                    g_date_get_month(&date),
                                    g_date_get_year (&date));
 
     }
     else
     {
-        ts = gnc_dmy2timespec (g_date_get_day(&date),
+        time = gnc_dmy2time64 (g_date_get_day(&date),
                                g_date_get_month(&date),
                                g_date_get_year (&date));
     }
-    return timespecToTime64(ts);
+    return time;
 }
 
 gnc_numeric
diff --git a/libgnucash/engine/Split.c b/libgnucash/engine/Split.c
index b709551..65c3e2e 100644
--- a/libgnucash/engine/Split.c
+++ b/libgnucash/engine/Split.c
@@ -115,8 +115,7 @@ gnc_split_init(Split* split)
     split->amount      = gnc_numeric_zero();
     split->value       = gnc_numeric_zero();
 
-    split->date_reconciled.tv_sec  = 0;
-    split->date_reconciled.tv_nsec = 0;
+    split->date_reconciled  = 0;
 
     split->balance             = gnc_numeric_zero();
     split->cleared_balance     = gnc_numeric_zero();
@@ -151,6 +150,7 @@ gnc_split_get_property(GObject         *object,
 {
     Split *split;
     gchar *key;
+    Time64 t;
 
     g_return_if_fail(GNC_IS_SPLIT(object));
 
@@ -170,7 +170,8 @@ gnc_split_get_property(GObject         *object,
             g_value_set_boxed(value, &split->amount);
             break;
         case PROP_RECONCILE_DATE:
-            g_value_set_boxed(value, &split->date_reconciled.tv_sec);
+            t.t = split->date_reconciled;
+            g_value_set_boxed(value, &t);
             break;
         case PROP_TX:
             g_value_take_object(value, split->parent);
@@ -507,8 +508,7 @@ xaccSplitReinit(Split * split)
     split->amount      = gnc_numeric_zero();
     split->value       = gnc_numeric_zero();
 
-    split->date_reconciled.tv_sec  = 0;
-    split->date_reconciled.tv_nsec = 0;
+    split->date_reconciled  = 0;
 
     split->balance             = gnc_numeric_zero();
     split->cleared_balance     = gnc_numeric_zero();
@@ -654,6 +654,9 @@ xaccSplitCopyOnto(const Split *from_split, Split *to_split)
 void
 xaccSplitDump (const Split *split, const char *tag)
 {
+    char datebuff[MAX_DATE_LENGTH + 1];
+    memset (datebuff, 0, sizeof(datebuff));
+    qof_print_date_buff (datebuff, sizeof(datebuff), split->date_reconciled);
     printf("  %s Split %p", tag, split);
     printf("    Book:     %p\n", qof_instance_get_book(split));
     printf("    Account:  %p (%s)\n", split->acc,
@@ -668,8 +671,8 @@ xaccSplitDump (const Split *split, const char *tag)
     printf("    Memo:     %s\n", split->memo ? split->memo : "(null)");
     printf("    Action:   %s\n", split->action ? split->action : "(null)");
     printf("    KVP Data: %s\n", qof_instance_kvp_as_string (QOF_INSTANCE (split)));
-    printf("    Recncld:  %c (date %s)\n", split->reconciled,
-           gnc_print_date(split->date_reconciled));
+    printf("    Recncld:  %c (date %s)\n", split->reconciled, datebuff);
+
     printf("    Value:    %s\n", gnc_numeric_to_string(split->value));
     printf("    Amount:   %s\n", gnc_numeric_to_string(split->amount));
     printf("    Balance:  %s\n", gnc_numeric_to_string(split->balance));
@@ -708,8 +711,7 @@ xaccFreeSplit (Split *split)
     split->acc         = NULL;
     split->orig_acc    = NULL;
 
-    split->date_reconciled.tv_sec = 0;
-    split->date_reconciled.tv_nsec = 0;
+    split->date_reconciled = 0;
     G_OBJECT_CLASS (QOF_INSTANCE_GET_CLASS (&split->inst))->dispose(G_OBJECT (split));
     // Is this right?
     if (split->gains_split) split->gains_split->gains_split = NULL;
@@ -818,7 +820,7 @@ xaccSplitEqual(const Split *sa, const Split *sb,
         return FALSE;
     }
 
-    if (timespec_cmp(&(sa->date_reconciled), &(sb->date_reconciled)))
+    if (sa->date_reconciled != sb->date_reconciled)
     {
         PINFO ("reconciled date differs");
         return FALSE;
@@ -1514,7 +1516,10 @@ xaccSplitOrder (const Split *sa, const Split *sb)
     if (comp > 0) return +1;
 
     /* if dates differ, return */
-    DATE_CMP(sa, sb, date_reconciled);
+    if (sa->date_reconciled < sb->date_reconciled)
+        return -1;
+    else if (sa->date_reconciled > sb->date_reconciled)
+        return 1;
 
     /* else, sort on guid - keeps sort stable. */
     retval = qof_instance_guid_compare(sa, sb);
@@ -1772,44 +1777,18 @@ xaccSplitSetDateReconciledSecs (Split *split, time64 secs)
     if (!split) return;
     xaccTransBeginEdit (split->parent);
 
-    split->date_reconciled.tv_sec = secs;
-    split->date_reconciled.tv_nsec = 0;
-    qof_instance_set_dirty(QOF_INSTANCE(split));
-    xaccTransCommitEdit(split->parent);
-
-}
-
-void
-xaccSplitSetDateReconciledTS (Split *split, Timespec *ts)
-{
-    if (!split || !ts) return;
-    xaccTransBeginEdit (split->parent);
-
-    split->date_reconciled = *ts;
+    split->date_reconciled = secs;
     qof_instance_set_dirty(QOF_INSTANCE(split));
     xaccTransCommitEdit(split->parent);
 
 }
 
-void
-xaccSplitGetDateReconciledTS (const Split * split, Timespec *ts)
-{
-    if (!split || !ts) return;
-    *ts = (split->date_reconciled);
-}
-
-Timespec
-xaccSplitRetDateReconciledTS (const Split * split)
-{
-    Timespec ts = {0, 0};
-    return split ? split->date_reconciled : ts;
-}
 
 /*################## Added for Reg2 #################*/
 time64
 xaccSplitGetDateReconciled (const Split * split)
 {
-    return split ? split->date_reconciled.tv_sec : 0;
+    return split ? split->date_reconciled : 0;
 }
 /*################## Added for Reg2 #################*/
 
@@ -2004,7 +1983,7 @@ xaccSplitAddPeerSplit (Split *split, const Split *other_split,
     guid = qof_instance_get_guid (QOF_INSTANCE (other_split));
     xaccTransBeginEdit (split->parent);
     qof_instance_kvp_add_guid (QOF_INSTANCE (split), "lot-split",
-                               timespec_now(), "peer_guid", guid_copy(guid));
+                               gnc_time(NULL), "peer_guid", guid_copy(guid));
     mark_split (split);
     qof_instance_set_dirty (QOF_INSTANCE (split));
     xaccTransCommitEdit (split->parent);
diff --git a/libgnucash/engine/Split.h b/libgnucash/engine/Split.h
index 4d7f417..963413e 100644
--- a/libgnucash/engine/Split.h
+++ b/libgnucash/engine/Split.h
@@ -191,15 +191,6 @@ char          xaccSplitGetReconcile (const Split *split);
 /** Set the date on which this split was reconciled by specifying the
  * time as time64. */
 void          xaccSplitSetDateReconciledSecs (Split *split, time64 time);
-/** Set the date on which this split was reconciled by specifying the
- * time as Timespec.  Caller still owns *ts! */
-void          xaccSplitSetDateReconciledTS (Split *split, Timespec *ts);
-/** Get the date on which this split was reconciled by having it
- * written into the Timespec that 'ts' is pointing to. */
-void          xaccSplitGetDateReconciledTS (const Split *split,
-        Timespec *ts);
-/** Returns the date (as Timespec) on which this split was reconciled. */
-Timespec      xaccSplitRetDateReconciledTS (const Split *split);
 
 /*################## Added for Reg2 #################*/
 /** Retrieve the date when the Split was reconciled. */
diff --git a/libgnucash/engine/SplitP.h b/libgnucash/engine/SplitP.h
index 2832dc8..9815d41 100644
--- a/libgnucash/engine/SplitP.h
+++ b/libgnucash/engine/SplitP.h
@@ -93,8 +93,8 @@ struct split_s
      */
     char  * action;            /* Buy, Sell, Div, etc.                      */
 
-    Timespec date_reconciled;  /* date split was reconciled                 */
-    char    reconciled;        /* The reconciled field                      */
+    time64 date_reconciled;  /* date split was reconciled                 */
+    char   reconciled;        /* The reconciled field                      */
 
     /* gains is a flag used to track the relationship between
      * capital-gains splits. Depending on its value, this flag indicates
@@ -202,28 +202,6 @@ void         DxaccSplitSetShareAmount (Split *split, double amount);
 \********************************************************************/
 
 
-#define DATE_CMP(aaa,bbb,field) {                       \
-  /* if dates differ, return */                         \
-  if ( (aaa->field.tv_sec) <                            \
-       (bbb->field.tv_sec)) {                           \
-    return -1;                                          \
-  } else                                                \
-  if ( (aaa->field.tv_sec) >                            \
-       (bbb->field.tv_sec)) {                           \
-    return +1;                                          \
-  }                                                     \
-                                                        \
-  /* else, seconds match. check nanoseconds */          \
-  if ( (aaa->field.tv_nsec) <                           \
-       (bbb->field.tv_nsec)) {                          \
-    return -1;                                          \
-  } else                                                \
-  if ( (aaa->field.tv_nsec) >                           \
-       (bbb->field.tv_nsec)) {                          \
-    return +1;                                          \
-  }                                                     \
-}
-
 #define CHECK_GAINS_STATUS(s)  \
    if (GAINS_STATUS_UNKNOWN == s->gains) xaccSplitDetermineGainStatus(s);
 
diff --git a/libgnucash/engine/TransLog.c b/libgnucash/engine/TransLog.c
index b88d982..50b9ae7 100644
--- a/libgnucash/engine/TransLog.c
+++ b/libgnucash/engine/TransLog.c
@@ -244,7 +244,7 @@ xaccTransWriteLog (Transaction *trans, char flag)
 
     for (node = trans->splits; node; node = node->next)
     {
-        Timespec ts;
+        time64 time;
         Split *split = node->data;
         const char * accname = "";
         char acc_guid_str[GUID_ENCODING_LENGTH + 1];
@@ -261,8 +261,7 @@ xaccTransWriteLog (Transaction *trans, char flag)
             acc_guid_str[0] = '\0';
         }
 
-        timespecFromTime64(&ts, split->date_reconciled.tv_sec);
-        gnc_timespec_to_iso8601_buff (ts, drecn);
+        gnc_time64_to_iso8601_buff (split->date_reconciled, drecn);
 
         guid_to_string_buff (xaccSplitGetGUID(split), split_guid_str);
         amt = xaccSplitGetAmount (split);
diff --git a/libgnucash/engine/Transaction.c b/libgnucash/engine/Transaction.c
index 2223c89..17e8608 100644
--- a/libgnucash/engine/Transaction.c
+++ b/libgnucash/engine/Transaction.c
@@ -310,6 +310,7 @@ gnc_transaction_get_property(GObject* object,
 {
     Transaction* tx;
     gchar *key;
+    Time64 time;
 
     g_return_if_fail(GNC_IS_TRANSACTION(object));
 
@@ -326,10 +327,12 @@ gnc_transaction_get_property(GObject* object,
         g_value_take_object(value, tx->common_currency);
         break;
     case PROP_POST_DATE:
-        g_value_set_boxed(value, &tx->date_posted);
+        time.t = tx->date_posted;
+        g_value_set_boxed(value, &time);
         break;
     case PROP_ENTER_DATE:
-        g_value_set_boxed(value, &tx->date_entered);
+        time.t = tx->date_entered;
+        g_value_set_boxed(value, &time);
         break;
     case PROP_INVOICE:
         qof_instance_get_kvp (QOF_INSTANCE (tx), value, 2, GNC_INVOICE_ID, GNC_INVOICE_GUID);
@@ -530,8 +533,12 @@ xaccTransDump (const Transaction *trans, const char *tag)
     GList *node;
 
     printf("%s Trans %p", tag, trans);
-    printf("    Entered:     %s\n", gnc_print_date(trans->date_entered));
-    printf("    Posted:      %s\n", gnc_print_date(trans->date_posted));
+    memset(datebuff, 0, sizeof(datebuff));
+    qof_print_date_buff(datebuff, sizeof(datebuff), trans->date_entered);
+    printf("    Entered:     %s\n", datebuff);
+    memset(datebuff, 0, sizeof(datebuff));
+    qof_print_date_buff(datebuff, sizeof(datebuff), trans->date_posted);
+    printf("    Posted:      %s\n", datebuff);
     printf("    Num:         %s\n", trans->num ? trans->num : "(null)");
     printf("    Description: %s\n",
            trans->description ? trans->description : "(null)");
@@ -1955,7 +1962,7 @@ xaccTransSetDatePostedSecs (Transaction *trans, time64 secs)
 {
     if (!trans) return;
     xaccTransSetDateInternal(trans, &trans->date_posted, secs);
-    set_gains_date_dirty (trans);
+    set_gains_date_dirty(trans);
 }
 
 void
@@ -1974,7 +1981,7 @@ xaccTransSetDatePostedGDate (Transaction *trans, GDate date)
 
     /* We additionally save this date into a kvp frame to ensure in
      * the future a date which was set as *date* (without time) can
-     * clearly be distinguished from the Timespec. */
+     * clearly be distinguished from the time64. */
     g_value_init (&v, G_TYPE_DATE);
     g_value_set_boxed (&v, &date);
     qof_instance_set_kvp (QOF_INSTANCE(trans), &v, 1, TRANS_DATE_POSTED);
@@ -1992,25 +1999,21 @@ xaccTransSetDateEnteredSecs (Transaction *trans, time64 secs)
 }
 
 static void
-qofTransSetDatePosted (Transaction *trans, Timespec ts)
+qofTransSetDatePosted (Transaction *trans, time64 time)
 {
     if (!trans) return;
-    if ((ts.tv_nsec == 0) && (ts.tv_sec == 0)) return;
     if (!qof_begin_edit(&trans->inst)) return;
-    xaccTransSetDateInternal(trans, &trans->date_posted, ts.tv_sec);
+    xaccTransSetDateInternal(trans, &trans->date_posted, time);
     set_gains_date_dirty(trans);
     qof_commit_edit(&trans->inst);
 }
 
 static void
-qofTransSetDateEntered (Transaction *trans, Timespec ts)
+qofTransSetDateEntered (Transaction *trans, time64 time)
 {
-    /*This is called from the query framework, so we'll leave the timespec
-     * until the query framework is converted, too.*/
     if (!trans) return;
-    if ((ts.tv_nsec == 0) && (ts.tv_sec == 0)) return;
     if (!qof_begin_edit(&trans->inst)) return;
-    xaccTransSetDateInternal(trans, &trans->date_entered, ts.tv_sec);
+    xaccTransSetDateInternal(trans, &trans->date_entered, time);
     qof_commit_edit(&trans->inst);
 }
 
@@ -2383,7 +2386,7 @@ xaccTransGetDatePostedGDate (const Transaction *trans)
              /* Well, this txn doesn't have a GDate saved in a
               * slot. Avoid getting the date in the local TZ by
               * converting to UTC before generating the
-              * date. (timespec_to_gdate doesn't do this so don't use
+              * date. (time64_to_gdate doesn't do this so don't use
               * it.
               */
              time64 time = xaccTransGetDate(trans);
@@ -2414,7 +2417,7 @@ xaccTransRetDateDue(const Transaction *trans)
     if (!trans) return 0;
     qof_instance_get_kvp (QOF_INSTANCE (trans), &v, 1, TRANS_DATE_DUE_KVP);
     if (G_VALUE_HOLDS_BOXED (&v))
-        ret = ((Timespec*)g_value_get_boxed (&v))->tv_sec;
+        ret = ((Time64*)g_value_get_boxed (&v))->t;
     if (!ret)
         return xaccTransRetDatePosted (trans);
     return ret;
@@ -2654,7 +2657,7 @@ xaccTransVoid(Transaction *trans, const char *reason)
     g_value_set_string (&v, reason);
     qof_instance_set_kvp (QOF_INSTANCE (trans), &v, 1, void_reason_str);
 
-    gnc_timespec_to_iso8601_buff (timespec_now (), iso8601_str);
+    gnc_time64_to_iso8601_buff (gnc_time(NULL), iso8601_str);
     g_value_set_string (&v, iso8601_str);
     qof_instance_set_kvp (QOF_INSTANCE (trans), &v, 1, void_time_str);
 
@@ -2939,39 +2942,6 @@ trans_is_balanced_p (const Transaction *trans)
     return trans ? xaccTransIsBalanced(trans) : FALSE;
 }
 
-static Timespec
-xaccTransRetDateEnteredTS (Transaction * trans)
-{
-    Timespec ret = {xaccTransRetDateEntered (trans), 0};
-    return ret;
-}
-
-static void
-qofTransSetDateEnteredTS (Transaction * trans, Timespec t)
-{
-    xaccTransSetDateEnteredSecs (trans, t.tv_sec);
-}
-
-static Timespec
-xaccTransRetDatePostedTS (Transaction * trans)
-{
-    Timespec ret = {xaccTransRetDatePosted (trans), 0};
-    return ret;
-}
-
-static void
-qofTransSetDatePostedTS (Transaction * trans, Timespec t)
-{
-    xaccTransSetDatePostedSecs (trans, t.tv_sec);
-}
-
-static Timespec
-xaccTransRetDateDueTS (Transaction * trans)
-{
-    Timespec ret = {xaccTransRetDateDue (trans), 0};
-    return ret;
-}
-
 gboolean xaccTransRegister (void)
 {
     static QofParam params[] =
diff --git a/libgnucash/engine/cap-gains.c b/libgnucash/engine/cap-gains.c
index 9d14d9e..f32f154 100644
--- a/libgnucash/engine/cap-gains.c
+++ b/libgnucash/engine/cap-gains.c
@@ -106,23 +106,21 @@ struct find_lot_s
 {
     GNCLot *lot;
     gnc_commodity *currency;
-    Timespec ts;
+    time64 time;
     int (*numeric_pred)(gnc_numeric);
-    gboolean (*date_pred)(Timespec e, Timespec tr);
+    gboolean (*date_pred)(time64 e, time64 tr);
 };
 
 static gboolean
-earliest_pred (Timespec earl, Timespec tran)
+earliest_pred (time64 earl, time64 tran)
 {
-    return ((earl.tv_sec > tran.tv_sec)  ||
-            ((earl.tv_sec == tran.tv_sec) && (earl.tv_nsec > tran.tv_nsec)));
+    return earl > tran;
 }
 
 static gboolean
-latest_pred (Timespec earl, Timespec tran)
+latest_pred (time64 earl, time64 tran)
 {
-    return ((earl.tv_sec < tran.tv_sec)  ||
-            ((earl.tv_sec == tran.tv_sec) && (earl.tv_nsec < tran.tv_nsec)));
+    return earl < tran;
 }
 
 static gpointer
@@ -133,7 +131,7 @@ finder_helper (GNCLot *lot,  gpointer user_data)
     Transaction *trans;
     gnc_numeric bal;
     gboolean opening_is_positive, bal_is_positive;
-    Timespec posted_ts = {0,0};
+    time64 posted = 0;
 
     if (gnc_lot_is_closed (lot)) return NULL;
 
@@ -158,10 +156,10 @@ finder_helper (GNCLot *lot,  gpointer user_data)
         return NULL;
     }
 
-    posted_ts.tv_sec = trans->date_posted;
-    if (els->date_pred (els->ts, posted_ts))
+    posted = trans->date_posted;
+    if (els->date_pred (els->time, posted))
     {
-        els->ts.tv_sec = trans->date_posted;
+        els->time = trans->date_posted;
         els->lot = lot;
     }
 
@@ -172,14 +170,13 @@ static inline GNCLot *
 xaccAccountFindOpenLot (Account *acc, gnc_numeric sign,
                         gnc_commodity *currency,
                         gint64 guess,
-                        gboolean (*date_pred)(Timespec, Timespec))
+                        gboolean (*date_pred)(time64, time64))
 {
     struct find_lot_s es;
 
     es.lot = NULL;
     es.currency = currency;
-    es.ts.tv_sec = guess;
-    es.ts.tv_nsec = 0;
+    es.time = guess;
     es.date_pred = date_pred;
 
     if (gnc_numeric_positive_p(sign)) es.numeric_pred = gnc_numeric_negative_p;
@@ -324,13 +321,12 @@ xaccSplitAssignToLot (Split *split, GNCLot *lot)
     /* If we are here, then (cmp == +1 iff (amt > baln)) and we need
      * to split up the split into pieces. Do it. */
     {
-        time64 now = gnc_time (NULL);
+        time64 now = gnc_time (NULL), time = 0;
         Split * new_split;
         gnc_numeric amt_a, amt_b, amt_tot;
         gnc_numeric val_a, val_b, val_tot;
         gnc_numeric frac;
         Transaction *trans;
-        Timespec ts;
 
         acc = split->acc;
         xaccAccountBeginEdit (acc);
@@ -400,8 +396,8 @@ xaccSplitAssignToLot (Split *split, GNCLot *lot)
          * split-action which is the same as xaccSplitGetAction */
         gnc_set_num_action(NULL, new_split, NULL, gnc_get_num_action(NULL, split));
         xaccSplitSetReconcile (new_split, xaccSplitGetReconcile (split));
-        ts = xaccSplitRetDateReconciledTS (split);
-        xaccSplitSetDateReconciledTS (new_split, &ts);
+        time = xaccSplitGetDateReconciled (split);
+        xaccSplitSetDateReconciledSecs (new_split, time);
 
         /* Set the lot-split and peer_guid properties on the two
          * splits to indicate that they're linked. 
diff --git a/libgnucash/engine/engine-helpers.c b/libgnucash/engine/engine-helpers.c
index f589346..f078c30 100644
--- a/libgnucash/engine/engine-helpers.c
+++ b/libgnucash/engine/engine-helpers.c
@@ -51,34 +51,6 @@ cannot be considered "standard" or public parts of QOF. */
 
 static QofLogModule log_module = GNC_MOD_ENGINE;
 
-Timespec
-gnc_transaction_get_date_posted(const Transaction *t)
-{
-    Timespec ret = {xaccTransRetDatePosted(t), 0};
-    return ret;
-}
-
-Timespec
-gnc_transaction_get_date_entered(const Transaction *t)
-{
-    Timespec result = {xaccTransRetDateEntered(t), 0};
-    return result;
-}
-
-Timespec
-gnc_split_get_date_reconciled(const Split *s)
-{
-    Timespec result;
-    xaccSplitGetDateReconciledTS(s, &result);
-    return(result);
-}
-
-void
-gnc_transaction_set_date(Transaction *t, Timespec ts)
-{
-    xaccTransSetDatePostedSecs(t, ts.tv_sec);
-}
-
 /** Gets the transaction Number or split Action based on book option:
   * if the book option is TRUE (split action is used for NUM) and a
   * split is provided, split-action is returned; if book option is FALSE
diff --git a/libgnucash/engine/engine-helpers.h b/libgnucash/engine/engine-helpers.h
index 757b5b4..6fc38a3 100644
--- a/libgnucash/engine/engine-helpers.h
+++ b/libgnucash/engine/engine-helpers.h
@@ -34,13 +34,6 @@
 
 typedef void (*GncBOCb)    (gpointer new_val, gpointer user_data);
 
-Timespec gnc_transaction_get_date_posted(const Transaction *t);
-Timespec gnc_transaction_get_date_entered(const Transaction *t);
-
-Timespec gnc_split_get_date_reconciled(const Split *s);
-
-void gnc_transaction_set_date(Transaction *t, Timespec ts);
-
 /** Gets the transaction Number or split Action based on book option:
   * if the book option is TRUE (split action is used for NUM) and a
   * split is provided, split-action is returned; if book option is FALSE
diff --git a/libgnucash/engine/qofinstance-p.h b/libgnucash/engine/qofinstance-p.h
index 801663c..8fcff1b 100644
--- a/libgnucash/engine/qofinstance-p.h
+++ b/libgnucash/engine/qofinstance-p.h
@@ -144,7 +144,7 @@ int qof_instance_compare_kvp (const QofInstance *a, const QofInstance *b);
 /** Returns a g_strdup'd string which must be g_freed. */
 char* qof_instance_kvp_as_string (const QofInstance *inst);
 void qof_instance_kvp_add_guid (const QofInstance *inst, const char* path,
-                                const Timespec time, const char* key,
+                                time64 time, const char* key,
                                 const GncGUID *guid);
 void qof_instance_kvp_remove_guid (const QofInstance *inst, const char *path,
                                    const char* key, const GncGUID *guid);
diff --git a/libgnucash/engine/qofinstance.cpp b/libgnucash/engine/qofinstance.cpp
index 0ce79c0..06ae8ca 100644
--- a/libgnucash/engine/qofinstance.cpp
+++ b/libgnucash/engine/qofinstance.cpp
@@ -1138,13 +1138,13 @@ qof_instance_kvp_as_string (const QofInstance *inst)
 
 void
 qof_instance_kvp_add_guid (const QofInstance *inst, const char* path,
-                           const Timespec time, const char *key,
+                           time64 time, const char *key,
                            const GncGUID *guid)
 {
     g_return_if_fail (inst->kvp_data != NULL);
 
     auto container = new KvpFrame;
-    Time64 t{time.tv_sec};
+    Time64 t{time};
     container->set({key}, new KvpValue(const_cast<GncGUID*>(guid)));
     container->set({"date"}, new KvpValue(t));
     delete inst->kvp_data->set_path({path}, new KvpValue(container));
diff --git a/libgnucash/engine/test-core/test-engine-stuff.cpp b/libgnucash/engine/test-core/test-engine-stuff.cpp
index a1da304..24caa5a 100644
--- a/libgnucash/engine/test-core/test-engine-stuff.cpp
+++ b/libgnucash/engine/test-core/test-engine-stuff.cpp
@@ -1267,7 +1267,7 @@ get_random_split(QofBook *book, Account *acct, Transaction *trn)
     const gchar *str;
     gnc_commodity *com;
     int scu, denom;
-    Timespec *ts;
+    time64 time;
 
     com = xaccTransGetCurrency (trn);
     scu = gnc_commodity_get_fraction(com);
@@ -1281,9 +1281,8 @@ get_random_split(QofBook *book, Account *acct, Transaction *trn)
 
     xaccSplitSetReconcile(ret, possible_chars[get_random_int_in_range(0, 3)]);
 
-    ts = get_random_timespec();
-    xaccSplitSetDateReconciledTS(ret, ts);
-    g_free(ts);
+    time = get_random_time();
+    xaccSplitSetDateReconciledSecs (ret, time);
 
     /* Split must be in an account before we can set an amount */
     /* and in a transaction before it can be added to an account. */
@@ -1364,7 +1363,7 @@ void
 make_random_changes_to_split (Split *split)
 {
     Transaction *trans;
-    Timespec *ts;
+    time64 time;
 
     g_return_if_fail (split);
 
@@ -1377,9 +1376,8 @@ make_random_changes_to_split (Split *split)
 
     xaccSplitSetReconcile (split, possible_chars[get_random_int_in_range(0, 3)]);
 
-    ts = get_random_timespec();
-    xaccSplitSetDateReconciledTS (split, ts);
-    g_free(ts);
+    time = get_random_time();
+    xaccSplitSetDateReconciledSecs (split, time);
 
     qof_instance_set_slots (QOF_INSTANCE (split), get_random_kvp_frame());
 
diff --git a/libgnucash/engine/test/utest-Split.cpp b/libgnucash/engine/test/utest-Split.cpp
index bbf296f..bdc8f3e 100644
--- a/libgnucash/engine/test/utest-Split.cpp
+++ b/libgnucash/engine/test/utest-Split.cpp
@@ -65,7 +65,7 @@ setup (Fixture *fixture, gconstpointer pData)
     GNCLot *lot = gnc_lot_new (book);
     gnc_numeric value = gnc_numeric_create (123, 240);
     gnc_numeric amount = gnc_numeric_create (321, 1000);
-    Timespec time = timespec_now ();
+    time64 time = gnc_time(NULL);
     Split *gains_split = xaccMallocSplit (book);
     fixture->curr = gnc_commodity_new (book, "Gnu Rand", "CURRENCY", "GNR", "", 240);
     fixture->comm = gnc_commodity_new (book, "Wildebeest Fund", "FUND", "WBFXX", "", 1000);
@@ -303,7 +303,7 @@ test_xaccDupeSplit (Fixture *fixture, gconstpointer pData)
     g_assert_cmpstr (split->action, ==, f_split->action);
     g_assert (compare (split->inst.kvp_data, f_split->inst.kvp_data) == 0);
     g_assert_cmpint (split->reconciled, ==, f_split->reconciled);
-    g_assert (timespec_equal (&(split->date_reconciled), &(f_split->date_reconciled)));
+    g_assert_cmpint (split->date_reconciled, ==, f_split->date_reconciled);
     g_assert (gnc_numeric_equal (split->value, f_split->value));
     g_assert (gnc_numeric_equal (split->amount, f_split->amount));
     /* xaccDupeSplit intentionally doesn't copy the balances */
@@ -338,7 +338,7 @@ test_xaccSplitCloneNoKvp (Fixture *fixture, gconstpointer pData)
     g_assert_cmpstr (split->action, ==, f_split->action);
     g_assert (split->inst.kvp_data->empty());
     g_assert_cmpint (split->reconciled, ==, f_split->reconciled);
-    g_assert (timespec_equal (&(split->date_reconciled), &(f_split->date_reconciled)));
+    g_assert_cmpint (split->date_reconciled, == , f_split->date_reconciled);
     g_assert (gnc_numeric_equal (split->value, f_split->value));
     g_assert (gnc_numeric_equal (split->amount, f_split->amount));
     g_assert (gnc_numeric_equal (split->balance, f_split->balance));
@@ -1204,14 +1204,14 @@ test_xaccSplitOrder (Fixture *fixture, gconstpointer pData)
     o_split->value = split->value;
     /* Make sure that it doesn't crash if o_split->date_reconciled == NULL */
     g_assert_cmpint (xaccSplitOrder (split, o_split), ==, 1);
-    o_split->date_reconciled = timespec_now();
-    o_split->date_reconciled.tv_sec -= 50;
+    o_split->date_reconciled = gnc_time(NULL);
+    o_split->date_reconciled -= 50;
     g_assert_cmpint (xaccSplitOrder (split, o_split), ==, 1);
-    o_split->date_reconciled.tv_sec += 100;
+    o_split->date_reconciled += 100;
     g_assert_cmpint (xaccSplitOrder (split, o_split), ==, -1);
 
-    o_split->date_reconciled.tv_sec = split->date_reconciled.tv_sec;
-    o_split->date_reconciled.tv_nsec = split->date_reconciled.tv_nsec;
+    o_split->date_reconciled = split->date_reconciled;
+    o_split->date_reconciled = split->date_reconciled;
 
     g_assert_cmpint (xaccSplitOrder (split, o_split), ==,
                      qof_instance_guid_compare (split, o_split));
diff --git a/libgnucash/engine/test/utest-Transaction.cpp b/libgnucash/engine/test/utest-Transaction.cpp
index 370addb..4a3e93c 100644
--- a/libgnucash/engine/test/utest-Transaction.cpp
+++ b/libgnucash/engine/test/utest-Transaction.cpp
@@ -408,7 +408,8 @@ test_gnc_transaction_set_get_property (Fixture *fixture, gconstpointer pData)
     gchar *t_num = NULL, *t_desc = NULL;
     gnc_commodity *curr = gnc_commodity_new (book, "Gnu Rand", "CURRENCY",
                           "GNR", "", 240), *t_curr = NULL;
-    Timespec now = timespec_now (), *t_entered = NULL, *t_posted = NULL;
+    time64 now = gnc_time(NULL);
+    Time64 *t_entered, *t_posted;
     g_assert_cmpstr (txn->num, ==, "");
     g_assert_cmpstr (txn->description, ==, "");
     g_assert (txn->common_currency == NULL);
@@ -427,8 +428,8 @@ test_gnc_transaction_set_get_property (Fixture *fixture, gconstpointer pData)
     g_assert_cmpstr (txn->num, ==, num);
     g_assert_cmpstr (txn->description, ==, desc);
     g_assert (txn->common_currency == curr);
-    g_assert (txn->date_entered == now.tv_sec);
-    g_assert (txn->date_posted == now.tv_sec);
+    g_assert (txn->date_entered == now);
+    g_assert (txn->date_posted == now);
 
     g_object_get (G_OBJECT (txn),
                   "num", &t_num,
@@ -441,8 +442,8 @@ test_gnc_transaction_set_get_property (Fixture *fixture, gconstpointer pData)
     g_assert_cmpstr (t_num, ==, num);
     g_assert_cmpstr (t_desc, ==, desc);
     g_assert (t_curr == curr);
-    g_assert (t_entered->tv_sec == now.tv_sec);
-    g_assert (t_posted->tv_sec == now.tv_sec);
+    g_assert_cmpint (t_entered->t, ==, now);
+    g_assert_cmpint (t_posted->t, ==, now);
     xaccTransRollbackEdit (txn);
     test_destroy (txn);
     test_destroy (curr);
@@ -1772,10 +1773,7 @@ test_xaccTransOrder_num_action (Fixture *fixture, gconstpointer pData)
  * xaccTransSetDatePostedSecs C: 17 in 13  Local: 0:0:0
  * xaccTransSetDatePostedGDate C: 1  Local: 1:0:0
  * xaccTransSetDateEnteredSecs C: 10 in 9  Local: 0:0:0
- * xaccTransSetDatePostedTS C: 9 in 8  Local: 2:0:0
- * xaccTransSetDateEnteredTS C: 3 in 3  Local: 1:0:0
  * xaccTransSetDate C: 43 in 23 SCM: 2 in 2 Local: 0:0:0
- * xaccTransSetDateDueTS C: 2 in 2  Local: 0:0:0
  * xaccTransSetTxnType C: 4 in 3  Local: 0:0:0
  * xaccTransClearReadOnly C: 4 in 2  Local: 1:0:0
  * xaccTransSetReadOnly C: 2 in 2  Local: 1:0:0
@@ -1843,7 +1841,7 @@ test_xaccTransVoid (Fixture *fixture, gconstpointer pData)
     auto frame = fixture->txn->inst.kvp_data;
     auto void_reason = "Voided for Unit Test";
     auto txn_notes = g_strdup (frame->get_slot({trans_notes_str})->get<const char*>());
-    Timespec now = timespec_now ();
+    time64 now = gnc_time(NULL);
     char iso8601_str[ISO_DATELENGTH + 1] = "";
     GList *split = NULL;
 
@@ -1854,7 +1852,7 @@ test_xaccTransVoid (Fixture *fixture, gconstpointer pData)
                      ==, txn_notes);
     g_assert_cmpstr (frame->get_slot({void_reason_str})->get<const char*>(), ==,
                      void_reason);
-    gnc_timespec_to_iso8601_buff (now, iso8601_str);
+    gnc_time64_to_iso8601_buff (now, iso8601_str);
     g_assert_cmpstr (frame->get_slot({void_time_str})->get<const char*>(), ==,
                      iso8601_str);
     g_assert_cmpstr (frame->get_slot({TRANS_READ_ONLY_REASON})->get<const char*>(),

commit fee589b28cb0c554109cb934c24fa573c1dd9757
Author: John Ralls <jralls at ceridwen.us>
Date:   Thu Aug 2 15:46:27 2018 -0700

    Remove Timespec from pricedb.
    
    Includes removing the time64 specialized functions because the regular ones
    handle time64 now.

diff --git a/bindings/python/gnucash_core.py b/bindings/python/gnucash_core.py
index 43fdabc..58e9429 100644
--- a/bindings/python/gnucash_core.py
+++ b/bindings/python/gnucash_core.py
@@ -375,10 +375,10 @@ class GncPriceDB(GnuCashCoreClass):
 GncPriceDB.add_methods_with_prefix('gnc_pricedb_')
 PriceDB_dict =  {
                 'lookup_latest' : GncPrice,
-                'lookup_nearest_in_time' : GncPrice,
-                'lookup_latest_before' : GncPrice,
+                'lookup_nearest_in_time64' : GncPrice,
+                'lookup_latest_before_t64' : GncPrice,
                 'convert_balance_latest_price' : GncNumeric,
-                'convert_balance_nearest_price' : GncNumeric,
+                'convert_balance_nearest_price_t64' : GncNumeric,
                 }
 methods_return_instance(GncPriceDB,PriceDB_dict)
 GncPriceDB.get_prices = method_function_returns_instance_list(
diff --git a/gnucash/gnome-utils/dialog-transfer.c b/gnucash/gnome-utils/dialog-transfer.c
index fb15697..f77a972 100644
--- a/gnucash/gnome-utils/dialog-transfer.c
+++ b/gnucash/gnome-utils/dialog-transfer.c
@@ -266,7 +266,7 @@ lookup_price(PriceReq *pr, PriceDate pd)
             break;
         case NEAREST:
             prc = gnc_pricedb_lookup_nearest_in_time64 (pr->pricedb, pr->from,
-                                                      pr->to, pr->time);
+                                                          pr->to, pr->time);
             break;
         case LATEST:
             prc = gnc_pricedb_lookup_latest (pr->pricedb, pr->from, pr->to);
diff --git a/gnucash/gnome-utils/gnc-tree-model-price.c b/gnucash/gnome-utils/gnc-tree-model-price.c
index 2192806..3656ec0 100644
--- a/gnucash/gnome-utils/gnc-tree-model-price.c
+++ b/gnucash/gnome-utils/gnc-tree-model-price.c
@@ -770,7 +770,7 @@ gnc_tree_model_price_get_value (GtkTreeModel *tree_model,
         break;
     case GNC_TREE_MODEL_PRICE_COL_DATE:
         qof_print_date_buff (datebuff, sizeof(datebuff),
-                             gnc_price_get_time (price));
+                             gnc_price_get_time64 (price));
         g_value_init (value, G_TYPE_STRING);
         g_value_set_string (value, datebuff);
         break;
diff --git a/gnucash/gnome-utils/window-main-summarybar.c b/gnucash/gnome-utils/window-main-summarybar.c
index 700c94d..aa56466 100644
--- a/gnucash/gnome-utils/window-main-summarybar.c
+++ b/gnucash/gnome-utils/window-main-summarybar.c
@@ -189,10 +189,11 @@ gnc_ui_accounts_recurse (Account *parent, GList **currency_list,
         case ACCT_TYPE_RECEIVABLE:
             end_amount = xaccAccountGetBalanceAsOfDate(account, options.end_date);
             end_amount_default_currency =
-                gnc_pricedb_convert_balance_nearest_price (pricedb, end_amount,
-                                                           account_currency,
-                                                           to_curr,
-                                                           options.end_date);
+                gnc_pricedb_convert_balance_nearest_price_t64 (pricedb,
+                                                               end_amount,
+                                                               account_currency,
+                                                               to_curr,
+                                                               options.end_date);
 
             if (!non_currency || options.non_currency)
             {
@@ -224,17 +225,18 @@ gnc_ui_accounts_recurse (Account *parent, GList **currency_list,
         case ACCT_TYPE_EXPENSE:
             start_amount = xaccAccountGetBalanceAsOfDate(account, options.start_date);
             start_amount_default_currency =
-                gnc_pricedb_convert_balance_nearest_price (pricedb,
-                                                           start_amount,
-                                                           account_currency,
-                                                           to_curr,
-                                                           options.start_date);
+                gnc_pricedb_convert_balance_nearest_price_t64 (pricedb,
+                                                              start_amount,
+                                                              account_currency,
+                                                              to_curr,
+                                                              options.start_date);
             end_amount = xaccAccountGetBalanceAsOfDate(account, options.end_date);
             end_amount_default_currency =
-                gnc_pricedb_convert_balance_nearest_price (pricedb, end_amount,
-                                                           account_currency,
-                                                           to_curr,
-                                                           options.end_date);
+                gnc_pricedb_convert_balance_nearest_price_t64 (pricedb,
+                                                               end_amount,
+                                                               account_currency,
+                                                               to_curr,
+                                                               options.end_date);
 
             if (!non_currency || options.non_currency)
             {
diff --git a/gnucash/report/locale-specific/us/taxtxf.scm b/gnucash/report/locale-specific/us/taxtxf.scm
index 1ec3fff..67b5a67 100644
--- a/gnucash/report/locale-specific/us/taxtxf.scm
+++ b/gnucash/report/locale-specific/us/taxtxf.scm
@@ -712,7 +712,7 @@
                               (begin ;; do so
                                 (set! missing-pricedb-entry? #f)
                                 (set! pricedb-lookup-price
-                                        (let ((price (gnc-pricedb-lookup-nearest-in-time64
+                                        (let ((price (gnc-pricedb-lookup-nearest-in-time-t64
                                           pricedb
                                           account-commodity
                                           USD-currency
@@ -725,9 +725,8 @@
                                         (gnc-price-get-value
                                                           pricedb-lookup-price))
                                 (set! pricedb-lookup-price-time
-                                        (gnc-price-get-time64
-                                                          pricedb-lookup-price))
-                                (gnc-pricedb-convert-balance-nearest-price
+                                        (gnc-price-get-time64 pricedb-lookup-price))
+                                (gnc-pricedb-convert-balance-nearest-price-t64
                                         pricedb
                                         (if neg?
                                             (gnc-numeric-neg splt-rpt-amount)
diff --git a/gnucash/report/report-system/commodity-utilities.scm b/gnucash/report/report-system/commodity-utilities.scm
index a6b8bbd..6d7b5dc 100644
--- a/gnucash/report/report-system/commodity-utilities.scm
+++ b/gnucash/report/report-system/commodity-utilities.scm
@@ -794,7 +794,7 @@
           (gnc:exchange-if-same foreign domestic)
           (gnc:make-gnc-monetary
            domestic
-           (gnc-pricedb-convert-balance-nearest-price
+           (gnc-pricedb-convert-balance-nearest-price-t64
             (gnc-pricedb-get-db (gnc-get-current-book))
             (gnc:gnc-monetary-amount foreign)
             (gnc:gnc-monetary-commodity foreign)
diff --git a/libgnucash/backend/xml/gnc-pricedb-xml-v2.cpp b/libgnucash/backend/xml/gnc-pricedb-xml-v2.cpp
index fbde09a..a8d228f 100644
--- a/libgnucash/backend/xml/gnc-pricedb-xml-v2.cpp
+++ b/libgnucash/backend/xml/gnc-pricedb-xml-v2.cpp
@@ -115,8 +115,7 @@ price_parse_xml_sub_node (GNCPrice* p, xmlNodePtr sub_node, QofBook* book)
     {
         time64 time = dom_tree_to_time64 (sub_node);
         if (!dom_tree_valid_time64 (time, sub_node->name)) time = 0;
-        Timespec ts {time, 0};
-        gnc_price_set_time (p, ts);
+        gnc_price_set_time64 (p, time);
     }
     else if (g_strcmp0 ("price:source", (char*)sub_node->name) == 0)
     {
@@ -416,7 +415,7 @@ gnc_price_to_dom_tree (const xmlChar* tag, GNCPrice* price)
     xmlNodePtr tmpnode;
     gnc_commodity* commodity;
     gnc_commodity* currency;
-    Timespec timesp;
+    time64 time;
     gnc_numeric value;
 
     if (! (tag && price)) return NULL;
@@ -438,8 +437,8 @@ gnc_price_to_dom_tree (const xmlChar* tag, GNCPrice* price)
     tmpnode = commodity_ref_to_dom_tree ("price:currency", currency);
     if (!add_child_or_kill_parent (price_xml, tmpnode)) return NULL;
 
-    timesp = gnc_price_get_time (price);
-    tmpnode = time64_to_dom_tree ("price:time", timesp.tv_sec);
+    time = gnc_price_get_time64 (price);
+    tmpnode = time64_to_dom_tree ("price:time", time);
     if (!add_child_or_kill_parent (price_xml, tmpnode)) return NULL;
 
     sourcestr = gnc_price_get_source_string (price);
diff --git a/libgnucash/backend/xml/io-gncxml-v1.cpp b/libgnucash/backend/xml/io-gncxml-v1.cpp
index c25b5cd..4a605ff 100644
--- a/libgnucash/backend/xml/io-gncxml-v1.cpp
+++ b/libgnucash/backend/xml/io-gncxml-v1.cpp
@@ -2961,8 +2961,7 @@ price_parse_xml_sub_node (GNCPrice* p, xmlNodePtr sub_node, QofBook* book)
     {
         time64 time = dom_tree_to_time64 (sub_node);
         if (!dom_tree_valid_time64 (time, sub_node->name)) time = 0;
-        Timespec ts = {time, 0};
-        gnc_price_set_time (p, ts);
+        gnc_price_set_time64 (p, time);
     }
     else if (g_strcmp0 ("price:source", (char*)sub_node->name) == 0)
     {
diff --git a/libgnucash/doc/design/engine.texi b/libgnucash/doc/design/engine.texi
index dea627e..2c1baf0 100644
--- a/libgnucash/doc/design/engine.texi
+++ b/libgnucash/doc/design/engine.texi
@@ -1551,7 +1551,7 @@ Return the commodity of @var{p}.
 Return the currency of @var{p}.
 @end deftypefun
 
- at deftypefun Timespec gnc_price_get_time (GNCPrice * @var{p})
+ at deftypefun time64 gnc_price_get_time64 (GNCPrice * @var{p})
 Return the time of @var{p}.
 @end deftypefun
 
@@ -1596,7 +1596,7 @@ Set the commodity of @var{p} to @var{c}.
 Set the currency of @var{p} to @var{c}.
 @end deftypefun
 
- at deftypefun void gnc_price_set_time (GNCPrice * @var{p}, Timespec @var{t})
+ at deftypefun void gnc_price_set_time64 (GNCPrice * @var{p}, time64 @var{t})
 Set the time of @var{p} to @var{t}.
 @end deftypefun
 
diff --git a/libgnucash/engine/Account.cpp b/libgnucash/engine/Account.cpp
index 5379b0a..141609d 100644
--- a/libgnucash/engine/Account.cpp
+++ b/libgnucash/engine/Account.cpp
@@ -3441,7 +3441,7 @@ xaccAccountConvertBalanceToCurrencyAsOfDate(const Account *acc, /* for book */
     book = gnc_account_get_book (acc);
     pdb = gnc_pricedb_get_db (book);
 
-    balance = gnc_pricedb_convert_balance_nearest_price(
+    balance = gnc_pricedb_convert_balance_nearest_price_t64(
                   pdb, balance, balance_currency, new_currency, date);
 
     return balance;
diff --git a/libgnucash/engine/engine.i b/libgnucash/engine/engine.i
index 45c62d6..9cc7c9d 100644
--- a/libgnucash/engine/engine.i
+++ b/libgnucash/engine/engine.i
@@ -97,10 +97,14 @@ functions. */
 %newobject gnc_pricedb_lookup_latest_any_currency;
 
 %newobject gnc_pricedb_lookup_nearest_in_time_any_currency;
+%newobject gnc_pricedb_lookup_nearest_in_time_any_currency_t64;
 %newobject gnc_pricedb_lookup_latest_before_any_currency;
+%newobject gnc_pricedb_lookup_latest_before_any_currency_t64;
 %newobject gnc_pricedb_get_prices;
 %newobject gnc_pricedb_lookup_at_time;
+%newobject gnc_pricedb_lookup_at_time64;
 %newobject gnc_pricedb_lookup_day;
+%newobject gnc_pricedb_lookup_day_t64;
 
 %newobject xaccQueryGetSplitsUniqueTrans;
 %newobject xaccQueryGetTransactions;
diff --git a/libgnucash/engine/gnc-pricedb-p.h b/libgnucash/engine/gnc-pricedb-p.h
index 249580f..06c611e 100644
--- a/libgnucash/engine/gnc-pricedb-p.h
+++ b/libgnucash/engine/gnc-pricedb-p.h
@@ -38,7 +38,7 @@ struct gnc_price_s
     GNCPriceDB *db;
     gnc_commodity *commodity;
     gnc_commodity *currency;
-    Timespec tmspec;
+    time64 tmspec;
     PriceSource source;
     char *type;
     gnc_numeric value;
@@ -82,7 +82,7 @@ typedef struct gnc_price_lookup_helper_s
 {
     GList    **return_list;
     gnc_commodity *key;
-    Timespec time;
+    time64 time;
 } GNCPriceLookupHelper;
 
 #define  gnc_price_set_guid(P,G)  qof_instance_set_guid(QOF_INSTANCE(P),(G))
diff --git a/libgnucash/engine/gnc-pricedb.c b/libgnucash/engine/gnc-pricedb.c
index d148570..e9f1594 100644
--- a/libgnucash/engine/gnc-pricedb.c
+++ b/libgnucash/engine/gnc-pricedb.c
@@ -27,6 +27,7 @@
 #include <glib.h>
 #include <string.h>
 #include <stdint.h>
+#include <stdlib.h>
 #include "gnc-date.h"
 #include "gnc-pricedb-p.h"
 #include <qofinstance-p.h>
@@ -38,7 +39,7 @@ static gboolean add_price(GNCPriceDB *db, GNCPrice *p);
 static gboolean remove_price(GNCPriceDB *db, GNCPrice *p, gboolean cleanup);
 static GNCPrice *lookup_nearest_in_time(GNCPriceDB *db, const gnc_commodity *c,
                                         const gnc_commodity *currency,
-                                        Timespec t, gboolean sameday);
+                                        time64 t, gboolean sameday);
 static gboolean
 pricedb_pricelist_traversal(GNCPriceDB *db,
                             gboolean (*f)(GList *p, gpointer user_data),
@@ -61,6 +62,13 @@ typedef struct
      gpointer value;
 } HashEntry;
 
+/* Like strcmp, returns -1 if a < b, +1 if a > b, and 0 if they're equal. */
+static inline int
+time64_cmp (time64 a, time64 b)
+{
+    return a < b ? -1 : a > b ? 1 : 0;
+}
+
 static void
 hash_entry_insert(gpointer key, gpointer val, gpointer user_data)
 {
@@ -179,7 +187,7 @@ gnc_price_set_property(GObject* object, guint prop_id, const GValue* value, GPar
 {
     GNCPrice* price;
     gnc_numeric* number;
-    Timespec* ts;
+    Time64* time;
 
     g_return_if_fail(GNC_IS_PRICE(object));
 
@@ -205,8 +213,8 @@ gnc_price_set_property(GObject* object, guint prop_id, const GValue* value, GPar
         gnc_price_set_currency(price, g_value_get_object(value));
         break;
     case PROP_DATE:
-        ts = g_value_get_boxed(value);
-        gnc_price_set_time(price, *ts);
+        time = g_value_get_boxed(value);
+        gnc_price_set_time64(price, time->t);
         break;
     default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
@@ -380,7 +388,7 @@ gnc_price_clone (GNCPrice* p, QofBook *book)
     gnc_price_begin_edit(new_p);
     /* never ever clone guid's */
     gnc_price_set_commodity(new_p, gnc_price_get_commodity(p));
-    gnc_price_set_time(new_p, gnc_price_get_time(p));
+    gnc_price_set_time64(new_p, gnc_price_get_time64(p));
     gnc_price_set_source(new_p, gnc_price_get_source(p));
     gnc_price_set_typestr(new_p, gnc_price_get_typestr(p));
     gnc_price_set_value(new_p, gnc_price_get_value(p));
@@ -397,7 +405,7 @@ gnc_price_invert (GNCPrice *p)
     GNCPrice *new_p = gnc_price_create (book);
     qof_instance_copy_version(new_p, p);
     gnc_price_begin_edit(new_p);
-    gnc_price_set_time(new_p, gnc_price_get_time(p));
+    gnc_price_set_time64(new_p, gnc_price_get_time64(p));
     gnc_price_set_source(new_p, PRICE_SOURCE_TEMP);
     gnc_price_set_typestr(new_p, gnc_price_get_typestr(p));
     gnc_price_set_commodity(new_p, gnc_price_get_currency(p));
@@ -499,10 +507,10 @@ gnc_price_set_currency(GNCPrice *p, gnc_commodity *c)
 }
 
 void
-gnc_price_set_time(GNCPrice *p, Timespec t)
+gnc_price_set_time64(GNCPrice *p, time64 t)
 {
     if (!p) return;
-    if (!timespec_equal(&(p->tmspec), &t))
+    if (p->tmspec != t)
     {
         /* Changing the datestamp requires the hash table
          * position to be modified. The easiest way of doing
@@ -519,27 +527,6 @@ gnc_price_set_time(GNCPrice *p, Timespec t)
 }
 
 void
-gnc_price_set_time64(GNCPrice *p, time64 t64)
-{
-    if (!p) return;
-    if (p->tmspec.tv_sec != t64)  // do we need to check nsec as well?
-    {
-        /* Changing the datestamp requires the hash table
-         * position to be modified. The easiest way of doing
-         * this is to remove and reinsert. */
-        gnc_price_ref (p);
-        remove_price (p->db, p, FALSE);
-        gnc_price_begin_edit (p);
-        p->tmspec.tv_sec = t64;
-	p->tmspec.tv_nsec = 0;
-        gnc_price_set_dirty(p);
-        gnc_price_commit_edit (p);
-        add_price (p->db, p);
-        gnc_price_unref (p);
-    }
-}
-
-void
 gnc_price_set_source(GNCPrice *p, PriceSource s)
 {
     if (!p) return;
@@ -616,21 +603,7 @@ gnc_price_get_commodity(const GNCPrice *p)
 time64
 gnc_price_get_time64(const GNCPrice *p)
 {
-    if (!p) return 0;
-    return p->tmspec.tv_sec;
-}
-
-Timespec
-gnc_price_get_time(const GNCPrice *p)
-{
-    if (!p)
-    {
-        Timespec result;
-        result.tv_sec = 0;
-        result.tv_nsec = 0;
-        return result;
-    }
-    return p->tmspec;
+    return p ? p->tmspec : 0;
 }
 
 PriceSource
@@ -675,8 +648,7 @@ gnc_price_get_currency(const GNCPrice *p)
 gboolean
 gnc_price_equal (const GNCPrice *p1, const GNCPrice *p2)
 {
-    Timespec ts1;
-    Timespec ts2;
+    time64 time1, time2;
 
     if (p1 == p2) return TRUE;
     if (!p1 || !p2) return FALSE;
@@ -689,10 +661,10 @@ gnc_price_equal (const GNCPrice *p1, const GNCPrice *p2)
                               gnc_price_get_currency (p2)))
         return FALSE;
 
-    ts1 = gnc_price_get_time (p1);
-    ts2 = gnc_price_get_time (p2);
+    time1 = gnc_price_get_time64 (p1);
+    time2 = gnc_price_get_time64 (p2);
 
-    if (!timespec_equal (&ts1, &ts2))
+    if (time1 != time2)
         return FALSE;
 
     if (gnc_price_get_source (p1) != gnc_price_get_source (p2))
@@ -715,18 +687,18 @@ gnc_price_equal (const GNCPrice *p1, const GNCPrice *p2)
 static gint
 compare_prices_by_date(gconstpointer a, gconstpointer b)
 {
-    Timespec time_a;
-    Timespec time_b;
+    time64 time_a, time_b;
     gint result;
 
     if (!a && !b) return 0;
     /* nothing is always less than something */
     if (!a) return -1;
 
-    time_a = gnc_price_get_time((GNCPrice *) a);
-    time_b = gnc_price_get_time((GNCPrice *) b);
+    time_a = gnc_price_get_time64((GNCPrice *) a);
+    time_b = gnc_price_get_time64((GNCPrice *) b);
 
-    result = -timespec_cmp(&time_a, &time_b);
+    /* Note we return -1 if time_b is before time_a. */
+    result = time64_cmp(time_b, time_a);
     if (result) return result;
 
     /* For a stable sort */
@@ -745,17 +717,17 @@ price_list_is_duplicate( gpointer data, gpointer user_data )
 {
     GNCPrice* pPrice = (GNCPrice*)data;
     PriceListIsDuplStruct* pStruct = (PriceListIsDuplStruct*)user_data;
-    Timespec time_a, time_b;
+    time64 time_a, time_b;
 
-    time_a = timespecCanonicalDayTime( gnc_price_get_time( pPrice ) );
-    time_b = timespecCanonicalDayTime( gnc_price_get_time( pStruct->pPrice ) );
+    time_a = time64CanonicalDayTime( gnc_price_get_time64( pPrice ) );
+    time_b = time64CanonicalDayTime( gnc_price_get_time64( pStruct->pPrice ) );
 
     /* If the date, currency, commodity and price match, it's a duplicate */
     if ( !gnc_numeric_equal( gnc_price_get_value( pPrice ),  gnc_price_get_value( pStruct->pPrice ) ) ) return;
     if ( gnc_price_get_commodity( pPrice ) != gnc_price_get_commodity( pStruct->pPrice ) ) return;
     if ( gnc_price_get_currency( pPrice ) != gnc_price_get_currency( pStruct->pPrice ) ) return;
 
-    if ( timespec_cmp( &time_a, &time_b ) != 0 ) return;
+    if (time_a != time_b) return;
 
     pStruct->isDupl = TRUE;
 }
@@ -1137,7 +1109,7 @@ add_price(GNCPriceDB *db, GNCPrice *p)
  * add this one. If this price is of equal or better precedence than the old
  * one, copy this one over the old one.
  */
-    old_price = gnc_pricedb_lookup_day (db, p->commodity, p->currency,
+    old_price = gnc_pricedb_lookup_day_t64 (db, p->commodity, p->currency,
                                         p->tmspec);
     if (!db->bulk_update && old_price != NULL)
     {
@@ -1299,15 +1271,18 @@ gboolean
 gnc_pricedb_remove_price(GNCPriceDB *db, GNCPrice *p)
 {
     gboolean rc;
+    char datebuff[MAX_DATE_LENGTH + 1];
+    memset(datebuff, 0, sizeof(datebuff));
     if (!db || !p) return FALSE;
     ENTER ("db=%p, pr=%p dirty=%d destroying=%d",
            db, p, qof_instance_get_dirty_flag(p),
            qof_instance_get_destroying(p));
 
     gnc_price_ref(p);
-
-    DEBUG("Remove Date is %s, Commodity is %s, Source is %s", gnc_print_date (gnc_price_get_time (p)),
-           gnc_commodity_get_fullname (gnc_price_get_commodity (p)), gnc_price_get_source_string (p));
+    qof_print_date_buff(datebuff, sizeof(datebuff), gnc_price_get_time64 (p));
+    DEBUG("Remove Date is %s, Commodity is %s, Source is %s", datebuff,
+          gnc_commodity_get_fullname (gnc_price_get_commodity (p)),
+          gnc_price_get_source_string (p));
 
     rc = remove_price (db, p, TRUE);
     gnc_pricedb_begin_edit(db);
@@ -1339,7 +1314,7 @@ check_one_price_date (GNCPrice *price, gpointer user_data)
 {
     remove_info *data = user_data;
     PriceSource source;
-    Timespec pt;
+    time64 time;
 
     ENTER("price %p (%s), data %p", price,
           gnc_commodity_get_mnemonic(gnc_price_get_commodity(price)),
@@ -1359,13 +1334,13 @@ check_one_price_date (GNCPrice *price, gpointer user_data)
         return TRUE;
     }
 
-    pt = gnc_price_get_time (price);
+    time = gnc_price_get_time64 (price);
     {
         gchar buf[40];
-        gnc_timespec_to_iso8601_buff(pt , buf);
+        gnc_time64_to_iso8601_buff(time, buf);
         DEBUG("checking date %s", buf);
     }
-    if (pt.tv_sec < data->cutoff)
+    if (time < data->cutoff)
     {
         data->list = g_slist_prepend(data->list, price);
         DEBUG("will delete");
@@ -1394,8 +1369,7 @@ pricedb_remove_foreach_pricelist (gpointer key,
 static gint
 compare_prices_by_commodity_date (gconstpointer a, gconstpointer b)
 {
-    Timespec time_a;
-    Timespec time_b;
+    time64 time_a, time_b;
     gnc_commodity *comma;
     gnc_commodity *commb;
     gnc_commodity *curra;
@@ -1419,10 +1393,11 @@ compare_prices_by_commodity_date (gconstpointer a, gconstpointer b)
     if (!gnc_commodity_equal(curra, currb))
         return gnc_commodity_compare(curra, currb);
 
-    time_a = gnc_price_get_time((GNCPrice *) a);
-    time_b = gnc_price_get_time((GNCPrice *) b);
+    time_a = gnc_price_get_time64((GNCPrice *) a);
+    time_b = gnc_price_get_time64((GNCPrice *) b);
 
-    result = -timespec_cmp(&time_a, &time_b);
+    /* Note we return -1 if time_b is before time_a. */
+    result = time64_cmp(time_b, time_a);
     if (result) return result;
 
     /* For a stable sort */
@@ -1448,7 +1423,7 @@ price_commodity_and_currency_equal (GNCPrice *a, GNCPrice *b)
 static void
 gnc_pricedb_remove_old_prices_pinfo (GNCPrice *price, gboolean keep_message)
 {
-    GDate price_date = timespec_to_gdate (gnc_price_get_time (price));
+    GDate price_date = time64_to_gdate (gnc_price_get_time64 (price));
     char date_buf[MAX_DATE_LENGTH+1];
 
     if (g_date_valid (&price_date))
@@ -1557,8 +1532,8 @@ gnc_pricedb_process_removal_list (GNCPriceDB *db, GDate *fiscal_end_date,
         }
 
         // get the price dates
-        saved_price_date = timespec_to_gdate (gnc_price_get_time (cloned_price));
-        next_price_date = timespec_to_gdate (gnc_price_get_time (item->data));
+        saved_price_date = time64_to_gdate (gnc_price_get_time64 (cloned_price));
+        next_price_date = time64_to_gdate (gnc_price_get_time64 (item->data));
 
         // Keep last price in fiscal year
         if (keep == PRICE_REMOVE_KEEP_LAST_PERIOD && save_first_price == FALSE)
@@ -1632,7 +1607,7 @@ gnc_pricedb_remove_old_prices (GNCPriceDB *db, GList *comm_list,
     remove_info data;
     GList *node;
     char datebuff[MAX_DATE_LENGTH + 1];
-    memset (datebuff, sizeof(datebuff), 0);
+    memset (datebuff, 0, sizeof(datebuff));
 
     data.db = db;
     data.cutoff = cutoff;
@@ -1810,8 +1785,7 @@ pricedb_get_prices_internal(GNCPriceDB *db, const gnc_commodity *commodity,
     return forward_list;
 }
 
-GNCPrice *
-gnc_pricedb_lookup_latest(GNCPriceDB *db,
+GNCPrice *gnc_pricedb_lookup_latest(GNCPriceDB *db,
                           const gnc_commodity *commodity,
                           const gnc_commodity *currency)
 {
@@ -1837,7 +1811,7 @@ typedef struct
 {
     GList **list;
     const gnc_commodity *com;
-    Timespec t;
+    time64 t;
 } UsesCommodity;
 
 /* price_list_scan_any_currency is the helper function used with
@@ -1875,8 +1849,8 @@ price_list_scan_any_currency(GList *price_list, gpointer data)
     while (node != NULL)
     {
         GNCPrice *price = node->data;
-        Timespec price_t = gnc_price_get_time(price);
-        if (timespec_cmp(&price_t, &helper->t) < 0)
+        time64 price_t = gnc_price_get_time64(price);
+        if (price_t < helper->t)
         {
             /* If there is a previous price add it to the results. */
             if (node->prev)
@@ -1917,7 +1891,7 @@ is_in_list (GList *list, const gnc_commodity *c)
  * want only the first one before the specified time containing both the target
  * and some other commodity. */
 static PriceList*
-latest_before (PriceList *prices, const gnc_commodity* target, Timespec t)
+latest_before (PriceList *prices, const gnc_commodity* target, time64 t)
 {
     GList *node, *found_coms = NULL, *retval = NULL;
     for (node = prices; node != NULL; node = g_list_next(node))
@@ -1925,8 +1899,8 @@ latest_before (PriceList *prices, const gnc_commodity* target, Timespec t)
         GNCPrice *price = (GNCPrice*)node->data;
         gnc_commodity *com = gnc_price_get_commodity(price);
         gnc_commodity *cur = gnc_price_get_currency(price);
-        Timespec price_t = gnc_price_get_time(price);
-        if (timespec_cmp(&t, &price_t) <= 0 ||
+        time64 price_t = gnc_price_get_time64(price);
+        if (t < price_t ||
             (com == target && is_in_list(found_coms, cur)) ||
             (cur == target && is_in_list(found_coms, com)))
             continue;
@@ -1957,14 +1931,14 @@ find_comtime(GPtrArray* array, gnc_commodity *com)
 
 static GList*
 add_nearest_price(GList *target_list, GPtrArray *price_array, GNCPrice *price,
-                  const gnc_commodity *target, Timespec t)
+                  const gnc_commodity *target, time64 t)
 {
         gnc_commodity *com = gnc_price_get_commodity(price);
         gnc_commodity *cur = gnc_price_get_currency(price);
-        Timespec price_t = gnc_price_get_time(price);
+        time64 price_t = gnc_price_get_time64(price);
         gnc_commodity *other = com == target ? cur : com;
         GNCPrice **com_price = find_comtime(price_array, other);
-        Timespec com_t;
+        time64 com_t;
         if (com_price == NULL)
         {
             com_price = (GNCPrice**)g_slice_new(gpointer);
@@ -1972,19 +1946,19 @@ add_nearest_price(GList *target_list, GPtrArray *price_array, GNCPrice *price,
             g_ptr_array_add(price_array, com_price);
             /* If the first price we see for this commodity is not newer than
                the target date add it to the return list. */
-            if (timespec_cmp(&price_t, &t) <= 0)
+            if (price_t <= t)
             {
                 gnc_price_ref(price);
                 target_list = g_list_prepend(target_list, price);
             }
             return target_list;
         }
-        com_t = gnc_price_get_time(*com_price);
-        if (timespec_cmp(&com_t, &t) <= 0)
+        com_t = gnc_price_get_time64(*com_price);
+        if (com_t <= t)
        /* No point in checking any more prices, they'll all be further from
         * t. */
             return target_list;
-        if (timespec_cmp(&price_t, &t) > 0)
+        if (price_t > t)
         /* The price list is sorted newest->oldest, so as long as this price
          * is newer than t then it should replace the saved one. */
         {
@@ -1992,9 +1966,9 @@ add_nearest_price(GList *target_list, GPtrArray *price_array, GNCPrice *price,
         }
         else
         {
-            Timespec com_diff = timespec_diff(&com_t, &t);
-            Timespec price_diff = timespec_diff(&t, &price_t);
-            if (timespec_cmp(&com_diff, &price_diff) < 0)
+            time64 com_diff = com_t - t;
+            time64 price_diff = t - price_t;
+            if (com_diff < price_diff)
             {
                 gnc_price_ref(*com_price);
                 target_list = g_list_prepend(target_list, *com_price);
@@ -2010,7 +1984,7 @@ add_nearest_price(GList *target_list, GPtrArray *price_array, GNCPrice *price,
 }
 
 static PriceList *
-nearest_to (PriceList *prices, const gnc_commodity* target, Timespec t)
+nearest_to (PriceList *prices, const gnc_commodity* target, time64 t)
 {
     GList *node, *retval = NULL;
     const guint prealloc_size = 5; /*More than 5 "other" is unlikely as long as
@@ -2032,8 +2006,8 @@ nearest_to (PriceList *prices, const gnc_commodity* target, Timespec t)
     for (index = 0; index < price_array->len; ++index)
     {
         GNCPrice **com_price = g_ptr_array_index(price_array, index);
-        Timespec price_t = gnc_price_get_time(*com_price);
-        if (timespec_cmp(&price_t, &t) >= 0)
+        time64 price_t = gnc_price_get_time64(*com_price);
+        if (price_t >= t)
         {
             gnc_price_ref(*com_price);
             retval = g_list_prepend(retval, *com_price);
@@ -2049,13 +2023,14 @@ PriceList *
 gnc_pricedb_lookup_latest_any_currency(GNCPriceDB *db,
                                        const gnc_commodity *commodity)
 {
-    return gnc_pricedb_lookup_latest_before_any_currency(db, commodity, timespec_now());
+    return gnc_pricedb_lookup_latest_before_any_currency_t64(db, commodity,
+                                                         gnc_time(NULL));
 }
 
 PriceList *
-gnc_pricedb_lookup_nearest_in_time_any_currency(GNCPriceDB *db,
-                                                const gnc_commodity *commodity,
-                                                Timespec t)
+gnc_pricedb_lookup_nearest_in_time_any_currency_t64(GNCPriceDB *db,
+                                                    const gnc_commodity *commodity,
+                                                    time64 t)
 {
     GList *prices = NULL, *result;
     UsesCommodity helper = {&prices, commodity, t};
@@ -2064,8 +2039,7 @@ gnc_pricedb_lookup_nearest_in_time_any_currency(GNCPriceDB *db,
     if (!db || !commodity) return NULL;
     ENTER ("db=%p commodity=%p", db, commodity);
 
-    pricedb_pricelist_traversal(db, price_list_scan_any_currency,
-                                       &helper);
+    pricedb_pricelist_traversal(db, price_list_scan_any_currency, &helper);
     prices = g_list_sort(prices, compare_prices_by_date);
     result = nearest_to(prices, commodity, t);
     gnc_price_list_destroy(prices);
@@ -2074,21 +2048,9 @@ gnc_pricedb_lookup_nearest_in_time_any_currency(GNCPriceDB *db,
 }
 
 PriceList *
-gnc_pricedb_lookup_nearest_in_time_any_currency_t64(GNCPriceDB *db,
-                                                    const gnc_commodity *commodity,
-                                                    time64 t64)
-{
-    Timespec t;
-    t.tv_sec = t64;
-    t.tv_nsec = 0;
-
-    return gnc_pricedb_lookup_nearest_in_time_any_currency(db, commodity, t);
-}
-
-PriceList *
-gnc_pricedb_lookup_latest_before_any_currency(GNCPriceDB *db,
-                                              const gnc_commodity *commodity,
-                                              Timespec t)
+gnc_pricedb_lookup_latest_before_any_currency_t64(GNCPriceDB *db,
+                                                  const gnc_commodity *commodity,
+                                                  time64 t)
 {
     GList *prices = NULL, *result;
     UsesCommodity helper = {&prices, commodity, t};
@@ -2288,31 +2250,19 @@ gnc_pricedb_nth_price (GNCPriceDB *db,
 }
 
 GNCPrice *
-gnc_pricedb_lookup_day(GNCPriceDB *db,
-                       const gnc_commodity *c,
-                       const gnc_commodity *currency,
-                       Timespec t)
-{
-    return lookup_nearest_in_time(db, c, currency, t, TRUE);
-}
-
-GNCPrice *
 gnc_pricedb_lookup_day_t64(GNCPriceDB *db,
-                       const gnc_commodity *c,
-                       const gnc_commodity *currency,
-                       time64 t64)
+                           const gnc_commodity *c,
+                           const gnc_commodity *currency,
+                           time64 t)
 {
-    Timespec t;
-    t.tv_sec = t64;
-    t.tv_nsec = 0;
     return lookup_nearest_in_time(db, c, currency, t, TRUE);
 }
 
 GNCPrice *
-gnc_pricedb_lookup_at_time(GNCPriceDB *db,
-                           const gnc_commodity *c,
-                           const gnc_commodity *currency,
-                           Timespec t)
+gnc_pricedb_lookup_at_time64(GNCPriceDB *db,
+                             const gnc_commodity *c,
+                             const gnc_commodity *currency,
+                             time64 t)
 {
     GList *price_list;
     GList *item = NULL;
@@ -2324,8 +2274,8 @@ gnc_pricedb_lookup_at_time(GNCPriceDB *db,
     while (item)
     {
         GNCPrice *p = item->data;
-        Timespec price_time = gnc_price_get_time(p);
-        if (timespec_equal(&price_time, &t))
+        time64 price_time = gnc_price_get_time64(p);
+        if (price_time == t)
         {
             gnc_price_ref(p);
             g_list_free (price_list);
@@ -2342,7 +2292,7 @@ static GNCPrice *
 lookup_nearest_in_time(GNCPriceDB *db,
                        const gnc_commodity *c,
                        const gnc_commodity *currency,
-                       Timespec t,
+                       time64 t,
                        gboolean sameday)
 {
     GList *price_list;
@@ -2352,7 +2302,7 @@ lookup_nearest_in_time(GNCPriceDB *db,
     GList *item = NULL;
 
     if (!db || !c || !currency) return NULL;
-    if (t.tv_sec == INT64_MAX) return NULL;
+    if (t == INT64_MAX) return NULL;
     ENTER ("db=%p commodity=%p currency=%p", db, c, currency);
     price_list = pricedb_get_prices_internal (db, c, currency, TRUE);
     if (!price_list) return NULL;
@@ -2366,8 +2316,8 @@ lookup_nearest_in_time(GNCPriceDB *db,
     while (!next_price && item)
     {
         GNCPrice *p = item->data;
-        Timespec price_time = gnc_price_get_time(p);
-        if (timespec_cmp(&price_time, &t) <= 0)
+        time64 price_time = gnc_price_get_time64(p);
+        if (price_time <= t)
         {
             next_price = item->data;
             break;
@@ -2385,11 +2335,11 @@ lookup_nearest_in_time(GNCPriceDB *db,
             if (sameday)
             {
                 /* Must be on the same day. */
-                Timespec price_day;
-                Timespec t_day;
-                price_day = timespecCanonicalDayTime(gnc_price_get_time(current_price));
-                t_day = timespecCanonicalDayTime(t);
-                if (!timespec_equal(&price_day, &t_day))
+                time64 price_day;
+                time64 t_day;
+                price_day = time64CanonicalDayTime(gnc_price_get_time64(current_price));
+                t_day = time64CanonicalDayTime(t);
+                if (price_day != t_day)
                     result = NULL;
             }
         }
@@ -2397,25 +2347,25 @@ lookup_nearest_in_time(GNCPriceDB *db,
         {
             /* If the requested time is not earlier than the first price on the
                list, then current_price and next_price will be the same. */
-            Timespec current_t = gnc_price_get_time(current_price);
-            Timespec next_t = gnc_price_get_time(next_price);
-            Timespec diff_current = timespec_diff(&current_t, &t);
-            Timespec diff_next = timespec_diff(&next_t, &t);
-            Timespec abs_current = timespec_abs(&diff_current);
-            Timespec abs_next = timespec_abs(&diff_next);
+            time64 current_t = gnc_price_get_time64(current_price);
+            time64 next_t = gnc_price_get_time64(next_price);
+            time64 diff_current = current_t - t;
+            time64 diff_next = next_t - t;
+            time64 abs_current = llabs(diff_current);
+            time64 abs_next = llabs(diff_next);
 
             if (sameday)
             {
                 /* Result must be on same day, see if either of the two isn't */
-                Timespec t_day = timespecCanonicalDayTime(t);
-                Timespec current_day = timespecCanonicalDayTime(current_t);
-                Timespec next_day = timespecCanonicalDayTime(next_t);
-                if (timespec_equal(&current_day, &t_day))
+                time64 t_day = time64CanonicalDayTime(t);
+                time64 current_day = time64CanonicalDayTime(current_t);
+                time64 next_day = time64CanonicalDayTime(next_t);
+                if (current_day == t_day)
                 {
-                    if (timespec_equal(&next_day, &t_day))
+                    if (next_day == t_day)
                     {
                         /* Both on same day, return nearest */
-                        if (timespec_cmp(&abs_current, &abs_next) < 0)
+                        if (abs_current < abs_next)
                             result = current_price;
                         else
                             result = next_price;
@@ -2424,7 +2374,7 @@ lookup_nearest_in_time(GNCPriceDB *db,
                         /* current_price on same day, next_price not */
                         result = current_price;
                 }
-                else if (timespec_equal(&next_day, &t_day))
+                else if (next_day == t_day)
                     /* next_price on same day, current_price not */
                     result = next_price;
             }
@@ -2433,7 +2383,7 @@ lookup_nearest_in_time(GNCPriceDB *db,
                 /* Choose the price that is closest to the given time. In case of
                  * a tie, prefer the older price since it actually existed at the
                  * time. (This also fixes bug #541970.) */
-                if (timespec_cmp(&abs_current, &abs_next) < 0)
+                if (abs_current < abs_next)
                 {
                     result = current_price;
                 }
@@ -2452,38 +2402,27 @@ lookup_nearest_in_time(GNCPriceDB *db,
 }
 
 GNCPrice *
-gnc_pricedb_lookup_nearest_in_time(GNCPriceDB *db,
-                                   const gnc_commodity *c,
-                                   const gnc_commodity *currency,
-                                   Timespec t)
-{
-    return lookup_nearest_in_time(db, c, currency, t, FALSE);
-}
-
-GNCPrice *
 gnc_pricedb_lookup_nearest_in_time64(GNCPriceDB *db,
                                      const gnc_commodity *c,
                                      const gnc_commodity *currency,
-                                     time64 t64)
+                                     time64 t)
 {
-    Timespec t;
-    t.tv_sec = t64;
-    t.tv_nsec = 0;
     return lookup_nearest_in_time(db, c, currency, t, FALSE);
 }
 
+
 GNCPrice *
-gnc_pricedb_lookup_latest_before (GNCPriceDB *db,
-                                  gnc_commodity *c,
-                                  gnc_commodity *currency,
-                                  Timespec t)
+gnc_pricedb_lookup_latest_before_t64 (GNCPriceDB *db,
+                                      gnc_commodity *c,
+                                      gnc_commodity *currency,
+                                      time64 t)
 {
     GList *price_list;
     GNCPrice *current_price = NULL;
     /*  GNCPrice *next_price = NULL;
         GNCPrice *result = NULL;*/
     GList *item = NULL;
-    Timespec price_time;
+    time64 price_time;
 
     if (!db || !c || !currency) return NULL;
     ENTER ("db=%p commodity=%p currency=%p", db, c, currency);
@@ -2492,12 +2431,12 @@ gnc_pricedb_lookup_latest_before (GNCPriceDB *db,
     item = price_list;
     do
     {
-        price_time = gnc_price_get_time (item->data);
-        if (timespec_cmp(&price_time, &t) <= 0)
+        price_time = gnc_price_get_time64 (item->data);
+        if (price_time <= t)
             current_price = item->data;
         item = item->next;
     }
-    while (timespec_cmp(&price_time, &t) > 0 && item);
+    while (price_time > t && item);
     gnc_price_ref(current_price);
     g_list_free (price_list);
     LEAVE (" ");
@@ -2678,11 +2617,11 @@ gnc_pricedb_convert_balance_latest_price(GNCPriceDB *pdb,
 }
 
 gnc_numeric
-gnc_pricedb_convert_balance_nearest_price(GNCPriceDB *pdb,
-        gnc_numeric balance,
-        const gnc_commodity *balance_currency,
-        const gnc_commodity *new_currency,
-        time64 t)
+gnc_pricedb_convert_balance_nearest_price_t64(GNCPriceDB *pdb,
+                                              gnc_numeric balance,
+                                              const gnc_commodity *balance_currency,
+                                              const gnc_commodity *new_currency,
+                                              time64 t)
 {
     gnc_numeric new_value;
 
@@ -3158,7 +3097,7 @@ price_printable(gpointer obj)
 #endif
 
     val = gnc_numeric_to_string (pr->value);
-    da = qof_print_date (pr->tmspec.tv_sec);
+    da = qof_print_date (pr->tmspec);
 
     commodity = gnc_price_get_commodity(pr);
     currency = gnc_price_get_currency(pr);
diff --git a/libgnucash/engine/gnc-pricedb.h b/libgnucash/engine/gnc-pricedb.h
index 61ed2c9..3fbefe4 100644
--- a/libgnucash/engine/gnc-pricedb.h
+++ b/libgnucash/engine/gnc-pricedb.h
@@ -238,8 +238,7 @@ void gnc_price_commit_edit (GNCPrice *p);
 
 void gnc_price_set_commodity(GNCPrice *p, gnc_commodity *c);
 void gnc_price_set_currency(GNCPrice *p, gnc_commodity *c);
-void gnc_price_set_time(GNCPrice *p, Timespec t);
-void gnc_price_set_time64(GNCPrice *p, time64 t64);
+void gnc_price_set_time64(GNCPrice *p, time64 t);
 void gnc_price_set_source(GNCPrice *p, PriceSource source);
 void gnc_price_set_source_string(GNCPrice *p, const char* s);
 void gnc_price_set_typestr(GNCPrice *p, const char* type);
@@ -257,7 +256,6 @@ void gnc_price_set_value(GNCPrice *p, gnc_numeric value);
 gnc_commodity * gnc_price_get_commodity(const GNCPrice *p);
 /*@ dependent @*/
 gnc_commodity * gnc_price_get_currency(const GNCPrice *p);
-Timespec        gnc_price_get_time(const GNCPrice *p);
 time64          gnc_price_get_time64(const GNCPrice *p);
 PriceSource     gnc_price_get_source(const GNCPrice *p);
 const char *    gnc_price_get_source_string(const GNCPrice *p);
@@ -463,21 +461,21 @@ PriceList * gnc_pricedb_get_prices(GNCPriceDB *db,
                                    const gnc_commodity *commodity,
                                    const gnc_commodity *currency);
 
-/** @brief Find the price between two commodities at a timespec.
+/** @brief Find the price between two commodities at a time64.
  *
  * The returned GNCPrice may be in either direction so check to ensure that its
  * value is correctly applied.
  * @param db The pricedb
  * @param commodity The first commodity
  * @param currency The second commodity
- * @param t The timespec at which to retrieve the price.
+ * @param t The time64 at which to retrieve the price.
  * @return A GNCPrice or NULL if none matches.
  */
 /* NOT USED */
-GNCPrice * gnc_pricedb_lookup_at_time(GNCPriceDB *db,
-                                       const gnc_commodity *commodity,
-                                       const gnc_commodity *currency,
-                                       Timespec t);
+GNCPrice * gnc_pricedb_lookup_at_time64(GNCPriceDB *db,
+                                        const gnc_commodity *commodity,
+                                        const gnc_commodity *currency,
+                                        time64 t);
 
 /** @brief Return the price between the two commodities on the indicated
  * day. Note that the notion of day might be distorted by changes in timezone.
@@ -491,15 +489,10 @@ GNCPrice * gnc_pricedb_lookup_at_time(GNCPriceDB *db,
  * according to the local timezone.
  * @return A GNCPrice or NULL on failure.
  */
-GNCPrice * gnc_pricedb_lookup_day(GNCPriceDB *db,
-                                  const gnc_commodity *commodity,
-                                  const gnc_commodity *currency,
-                                  Timespec t);
-
 GNCPrice * gnc_pricedb_lookup_day_t64(GNCPriceDB *db,
-                                  const gnc_commodity *commodity,
-                                  const gnc_commodity *currency,
-                                  time64 t64);
+                                      const gnc_commodity *commodity,
+                                      const gnc_commodity *currency,
+                                      time64 t);
 
 /** @brief Return the price between the two commoditiesz nearest to the given
  * time.
@@ -512,15 +505,10 @@ GNCPrice * gnc_pricedb_lookup_day_t64(GNCPriceDB *db,
  * @param t The time nearest to which the returned price should be.
  * @return A GNCPrice or NULL if no prices exist between the two commodities.
  */
-GNCPrice   * gnc_pricedb_lookup_nearest_in_time(GNCPriceDB *db,
-        const gnc_commodity *c,
-        const gnc_commodity *currency,
-        Timespec t);
-
 GNCPrice   * gnc_pricedb_lookup_nearest_in_time64(GNCPriceDB *db,
-        const gnc_commodity *c,
-        const gnc_commodity *currency,
-        time64 t);
+                                                  const gnc_commodity *c,
+                                                  const gnc_commodity *currency,
+                                                  time64 t);
 
 /** @brief Return the price nearest in time to that given between the given
  * commodity and every other.
@@ -534,12 +522,9 @@ GNCPrice   * gnc_pricedb_lookup_nearest_in_time64(GNCPriceDB *db,
  * @return A PriceList of prices for each commodity pair found or NULL if none
  * are.
  */
-PriceList * gnc_pricedb_lookup_nearest_in_time_any_currency(GNCPriceDB *db,
-        const gnc_commodity *c,
-        Timespec t);
 PriceList * gnc_pricedb_lookup_nearest_in_time_any_currency_t64(GNCPriceDB *db,
         const gnc_commodity *c,
-        time64 t64);
+        time64 t);
 
 /** @brief Return the latest price between the given commodities before the
  * given time.
@@ -553,10 +538,10 @@ PriceList * gnc_pricedb_lookup_nearest_in_time_any_currency_t64(GNCPriceDB *db,
  * @return A GNCPrice or NULL if no prices are found before t.
  */
 /* NOT USED, but see bug 743753 */
-GNCPrice * gnc_pricedb_lookup_latest_before(GNCPriceDB *db,
-        gnc_commodity *c,
-        gnc_commodity *currency,
-        Timespec t);
+GNCPrice * gnc_pricedb_lookup_latest_before_t64(GNCPriceDB *db,
+                                                gnc_commodity *c,
+                                                gnc_commodity *currency,
+                                                time64 t);
 
 /** @brief Return the latest price between the given commodity and any other
  * before the given time.
@@ -569,9 +554,9 @@ GNCPrice * gnc_pricedb_lookup_latest_before(GNCPriceDB *db,
  * @return A PriceList of prices for each commodity found or NULL if none are.
  */
 /* NOT USED, but see bug 743753 */
-PriceList * gnc_pricedb_lookup_latest_before_any_currency(GNCPriceDB *db,
+PriceList * gnc_pricedb_lookup_latest_before_any_currency_t64(GNCPriceDB *db,
                                                          const gnc_commodity *c,
-                                                          Timespec t);
+                                                              time64 t);
 
 
 /** @brief Convert a balance from one currency to another using the most recent
@@ -600,11 +585,11 @@ gnc_pricedb_convert_balance_latest_price(GNCPriceDB *pdb,
  * @return A new balance or gnc_numeric_zero if no price is available.
  */
 gnc_numeric
-gnc_pricedb_convert_balance_nearest_price(GNCPriceDB *pdb,
-                                          gnc_numeric balance,
-                                          const gnc_commodity *balance_currency,
-                                          const gnc_commodity *new_currency,
-                                          time64 t);
+gnc_pricedb_convert_balance_nearest_price_t64(GNCPriceDB *pdb,
+                                              gnc_numeric balance,
+                                              const gnc_commodity *balance_currency,
+                                              const gnc_commodity *new_currency,
+                                              time64 t);
 
 typedef gboolean (*GncPriceForeachFunc)(GNCPrice *p, gpointer user_data);
 
diff --git a/libgnucash/engine/test-core/test-engine-stuff.cpp b/libgnucash/engine/test-core/test-engine-stuff.cpp
index 045ac34..a1da304 100644
--- a/libgnucash/engine/test-core/test-engine-stuff.cpp
+++ b/libgnucash/engine/test-core/test-engine-stuff.cpp
@@ -647,7 +647,7 @@ make_random_changes_to_commodity_table (gnc_commodity_table *table)
 void
 make_random_changes_to_price (QofBook *book, GNCPrice *p)
 {
-    Timespec *ts;
+    time64 time;
     PriceSource ps;
     char *string;
     gnc_commodity *c;
@@ -662,9 +662,8 @@ make_random_changes_to_price (QofBook *book, GNCPrice *p)
     c = get_random_commodity (book);
     gnc_price_set_currency (p, c);
 
-    ts = get_random_timespec ();
-    gnc_price_set_time (p, *ts);
-    g_free (ts);
+    time = get_random_time ();
+    gnc_price_set_time64 (p, time);
 
     ps = (PriceSource)get_random_int_in_range((int)PRICE_SOURCE_EDIT_DLG,
                                               (int)PRICE_SOURCE_INVALID);
diff --git a/libgnucash/engine/test/utest-Account.cpp b/libgnucash/engine/test/utest-Account.cpp
index 4e59778..7c14615 100644
--- a/libgnucash/engine/test/utest-Account.cpp
+++ b/libgnucash/engine/test/utest-Account.cpp
@@ -1962,7 +1962,7 @@ test_xaccAccountGetPresentBalance (Fixture *fixture, gconstpointer pData)
  * xaccAccountConvertBalanceToCurrency
  * xaccAccountConvertBalanceToCurrencyAsOfDate are wrappers around
  * gnc_pricedb_convert_balance_latest_price and
- * gnc_pricedb_convert_balance_nearest_price. Don't test.
+ * gnc_pricedb_convert_balance_nearest_price_t64. Don't test.
  *
  * The rest of these are convenience functions that wrap
  * xaccAccountConvertBalanceToCurrency* with one of the balance getter
diff --git a/libgnucash/engine/test/utest-Budget.c b/libgnucash/engine/test/utest-Budget.c
index fd311d1..6b188a4 100644
--- a/libgnucash/engine/test/utest-Budget.c
+++ b/libgnucash/engine/test/utest-Budget.c
@@ -1924,7 +1924,7 @@ test_xaccAccountGetPresentBalance (Fixture *fixture, gconstpointer pData)
  * xaccAccountConvertBalanceToCurrency
  * xaccAccountConvertBalanceToCurrencyAsOfDate are wrappers around
  * gnc_pricedb_convert_balance_latest_price and
- * gnc_pricedb_convert_balance_nearest_price. Don't test.
+ * gnc_pricedb_convert_balance_nearest_price_t64. Don't test.
  *
  * The rest of these are convenience functions that wrap
  * xaccAccountConvertBalanceToCurrency* with one of the balance getter
diff --git a/libgnucash/engine/test/utest-gnc-pricedb.c b/libgnucash/engine/test/utest-gnc-pricedb.c
index 841260a..670bf6f 100644
--- a/libgnucash/engine/test/utest-gnc-pricedb.c
+++ b/libgnucash/engine/test/utest-gnc-pricedb.c
@@ -70,12 +70,12 @@ setup_commodities (QofBook *book)
  */
 static GNCPrice *
 construct_price(QofBook *book, gnc_commodity *com, gnc_commodity *cur,
-                Timespec t, PriceSource source, gnc_numeric price)
+                time64 t, PriceSource source, gnc_numeric price)
 {
     GNCPrice *p = gnc_price_create(book);
     gnc_price_set_commodity(p, com);
     gnc_price_set_currency(p, cur);
-    gnc_price_set_time(p, t);
+    gnc_price_set_time64(p, t);
     gnc_price_set_source(p, source);
     gnc_price_set_value(p, price);
     return p;
@@ -229,12 +229,12 @@ gnc_price_set_currency(GNCPrice *p, gnc_commodity *c)// C: 7 in 7 SCM: 1  Local:
 test_gnc_price_set_currency (Fixture *fixture, gconstpointer pData)
 {
 }*/
-/* gnc_price_set_time
+/* gnc_price_set_time64
 void
-gnc_price_set_time(GNCPrice *p, Timespec t)// C: 9 in 7 SCM: 2 in 1 Local: 2:0:0
+gnc_price_set_time64(GNCPrice *p, time64 t)// C: 9 in 7 SCM: 2 in 1 Local: 2:0:0
 */
 /* static void
-test_gnc_price_set_time (Fixture *fixture, gconstpointer pData)
+test_gnc_price_set_time64 (Fixture *fixture, gconstpointer pData)
 {
 }*/
 /* gnc_price_set_source
@@ -285,12 +285,12 @@ gnc_price_get_commodity(const GNCPrice *p)// C: 12 in 5  Local: 20:1:0
 test_gnc_price_get_commodity (Fixture *fixture, gconstpointer pData)
 {
 }*/
-/* gnc_price_get_time
-Timespec
-gnc_price_get_time(const GNCPrice *p)// C: 7 in 4 SCM: 1  Local: 18:1:0
+/* gnc_price_get_time64
+time64
+gnc_price_get_time64(const GNCPrice *p)// C: 7 in 4 SCM: 1  Local: 18:1:0
 */
 /* static void
-test_gnc_price_get_time (Fixture *fixture, gconstpointer pData)
+test_gnc_price_get_time64 (Fixture *fixture, gconstpointer pData)
 {
 }*/
 /* gnc_price_get_source
@@ -412,171 +412,171 @@ create_some_prices (PriceDBFixture *fixture)
     Commodities *c = fixture->com;
     gnc_pricedb_set_bulk_update(db, TRUE);
     gnc_pricedb_add_price(db, construct_price(book, c->usd, c->aud,
-                                              gnc_dmy2timespec(11, 4, 2009),
+                                              gnc_dmy2time64(11, 4, 2009),
                                               PRICE_SOURCE_FQ,
                                             gnc_numeric_create(131190, 10000)));
     gnc_pricedb_add_price(db, construct_price(book, c->usd, c->aud,
-                                              gnc_dmy2timespec(12, 4, 2009),
+                                              gnc_dmy2time64(12, 4, 2009),
                                               PRICE_SOURCE_USER_PRICE,
                                             gnc_numeric_create(131190, 10000)));
     gnc_pricedb_add_price(db, construct_price(book, c->usd, c->aud,
-                                              gnc_dmy2timespec(21, 8, 2010),
+                                              gnc_dmy2time64(21, 8, 2010),
                                               PRICE_SOURCE_FQ,
                                             gnc_numeric_create(111794, 10000)));
     gnc_pricedb_add_price(db, construct_price(book, c->usd, c->aud,
-                                              gnc_dmy2timespec(1, 8, 2013),
+                                              gnc_dmy2time64(1, 8, 2013),
                                               PRICE_SOURCE_FQ,
                                            gnc_numeric_create(111878, 100000)));
     gnc_pricedb_add_price(db, construct_price(book, c->usd, c->aud,
-                                              gnc_dmy2timespec(12, 11, 2014),
+                                              gnc_dmy2time64(12, 11, 2014),
                                               PRICE_SOURCE_FQ,
                                            gnc_numeric_create(114784, 100000)));
     gnc_pricedb_add_price(db, construct_price(book, c->gbp, c->usd,
-                                              gnc_dmy2timespec(11, 4, 2009),
+                                              gnc_dmy2time64(11, 4, 2009),
                                               PRICE_SOURCE_FQ,
                                            gnc_numeric_create(166651, 100000)));
     gnc_pricedb_add_price(db, construct_price(book, c->aud, c->usd,
-                                              gnc_dmy2timespec(20, 7, 2011),
+                                              gnc_dmy2time64(20, 7, 2011),
                                               PRICE_SOURCE_FQ,
                                            gnc_numeric_create(106480, 100000)));
     gnc_pricedb_add_price(db, construct_price(book, c->aud, c->usd,
-                                              gnc_dmy2timespec(17, 11, 2012),
+                                              gnc_dmy2time64(17, 11, 2012),
                                               PRICE_SOURCE_FQ,
                                            gnc_numeric_create(103415, 100000)));
     gnc_pricedb_add_price(db, construct_price(book, c->gbp, c->usd,
-                                              gnc_dmy2timespec(21, 8, 2010),
+                                              gnc_dmy2time64(21, 8, 2010),
                                               PRICE_SOURCE_FQ,
                                            gnc_numeric_create(159037, 100000)));
     gnc_pricedb_add_price(db, construct_price(book, c->gbp, c->usd,
-                                              gnc_dmy2timespec(20, 7, 2011),
+                                              gnc_dmy2time64(20, 7, 2011),
                                               PRICE_SOURCE_FQ,
                                            gnc_numeric_create(161643, 100000)));
     gnc_pricedb_add_price(db, construct_price(book, c->gbp, c->usd,
-                                              gnc_dmy2timespec(17, 11, 2012),
+                                              gnc_dmy2time64(17, 11, 2012),
                                               PRICE_SOURCE_FQ,
                                            gnc_numeric_create(158855, 100000)));
     gnc_pricedb_add_price(db, construct_price(book, c->gbp, c->usd,
-                                              gnc_dmy2timespec(13, 10, 2012),
+                                              gnc_dmy2time64(13, 10, 2012),
                                               PRICE_SOURCE_FQ,
                                            gnc_numeric_create(160705, 100000)));
     gnc_pricedb_add_price(db, construct_price(book, c->gbp, c->usd,
-                                              gnc_dmy2timespec(1, 8, 2013),
+                                              gnc_dmy2time64(1, 8, 2013),
                                               PRICE_SOURCE_FQ,
                                            gnc_numeric_create(151173, 100000)));
     gnc_pricedb_add_price(db, construct_price(book, c->gbp, c->usd,
-                                              gnc_dmy2timespec(12, 11, 2014),
+                                              gnc_dmy2time64(12, 11, 2014),
                                               PRICE_SOURCE_FQ,
                                            gnc_numeric_create(157658, 100000)));
     gnc_pricedb_add_price(db, construct_price(book, c->gbp, c->eur,
-                                              gnc_dmy2timespec(11, 4, 2009),
+                                              gnc_dmy2time64(11, 4, 2009),
                                               PRICE_SOURCE_FQ,
                                            gnc_numeric_create(111257, 100000)));
     gnc_pricedb_add_price(db, construct_price(book, c->gbp, c->eur,
-                                              gnc_dmy2timespec(21, 8, 2010),
+                                              gnc_dmy2time64(21, 8, 2010),
                                               PRICE_SOURCE_FQ,
                                            gnc_numeric_create(122195, 100000)));
     gnc_pricedb_add_price(db, construct_price(book, c->gbp, c->eur,
-                                              gnc_dmy2timespec(20, 7, 2011),
+                                              gnc_dmy2time64(20, 7, 2011),
                                               PRICE_SOURCE_FQ,
                                            gnc_numeric_create(113289, 100000)));
     gnc_pricedb_add_price(db, construct_price(book, c->gbp, c->eur,
-                                              gnc_dmy2timespec(17, 11, 2012),
+                                              gnc_dmy2time64(17, 11, 2012),
                                               PRICE_SOURCE_FQ,
                                            gnc_numeric_create(124646, 100000)));
     gnc_pricedb_add_price(db, construct_price(book, c->gbp, c->eur,
-                                              gnc_dmy2timespec(13, 10, 2012),
+                                              gnc_dmy2time64(13, 10, 2012),
                                               PRICE_SOURCE_FQ,
                                            gnc_numeric_create(124072, 100000)));
     gnc_pricedb_add_price(db, construct_price(book, c->gbp, c->eur,
-                                              gnc_dmy2timespec(1, 8, 2013),
+                                              gnc_dmy2time64(1, 8, 2013),
                                               PRICE_SOURCE_FQ,
                                            gnc_numeric_create(114420, 100000)));
     gnc_pricedb_add_price(db, construct_price(book, c->gbp, c->eur,
-                                              gnc_dmy2timespec(12, 11, 2014),
+                                              gnc_dmy2time64(12, 11, 2014),
                                               PRICE_SOURCE_FQ,
                                            gnc_numeric_create(126836, 100000)));
     gnc_pricedb_add_price(db, construct_price(book, c->usd, c->dkk,
-                                              gnc_dmy2timespec(11, 4, 2009),
+                                              gnc_dmy2time64(11, 4, 2009),
                                               PRICE_SOURCE_FQ,
                                            gnc_numeric_create(567859, 100000)));
     gnc_pricedb_add_price(db, construct_price(book, c->usd, c->dkk,
-                                              gnc_dmy2timespec(21, 8, 2010),
+                                              gnc_dmy2time64(21, 8, 2010),
                                               PRICE_SOURCE_FQ,
                                            gnc_numeric_create(585810, 100000)));
     gnc_pricedb_add_price(db, construct_price(book, c->usd, c->dkk,
-                                              gnc_dmy2timespec(20, 7, 2011),
+                                              gnc_dmy2time64(20, 7, 2011),
                                               PRICE_SOURCE_FQ,
                                            gnc_numeric_create(522449, 100000)));
     gnc_pricedb_add_price(db, construct_price(book, c->usd, c->dkk,
-                                              gnc_dmy2timespec(17, 11, 2012),
+                                              gnc_dmy2time64(17, 11, 2012),
                                               PRICE_SOURCE_FQ,
                                            gnc_numeric_create(585380, 100000)));
     gnc_pricedb_add_price(db, construct_price(book, c->usd, c->dkk,
-                                              gnc_dmy2timespec(1, 8, 2013),
+                                              gnc_dmy2time64(1, 8, 2013),
                                               PRICE_SOURCE_FQ,
                                            gnc_numeric_create(564281, 100000)));
     gnc_pricedb_add_price(db, construct_price(book, c->usd, c->dkk,
-                                              gnc_dmy2timespec(12, 11, 2014),
+                                              gnc_dmy2time64(12, 11, 2014),
                                               PRICE_SOURCE_FQ,
                                            gnc_numeric_create(598693, 100000)));
     gnc_pricedb_add_price(db, construct_price(book, c->amzn, c->usd,
-                                              gnc_dmy2timespec(13, 4, 2009),
+                                              gnc_dmy2time64(13, 4, 2009),
                                               PRICE_SOURCE_FQ,
                                               gnc_numeric_create(7805, 100)));
     gnc_pricedb_add_price(db, construct_price(book, c->amzn, c->usd,
-                                              gnc_dmy2timespec(23, 8, 2010),
+                                              gnc_dmy2time64(23, 8, 2010),
                                               PRICE_SOURCE_FQ,
                                               gnc_numeric_create(12664, 100)));
     gnc_pricedb_add_price(db, construct_price(book, c->amzn, c->usd,
-                                              gnc_dmy2timespec(25, 7, 2011),
+                                              gnc_dmy2time64(25, 7, 2011),
                                               PRICE_SOURCE_FQ,
                                               gnc_numeric_create(22252, 100)));
     gnc_pricedb_add_price(db, construct_price(book, c->amzn, c->usd,
-                                              gnc_dmy2timespec(19, 11, 2012),
+                                              gnc_dmy2time64(19, 11, 2012),
                                               PRICE_SOURCE_FQ,
                                               gnc_numeric_create(23988, 100)));
     gnc_pricedb_add_price(db, construct_price(book, c->amzn, c->usd,
-                                              gnc_dmy2timespec(5, 8, 2013),
+                                              gnc_dmy2time64(5, 8, 2013),
                                               PRICE_SOURCE_FQ,
                                               gnc_numeric_create(29726, 100)));
     gnc_pricedb_add_price(db, construct_price(book, c->amzn, c->usd,
-                                              gnc_dmy2timespec(12, 11, 2014),
+                                              gnc_dmy2time64(12, 11, 2014),
                                               PRICE_SOURCE_FQ,
                                               gnc_numeric_create(31151, 100)));
     gnc_pricedb_add_price(db, construct_price(book, c->gbp, c->eur,
-                                              gnc_dmy2timespec(12, 05, 2007),
+                                              gnc_dmy2time64(12, 05, 2007),
                                               PRICE_SOURCE_USER_PRICE,
                                               gnc_numeric_create(126836, 100000)));
     gnc_pricedb_add_price(db, construct_price(book, c->gbp, c->eur,
-                                              gnc_dmy2timespec(12, 05, 2008),
+                                              gnc_dmy2time64(12, 05, 2008),
                                               PRICE_SOURCE_FQ,
                                               gnc_numeric_create(126836, 100000)));
     gnc_pricedb_add_price(db, construct_price(book, c->gbp, c->eur,
-                                              gnc_dmy2timespec(13, 05, 2008),
+                                              gnc_dmy2time64(13, 05, 2008),
                                               PRICE_SOURCE_USER_PRICE,
                                               gnc_numeric_create(126836, 100000)));
     gnc_pricedb_add_price(db, construct_price(book, c->gbp, c->eur,
-                                              gnc_dmy2timespec(14, 05, 2008),
+                                              gnc_dmy2time64(14, 05, 2008),
                                               PRICE_SOURCE_USER_PRICE,
                                               gnc_numeric_create(126836, 100000)));
     gnc_pricedb_add_price(db, construct_price(book, c->gbp, c->eur,
-                                              gnc_dmy2timespec(19, 05, 2008),
+                                              gnc_dmy2time64(19, 05, 2008),
                                               PRICE_SOURCE_FQ,
                                               gnc_numeric_create(126836, 100000)));
     gnc_pricedb_add_price(db, construct_price(book, c->gbp, c->eur,
-                                              gnc_dmy2timespec(22, 05, 2008),
+                                              gnc_dmy2time64(22, 05, 2008),
                                               PRICE_SOURCE_FQ,
                                               gnc_numeric_create(126836, 100000)));
     gnc_pricedb_add_price(db, construct_price(book, c->gbp, c->eur,
-                                              gnc_dmy2timespec(12, 06, 2008),
+                                              gnc_dmy2time64(12, 06, 2008),
                                               PRICE_SOURCE_FQ,
                                               gnc_numeric_create(126836, 100000)));
     gnc_pricedb_add_price(db, construct_price(book, c->gbp, c->eur,
-                                              gnc_dmy2timespec(12, 07, 2008),
+                                              gnc_dmy2time64(12, 07, 2008),
                                               PRICE_SOURCE_FQ,
                                               gnc_numeric_create(126836, 100000)));
     gnc_pricedb_add_price(db, construct_price(book, c->gbp, c->eur,
-                                              gnc_dmy2timespec(12, 11, 2008),
+                                              gnc_dmy2time64(12, 11, 2008),
                                               PRICE_SOURCE_FQ,
                                               gnc_numeric_create(126836, 100000)));
     gnc_pricedb_set_bulk_update(db, FALSE);
@@ -876,11 +876,11 @@ test_gnc_pricedb_lookup_latest (PriceDBFixture *fixture, gconstpointer pData)
     GNCPrice *price2, *price = gnc_pricedb_lookup_latest(fixture->pricedb,
                                                          fixture->com->gbp,
                                                          fixture->com->eur);
-    Timespec t = gnc_dmy2timespec(12, 11, 2014);
-    Timespec price_time = gnc_price_get_time(price);
+    time64 t = gnc_dmy2time64(12, 11, 2014);
+    time64 price_time = gnc_price_get_time64(price);
     g_assert(gnc_price_get_commodity(price) == fixture->com->gbp);
     g_assert(gnc_price_get_currency(price) == fixture->com->eur);
-    g_assert(timespec_equal(&price_time, &t));
+    g_assert_cmpint(price_time, ==, t);
     price2 = gnc_pricedb_lookup_latest(fixture->pricedb, fixture->com->eur,
                                       fixture->com->gbp);
     g_assert(price2 == price);
@@ -910,7 +910,7 @@ test_is_in_list (Fixture *fixture, gconstpointer pData)
 }*/
 /* latest_before
 static PriceList*
-latest_before (PriceList *prices, const gnc_commodity* target, Timespec t)// Local: 2:0:0
+latest_before (PriceList *prices, const gnc_commodity* target, time64 t)// Local: 2:0:0
 */
 /* static void
 test_latest_before (Fixture *fixture, gconstpointer pData)
@@ -934,7 +934,7 @@ test_add_nearest_price (Fixture *fixture, gconstpointer pData)
 }*/
 /* nearest_to
 static PriceList *
-nearest_to (PriceList *prices, const gnc_commodity* target, Timespec t)// Local: 1:0:0
+nearest_to (PriceList *prices, const gnc_commodity* target, time64 t)// Local: 1:0:0
 */
 /* static void
 test_nearest_to (PriceDBFixture *fixture, gconstpointer pData)
@@ -974,26 +974,28 @@ test_gnc_pricedb_lookup_latest_any_currency (PriceDBFixture *fixture, gconstpoin
     gnc_price_list_destroy(prices);
 }
 // Make Static
-/* gnc_pricedb_lookup_nearest_in_time_any_currency
+/* gnc_pricedb_lookup_nearest_in_time_any_currency_t64
 PriceList *
-gnc_pricedb_lookup_nearest_in_time_any_currency(GNCPriceDB *db,// Local: 2:0:0
+gnc_pricedb_lookup_nearest_in_time_any_currency_t64(GNCPriceDB *db,// Local: 2:0:0
 */
 static void
-test_gnc_pricedb_lookup_nearest_in_time_any_currency (PriceDBFixture *fixture, gconstpointer pData)
+test_gnc_pricedb_lookup_nearest_in_time_any_currency_t64 (PriceDBFixture *fixture, gconstpointer pData)
 {
-    Timespec t1 = gnc_dmy2timespec(25, 3, 2013);
-    Timespec t2 = gnc_dmy2timespec(26, 3, 2013);
+    time64 t1 = gnc_dmy2time64(25, 3, 2013);
+    time64 t2 = gnc_dmy2time64(26, 3, 2013);
     PriceList *prices =
-        gnc_pricedb_lookup_nearest_in_time_any_currency(fixture->pricedb,
-                                                        fixture->com->usd, t1);
+        gnc_pricedb_lookup_nearest_in_time_any_currency_t64(fixture->pricedb,
+                                                            fixture->com->usd,
+                                                            t1);
     g_assert_cmpint(g_list_length(prices), ==, 4);
     prices = g_list_sort(prices, compare_price_commodities);
     g_assert_cmpstr(GET_COM_NAME(prices->next->data), ==, "AUD");
     g_assert_cmpstr(GET_CUR_NAME(prices->next->data), ==, "USD");
     gnc_price_list_destroy(prices);
     prices =
-        gnc_pricedb_lookup_nearest_in_time_any_currency(fixture->pricedb,
-                                                        fixture->com->usd, t2);
+        gnc_pricedb_lookup_nearest_in_time_any_currency_t64(fixture->pricedb,
+                                                            fixture->com->usd,
+                                                            t2);
     g_assert_cmpint(g_list_length(prices), ==, 4);
     prices = g_list_sort(prices, compare_price_commodities);
     g_assert_cmpstr(GET_CUR_NAME(prices->next->data), ==, "AUD");
@@ -1002,18 +1004,18 @@ test_gnc_pricedb_lookup_nearest_in_time_any_currency (PriceDBFixture *fixture, g
 }
 
 // Not Used
-/* gnc_pricedb_lookup_latest_before_any_currency
+/* gnc_pricedb_lookup_latest_before_any_currency_t64
 PriceList *
-gnc_pricedb_lookup_latest_before_any_currency(GNCPriceDB *db,// Local: 0:0:0
+gnc_pricedb_lookup_latest_before_any_currency_t64(GNCPriceDB *db,// Local: 0:0:0
 */
 static void
-test_gnc_pricedb_lookup_latest_before_any_currency (PriceDBFixture *fixture,
+test_gnc_pricedb_lookup_latest_before_any_currency_t64 (PriceDBFixture *fixture,
                                                     gconstpointer pData)
 {
-    Timespec t1 = gnc_dmy2timespec(31, 7, 2013);
-    Timespec t2 = gnc_dmy2timespec(5, 8, 2013);
+    time64 t1 = gnc_dmy2time64(31, 7, 2013);
+    time64 t2 = gnc_dmy2time64(5, 8, 2013);
     PriceList *prices =
-        gnc_pricedb_lookup_latest_before_any_currency(fixture->pricedb,
+        gnc_pricedb_lookup_latest_before_any_currency_t64(fixture->pricedb,
                                                         fixture->com->usd, t1);
     g_assert_cmpint(g_list_length(prices), ==, 4);
     prices = g_list_sort(prices, compare_price_commodities);
@@ -1021,7 +1023,7 @@ test_gnc_pricedb_lookup_latest_before_any_currency (PriceDBFixture *fixture,
     g_assert_cmpstr(GET_CUR_NAME(prices->next->data), ==, "USD");
     gnc_price_list_destroy(prices);
     prices =
-        gnc_pricedb_lookup_latest_before_any_currency(fixture->pricedb,
+        gnc_pricedb_lookup_latest_before_any_currency_t64(fixture->pricedb,
                                                         fixture->com->usd, t2);
     g_assert_cmpint(g_list_length(prices), ==, 4);
     prices = g_list_sort(prices, compare_price_commodities);
@@ -1062,31 +1064,31 @@ test_gnc_pricedb_get_prices (PriceDBFixture *fixture, gconstpointer pData)
     g_assert_cmpint(g_list_length(prices), ==, 5);
     gnc_price_list_destroy(prices);
 }
-/* gnc_pricedb_lookup_day
+/* gnc_pricedb_lookup_day_t64
 GNCPrice *
-gnc_pricedb_lookup_day(GNCPriceDB *db,// C: 4 in 2 SCM: 2 in 1 Local: 1:0:0
+gnc_pricedb_lookup_day_t64(GNCPriceDB *db,// C: 4 in 2 SCM: 2 in 1 Local: 1:0:0
 */
 static void
-test_gnc_pricedb_lookup_day (PriceDBFixture *fixture, gconstpointer pData)
+test_gnc_pricedb_lookup_day_t64 (PriceDBFixture *fixture, gconstpointer pData)
 {
     gchar *msg1 = "[gnc_dmy2timespec_internal()] Date computation error from Y-M-D 12-11-18: Year is out of valid range: 1400..10000";
     gint loglevel = G_LOG_LEVEL_WARNING | G_LOG_FLAG_FATAL;
     gchar *logdomain = "qof.engine";
     TestErrorStruct check = {loglevel, logdomain, msg1, 0};
     GLogFunc hdlr = g_log_set_default_handler ((GLogFunc)test_null_handler, &check);
-    Timespec t = gnc_dmy2timespec(17, 11, 2012);
-    GNCPrice *price = gnc_pricedb_lookup_day(fixture->pricedb,
+    time64 t = gnc_dmy2time64(17, 11, 2012);
+    GNCPrice *price = gnc_pricedb_lookup_day_t64(fixture->pricedb,
                                              fixture->com->usd,
                                              fixture->com->gbp, t);
     g_assert_cmpstr(GET_COM_NAME(price), ==, "GBP");
-    t.tv_sec += 20247; /* A random number of seconds later, still the same day.*/
-    price = gnc_pricedb_lookup_day(fixture->pricedb,
+    t += 20247; /* A random number of seconds later, still the same day.*/
+    price = gnc_pricedb_lookup_day_t64(fixture->pricedb,
                                    fixture->com->usd,
                                    fixture->com->gbp, t);
     g_assert_cmpstr(GET_COM_NAME(price), ==, "GBP");
     g_test_log_set_fatal_handler ((GTestLogFatalFunc)test_checked_handler, &check);
-    t = gnc_dmy2timespec(18, 11, 12);
-    price = gnc_pricedb_lookup_day(fixture->pricedb,
+    t = gnc_dmy2time64(18, 11, 12);
+    price = gnc_pricedb_lookup_day_t64(fixture->pricedb,
                                    fixture->com->usd,
                                    fixture->com->gbp, t);
     g_assert(price == NULL);
@@ -1094,9 +1096,9 @@ test_gnc_pricedb_lookup_day (PriceDBFixture *fixture, gconstpointer pData)
 }
 
 // Not Used
-/* gnc_pricedb_lookup_at_time
+/* gnc_pricedb_lookup_at_time64
 GNCPrice *
-gnc_pricedb_lookup_at_time(GNCPriceDB *db,// Local: 0:0:0
+gnc_pricedb_lookup_at_time64(GNCPriceDB *db,// Local: 0:0:0
 */
 /* lookup_nearest_in_time
 static GNCPrice *
@@ -1105,30 +1107,32 @@ lookup_nearest_in_time(GNCPriceDB *db,// Local: 2:0:0
 /* test_lookup_nearest_in_time (Fixture *fixture, gconstpointer pData)
 {
 }*/
-/* gnc_pricedb_lookup_nearest_in_time
+/* gnc_pricedb_lookup_nearest_in_time64
 GNCPrice *
-gnc_pricedb_lookup_nearest_in_time(GNCPriceDB *db,// C: 2 in 1  Local: 1:0:0
+gnc_pricedb_lookup_nearest_in_time64(GNCPriceDB *db,// C: 2 in 1  Local: 1:0:0
 */
 static void
-test_gnc_pricedb_lookup_nearest_in_time (PriceDBFixture *fixture, gconstpointer pData)
+test_gnc_pricedb_lookup_nearest_in_time64 (PriceDBFixture *fixture, gconstpointer pData)
 {
-    Timespec t1 = gnc_dmy2timespec(25, 3, 2013);
-    Timespec t2 = gnc_dmy2timespec(26, 3, 2013);
+    time64 t1 = gnc_dmy2time64(25, 3, 2013);
+    time64 t2 = gnc_dmy2time64(26, 3, 2013);
     GNCPrice *price =
-        gnc_pricedb_lookup_nearest_in_time(fixture->pricedb, fixture->com->usd,
-                                           fixture->com->aud, t1);
+        gnc_pricedb_lookup_nearest_in_time64(fixture->pricedb,
+                                             fixture->com->usd,
+                                             fixture->com->aud, t1);
     g_assert_cmpstr(GET_COM_NAME(price), ==, "AUD");
     g_assert_cmpstr(GET_CUR_NAME(price), ==, "USD");
     price =
-        gnc_pricedb_lookup_nearest_in_time(fixture->pricedb, fixture->com->usd,
-                                           fixture->com->aud, t2);
+        gnc_pricedb_lookup_nearest_in_time64(fixture->pricedb,
+                                             fixture->com->usd,
+                                             fixture->com->aud, t2);
     g_assert_cmpstr(GET_CUR_NAME(price), ==, "AUD");
     g_assert_cmpstr(GET_COM_NAME(price), ==, "USD");
 }
 // Not Used
-/* gnc_pricedb_lookup_latest_before
+/* gnc_pricedb_lookup_latest_before_t64
 GNCPrice *
-gnc_pricedb_lookup_latest_before (GNCPriceDB *db,// Local: 0:0:0
+gnc_pricedb_lookup_latest_before_t64 (GNCPriceDB *db,// Local: 0:0:0
 */
 /* direct_balance_conversion
 static gnc_numeric
@@ -1199,39 +1203,47 @@ test_gnc_pricedb_convert_balance_latest_price (PriceDBFixture *fixture, gconstpo
 
 
 }
-/* gnc_pricedb_convert_balance_nearest_price
+/* gnc_pricedb_convert_balance_nearest_price_t64
 gnc_numeric
-gnc_pricedb_convert_balance_nearest_price(GNCPriceDB *pdb,// C: 1  Local: 0:0:0
+gnc_pricedb_convert_balance_nearest_price_t64(GNCPriceDB *pdb,// C: 1  Local: 0:0:0
 */
 static void
-test_gnc_pricedb_convert_balance_nearest_price (PriceDBFixture *fixture, gconstpointer pData)
+test_gnc_pricedb_convert_balance_nearest_price_t64 (PriceDBFixture *fixture, gconstpointer pData)
 {
     time64 t = gnc_dmy2time64(15, 8, 2011);
     gnc_numeric from = gnc_numeric_create(10000, 100);
     gnc_numeric result =
-        gnc_pricedb_convert_balance_nearest_price(fixture->pricedb, from,
-                                                 fixture->com->usd,
-                                                 fixture->com->aud, t);
+        gnc_pricedb_convert_balance_nearest_price_t64(fixture->pricedb, from,
+                                                      fixture->com->usd,
+                                                      fixture->com->aud, t);
     g_assert_cmpint(result.num, ==, 9391);
     g_assert_cmpint(result.denom, ==, 100);
-    result = gnc_pricedb_convert_balance_nearest_price(fixture->pricedb, from,
-                                                      fixture->com->usd,
-                                                      fixture->com->gbp, t);
+    result = gnc_pricedb_convert_balance_nearest_price_t64(fixture->pricedb,
+                                                           from,
+                                                           fixture->com->usd,
+                                                           fixture->com->gbp,
+                                                           t);
     g_assert_cmpint(result.num, ==, 6186);
     g_assert_cmpint(result.denom, ==, 100);
-    result = gnc_pricedb_convert_balance_nearest_price(fixture->pricedb, from,
-                                                      fixture->com->usd,
-                                                      fixture->com->eur, t);
+    result = gnc_pricedb_convert_balance_nearest_price_t64(fixture->pricedb,
+                                                           from,
+                                                           fixture->com->usd,
+                                                           fixture->com->eur,
+                                                           t);
     g_assert_cmpint(result.num, ==, 7009);
     g_assert_cmpint(result.denom, ==, 100);
-    result = gnc_pricedb_convert_balance_nearest_price(fixture->pricedb, from,
-                                                      fixture->com->gbp,
-                                                      fixture->com->dkk, t);
+    result = gnc_pricedb_convert_balance_nearest_price_t64(fixture->pricedb,
+                                                           from,
+                                                           fixture->com->gbp,
+                                                           fixture->com->dkk,
+                                                           t);
     g_assert_cmpint(result.num, ==, 84450);
     g_assert_cmpint(result.denom, ==, 100);
-    result = gnc_pricedb_convert_balance_nearest_price(fixture->pricedb, from,
-                                                      fixture->com->amzn,
-                                                      fixture->com->aud, t);
+    result = gnc_pricedb_convert_balance_nearest_price_t64(fixture->pricedb,
+                                                           from,
+                                                           fixture->com->amzn,
+                                                           fixture->com->aud,
+                                                           t);
     g_assert_cmpint(result.num, ==, 2089782);
     g_assert_cmpint(result.denom, ==, 100);
 
@@ -1426,14 +1438,14 @@ test_suite_gnc_pricedb (void)
 // GNC_TEST_ADD (suitename, "gnc price set dirty", Fixture, NULL, setup, test_gnc_price_set_dirty, teardown);
 // GNC_TEST_ADD (suitename, "gnc price set commodity", Fixture, NULL, setup, test_gnc_price_set_commodity, teardown);
 // GNC_TEST_ADD (suitename, "gnc price set currency", Fixture, NULL, setup, test_gnc_price_set_currency, teardown);
-// GNC_TEST_ADD (suitename, "gnc price set time", Fixture, NULL, setup, test_gnc_price_set_time, teardown);
+// GNC_TEST_ADD (suitename, "gnc price set time", Fixture, NULL, setup, test_gnc_price_set_time64, teardown);
 // GNC_TEST_ADD (suitename, "gnc price set source", Fixture, NULL, setup, test_gnc_price_set_source, teardown);
 // GNC_TEST_ADD (suitename, "gnc price set source string", Fixture, NULL, setup, test_gnc_price_set_source_string, teardown);
 // GNC_TEST_ADD (suitename, "gnc price set typestr", Fixture, NULL, setup, test_gnc_price_set_typestr, teardown);
 // GNC_TEST_ADD (suitename, "gnc price set value", Fixture, NULL, setup, test_gnc_price_set_value, teardown);
 // GNC_TEST_ADD (suitename, "gnc price lookup", Fixture, NULL, setup, test_gnc_price_lookup, teardown);
 // GNC_TEST_ADD (suitename, "gnc price get commodity", Fixture, NULL, setup, test_gnc_price_get_commodity, teardown);
-// GNC_TEST_ADD (suitename, "gnc price get time", Fixture, NULL, setup, test_gnc_price_get_time, teardown);
+// GNC_TEST_ADD (suitename, "gnc price get time", Fixture, NULL, setup, test_gnc_price_get_time64, teardown);
 // GNC_TEST_ADD (suitename, "gnc price get source", Fixture, NULL, setup, test_gnc_price_get_source, teardown);
 // GNC_TEST_ADD (suitename, "gnc price get source string", Fixture, NULL, setup, test_gnc_price_get_source_string, teardown);
 // GNC_TEST_ADD (suitename, "gnc price get typestr", Fixture, NULL, setup, test_gnc_price_get_typestr, teardown);
@@ -1478,20 +1490,20 @@ test_suite_gnc_pricedb (void)
 // GNC_TEST_ADD (suitename, "add nearest price", Fixture, NULL, setup, test_add_nearest_price, teardown);
 // GNC_TEST_ADD (suitename, "nearest to", Fixture, NULL, setup, test_nearest_to, teardown);
     GNC_TEST_ADD (suitename, "gnc pricedb lookup latest any currency", PriceDBFixture, NULL, setup, test_gnc_pricedb_lookup_latest_any_currency, teardown);
-    GNC_TEST_ADD (suitename, "gnc pricedb lookup nearest in time any currency", PriceDBFixture, NULL, setup, test_gnc_pricedb_lookup_nearest_in_time_any_currency, teardown);
-    GNC_TEST_ADD (suitename, "gnc pricedb lookup latest before any currency", PriceDBFixture, NULL, setup, test_gnc_pricedb_lookup_latest_before_any_currency, teardown);
+    GNC_TEST_ADD (suitename, "gnc pricedb lookup nearest in time any currency", PriceDBFixture, NULL, setup, test_gnc_pricedb_lookup_nearest_in_time_any_currency_t64, teardown);
+    GNC_TEST_ADD (suitename, "gnc pricedb lookup latest before any currency", PriceDBFixture, NULL, setup, test_gnc_pricedb_lookup_latest_before_any_currency_t64, teardown);
 // GNC_TEST_ADD (suitename, "hash values helper", PriceDBFixture, NULL, setup, test_hash_values_helper, teardown);
     GNC_TEST_ADD (suitename, "gnc pricedb has prices", PriceDBFixture, NULL, setup, test_gnc_pricedb_has_prices, teardown);
     GNC_TEST_ADD (suitename, "gnc pricedb get prices", PriceDBFixture, NULL, setup, test_gnc_pricedb_get_prices, teardown);
-    GNC_TEST_ADD (suitename, "gnc pricedb lookup day", PriceDBFixture, NULL, setup, test_gnc_pricedb_lookup_day, teardown);
+    GNC_TEST_ADD (suitename, "gnc pricedb lookup day", PriceDBFixture, NULL, setup, test_gnc_pricedb_lookup_day_t64, teardown);
 // GNC_TEST_ADD (suitename, "lookup nearest in time", Fixture, NULL, setup, test_lookup_nearest_in_time, teardown);
-    GNC_TEST_ADD (suitename, "gnc pricedb lookup nearest in time", PriceDBFixture, NULL, setup, test_gnc_pricedb_lookup_nearest_in_time, teardown);
+    GNC_TEST_ADD (suitename, "gnc pricedb lookup nearest in time", PriceDBFixture, NULL, setup, test_gnc_pricedb_lookup_nearest_in_time64, teardown);
 // GNC_TEST_ADD (suitename, "direct balance conversion", Fixture, NULL, setup, test_direct_balance_conversion, teardown);
 // GNC_TEST_ADD (suitename, "extract common prices", Fixture, NULL, setup, test_extract_common_prices, teardown);
 // GNC_TEST_ADD (suitename, "convert balance", Fixture, NULL, setup, test_convert_balance, teardown);
 // GNC_TEST_ADD (suitename, "indirect balance conversion", Fixture, NULL, setup, test_indirect_balance_conversion, teardown);
     GNC_TEST_ADD (suitename, "gnc pricedb convert balance latest price", PriceDBFixture, NULL, setup, test_gnc_pricedb_convert_balance_latest_price, teardown);
-    GNC_TEST_ADD (suitename, "gnc pricedb convert balance nearest price", PriceDBFixture, NULL, setup, test_gnc_pricedb_convert_balance_nearest_price, teardown);
+    GNC_TEST_ADD (suitename, "gnc pricedb convert balance nearest price", PriceDBFixture, NULL, setup, test_gnc_pricedb_convert_balance_nearest_price_t64, teardown);
 // GNC_TEST_ADD (suitename, "pricedb foreach pricelist", Fixture, NULL, setup, test_pricedb_foreach_pricelist, teardown);
 // GNC_TEST_ADD (suitename, "pricedb foreach currencies hash", Fixture, NULL, setup, test_pricedb_foreach_currencies_hash, teardown);
 // GNC_TEST_ADD (suitename, "unstable price traversal", Fixture, NULL, setup, test_unstable_price_traversal, teardown);

commit 92a8cf330aece720dd02cc85d181d3bffbcaee08
Author: John Ralls <jralls at ceridwen.us>
Date:   Thu Aug 2 13:55:24 2018 -0700

    Timespec->time64 in business code.

diff --git a/gnucash/gnome/dialog-payment.c b/gnucash/gnome/dialog-payment.c
index 39465a8..ef3a9ea 100644
--- a/gnucash/gnome/dialog-payment.c
+++ b/gnucash/gnome/dialog-payment.c
@@ -973,9 +973,9 @@ gnc_payment_ok_cb (G_GNUC_UNUSED GtkWidget *widget, gpointer data)
         else
             auto_pay = gnc_prefs_get_bool (GNC_PREFS_GROUP_BILL, GNC_PREF_AUTO_PAY);
 
-        gncOwnerApplyPayment (&pw->owner, &(pw->tx_info->txn), selected_lots,
-                              pw->post_acct, pw->xfer_acct, pw->amount_tot,
-                              exch, t, memo, num, auto_pay);
+        gncOwnerApplyPaymentSecs (&pw->owner, &(pw->tx_info->txn), selected_lots,
+                                  pw->post_acct, pw->xfer_acct, pw->amount_tot,
+                                  exch, t, memo, num, auto_pay);
     }
     gnc_resume_gui_refresh ();
 
diff --git a/libgnucash/engine/gncBillTerm.c b/libgnucash/engine/gncBillTerm.c
index 73e19d7..93c03f6 100644
--- a/libgnucash/engine/gncBillTerm.c
+++ b/libgnucash/engine/gncBillTerm.c
@@ -764,7 +764,7 @@ compute_monthyear (const GncBillTerm *term, time64 post_date,
     gnc_localtime_r (&post_date, &tm);
     iday = tm.tm_mday;
     imonth = tm.tm_mon + 1;
-    iyear = tm.tm_year + 1;
+    iyear = tm.tm_year + 1900;
 
     if (cutoff <= 0)
         cutoff += gnc_date_get_last_mday (imonth - 1, iyear);
@@ -801,23 +801,23 @@ compute_monthyear (const GncBillTerm *term, time64 post_date,
  * detailed explanation of proximo.
  */
 
-static Timespec
-compute_time (const GncBillTerm *term, Timespec post_date, int days)
+static time64
+compute_time (const GncBillTerm *term, time64 post_date, int days)
 {
-    Timespec res = post_date;
+    time64 res = post_date;
     int day, month, year;
 
     switch (term->type)
     {
     case GNC_TERM_TYPE_DAYS:
-        res.tv_sec += (SECS_PER_DAY * days);
+        res += (SECS_PER_DAY * days);
         break;
     case GNC_TERM_TYPE_PROXIMO:
-        compute_monthyear (term, post_date.tv_sec, &month, &year);
+        compute_monthyear (term, post_date, &month, &year);
         day = gnc_date_get_last_mday (month - 1, year);
         if (days < day)
             day = days;
-        res = gnc_dmy2timespec (day, month, year);
+        res = gnc_dmy2time64 (day, month, year);
         break;
     }
     return res;
@@ -826,9 +826,8 @@ compute_time (const GncBillTerm *term, Timespec post_date, int days)
 time64
 gncBillTermComputeDueDate (const GncBillTerm *term, time64 post_date)
 {
-    Timespec pass = {post_date, 0};
     if (!term) return post_date;
-    return compute_time (term, pass, term->due_days).tv_sec;
+    return compute_time (term, post_date, term->due_days);
 }
 
 /* Package-Private functions */
diff --git a/libgnucash/engine/gncEntry.c b/libgnucash/engine/gncEntry.c
index a47fd3b..654e7ec 100644
--- a/libgnucash/engine/gncEntry.c
+++ b/libgnucash/engine/gncEntry.c
@@ -1324,20 +1324,20 @@ gncEntryRecomputeValues (GncEntry *entry)
     /* See if either tax table changed since we last computed values */
     if (entry->i_tax_table)
     {
-        Timespec modtime = gncTaxTableLastModified (entry->i_tax_table);
-        if (entry->i_taxtable_modtime != modtime.tv_sec)
+        time64 modtime = gncTaxTableLastModifiedSecs (entry->i_tax_table);
+        if (entry->i_taxtable_modtime != modtime)
         {
             entry->values_dirty = TRUE;
-            entry->i_taxtable_modtime = modtime.tv_sec;
+            entry->i_taxtable_modtime = modtime;
         }
     }
     if (entry->b_tax_table)
     {
-        Timespec modtime = gncTaxTableLastModified (entry->b_tax_table);
-        if (entry->b_taxtable_modtime == modtime.tv_sec)
+        time64 modtime = gncTaxTableLastModifiedSecs (entry->b_tax_table);
+        if (entry->b_taxtable_modtime == modtime)
         {
             entry->values_dirty = TRUE;
-            entry->b_taxtable_modtime = modtime.tv_sec;
+            entry->b_taxtable_modtime = modtime;
         }
     }
 
diff --git a/libgnucash/engine/gncInvoice.c b/libgnucash/engine/gncInvoice.c
index 40d87be..670242c 100644
--- a/libgnucash/engine/gncInvoice.c
+++ b/libgnucash/engine/gncInvoice.c
@@ -1943,9 +1943,10 @@ gncInvoiceApplyPayment (const GncInvoice *invoice, Transaction *txn,
     g_return_if_fail (owner->owner.undefined);
 
     /* Create a lot for this payment */
-    payment_lot = gncOwnerCreatePaymentLot (owner, &txn, invoice->posted_acc,
-                                            xfer_acc, amount, exch,
-                                            date, memo, num);
+    payment_lot = gncOwnerCreatePaymentLotSecs (owner, &txn,
+                                                invoice->posted_acc,
+                                                xfer_acc, amount, exch,
+                                                date, memo, num);
 
     /* Select the invoice as only payment candidate */
     selected_lots = g_list_prepend (selected_lots, invoice->posted_lot);
diff --git a/libgnucash/engine/gncInvoice.h b/libgnucash/engine/gncInvoice.h
index fce06f2..4fc2e52 100644
--- a/libgnucash/engine/gncInvoice.h
+++ b/libgnucash/engine/gncInvoice.h
@@ -246,7 +246,7 @@ gncInvoiceAutoApplyPayments (GncInvoice *invoice);
  * or payments for the owner will be considered
  * to balance the payment.
  *
- * This code is actually a convenience wrapper around gncOwnerCreatePaymentLot
+ * This code is actually a convenience wrapper around gncOwnerCreatePaymentLotSecs
  * and gncOwnerAutoApplyPaymentsWithLots. See their descriptions for more
  * details on what happens exactly.
  */
diff --git a/libgnucash/engine/gncOwner.c b/libgnucash/engine/gncOwner.c
index 6011936..a409b79 100644
--- a/libgnucash/engine/gncOwner.c
+++ b/libgnucash/engine/gncOwner.c
@@ -723,10 +723,10 @@ gncOwnerLotsSortFunc (GNCLot *lotA, GNCLot *lotB)
 }
 
 GNCLot *
-gncOwnerCreatePaymentLot (const GncOwner *owner, Transaction **preset_txn,
-                          Account *posted_acc, Account *xfer_acc,
-                          gnc_numeric amount, gnc_numeric exch, time64 date,
-                          const char *memo, const char *num)
+gncOwnerCreatePaymentLotSecs (const GncOwner *owner, Transaction **preset_txn,
+                              Account *posted_acc, Account *xfer_acc,
+                              gnc_numeric amount, gnc_numeric exch, time64 date,
+                              const char *memo, const char *num)
 {
     QofBook *book;
     Split *split;
@@ -1376,10 +1376,10 @@ void gncOwnerAutoApplyPaymentsWithLots (const GncOwner *owner, GList *lots)
  * then all open lots for the owner are considered.
  */
 void
-gncOwnerApplyPayment (const GncOwner *owner, Transaction **preset_txn, GList *lots,
-                      Account *posted_acc, Account *xfer_acc,
-                      gnc_numeric amount, gnc_numeric exch, time64 date,
-                      const char *memo, const char *num, gboolean auto_pay)
+gncOwnerApplyPaymentSecs (const GncOwner *owner, Transaction **preset_txn,
+                          GList *lots, Account *posted_acc, Account *xfer_acc,
+                          gnc_numeric amount, gnc_numeric exch, time64 date,
+                          const char *memo, const char *num, gboolean auto_pay)
 {
     GNCLot *payment_lot = NULL;
     GList *selected_lots = NULL;
@@ -1391,8 +1391,10 @@ gncOwnerApplyPayment (const GncOwner *owner, Transaction **preset_txn, GList *lo
 
     /* If there's a real amount to transfer create a lot for this payment */
     if (!gnc_numeric_zero_p (amount))
-        payment_lot = gncOwnerCreatePaymentLot (owner, preset_txn, posted_acc, xfer_acc,
-                                                amount, exch, date, memo, num);
+        payment_lot = gncOwnerCreatePaymentLotSecs (owner, preset_txn,
+                                                    posted_acc, xfer_acc,
+                                                    amount, exch, date, memo,
+                                                    num);
 
     if (lots)
         selected_lots = lots;
diff --git a/libgnucash/engine/gncOwner.h b/libgnucash/engine/gncOwner.h
index 79bbaba..28251ac 100644
--- a/libgnucash/engine/gncOwner.h
+++ b/libgnucash/engine/gncOwner.h
@@ -214,10 +214,10 @@ gboolean gncOwnerGetOwnerFromTypeGuid (QofBook *book, GncOwner *owner, QofIdType
  * split in the transfer account).
  */
 GNCLot *
-gncOwnerCreatePaymentLot (const GncOwner *owner, Transaction **preset_txn,
-                          Account *posted_acc, Account *xfer_acc,
-                          gnc_numeric amount, gnc_numeric exch, time64 date,
-                          const char *memo, const char *num);
+gncOwnerCreatePaymentLotSecs (const GncOwner *owner, Transaction **preset_txn,
+                              Account *posted_acc, Account *xfer_acc,
+                              gnc_numeric amount, gnc_numeric exch, time64 date,
+                              const char *memo, const char *num);
 
 /**
  * Given a list of lots, try to balance as many of them as possible
@@ -267,10 +267,10 @@ void gncOwnerAutoApplyPaymentsWithLots (const GncOwner *owner, GList *lots);
  * details on what happens exactly.
  */
 void
-gncOwnerApplyPayment (const GncOwner *owner, Transaction **preset_txn, GList *lots,
-                      Account *posted_acc, Account *xfer_acc,
-                      gnc_numeric amount, gnc_numeric exch, time64 date,
-                      const char *memo, const char *num, gboolean auto_pay);
+gncOwnerApplyPaymentSecs (const GncOwner *owner, Transaction **preset_txn,
+                          GList *lots, Account *posted_acc, Account *xfer_acc,
+                          gnc_numeric amount, gnc_numeric exch, time64 date,
+                          const char *memo, const char *num, gboolean auto_pay);
 
 /** Helper function to find a split in lot that best offsets target_value
  *  Obviously it should be of opposite sign.
diff --git a/libgnucash/engine/gncTaxTable.c b/libgnucash/engine/gncTaxTable.c
index f691f70..9175216 100644
--- a/libgnucash/engine/gncTaxTable.c
+++ b/libgnucash/engine/gncTaxTable.c
@@ -39,7 +39,7 @@ struct _gncTaxTable
     QofInstance     inst;
     char *          name;
     GncTaxTableEntryList*  entries;
-    Timespec        modtime;      /* internal date of last modtime */
+    time64          modtime;      /* internal date of last modtime */
 
     /* See src/doc/business.txt for an explanation of the following */
     /* Code that handles this is *identical* to that in gncBillTerm */
@@ -165,7 +165,7 @@ maybe_resort_list (GncTaxTable *table)
 static inline void
 mod_table (GncTaxTable *table)
 {
-    timespecFromTime64 (&table->modtime, gnc_time (NULL));
+    table->modtime = gnc_time (NULL);
 }
 
 static inline void addObj (GncTaxTable *table)
@@ -761,10 +761,9 @@ gint64 gncTaxTableGetRefcount (const GncTaxTable *table)
     return table->refcount;
 }
 
-Timespec gncTaxTableLastModified (const GncTaxTable *table)
+time64 gncTaxTableLastModifiedSecs (const GncTaxTable *table)
 {
-    Timespec ts = { 0 , 0 };
-    if (!table) return ts;
+    if (!table) return 0;
     return table->modtime;
 }
 
diff --git a/libgnucash/engine/gncTaxTable.h b/libgnucash/engine/gncTaxTable.h
index 7d9579a..5215585 100644
--- a/libgnucash/engine/gncTaxTable.h
+++ b/libgnucash/engine/gncTaxTable.h
@@ -41,7 +41,7 @@ is *identical* to that in ::GncBillTerm
 @param	QofInstance     inst;
 @param 	char *          name;
 @param 	GncTaxTableEntryList*  entries;
- at param 	Timespec        modtime;
+ at param 	time64        modtime;
 @param 	gint64          refcount;
 @param 	GncTaxTable *   parent; if non-null, we are an immutable child
 @param 	GncTaxTable *   child;  if non-null, we have not changed
@@ -162,7 +162,7 @@ GncTaxTable *gncTaxTableReturnChild (GncTaxTable *table, gboolean make_new);
 typedef GList GncTaxTableEntryList;
 GncTaxTableEntryList* gncTaxTableGetEntries (const GncTaxTable *table);
 gint64 gncTaxTableGetRefcount (const GncTaxTable *table);
-Timespec gncTaxTableLastModified (const GncTaxTable *table);
+time64 gncTaxTableLastModifiedSecs (const GncTaxTable *table);
 
 Account * gncTaxTableEntryGetAccount (const GncTaxTableEntry *entry);
 GncAmountType gncTaxTableEntryGetType (const GncTaxTableEntry *entry);

commit c8b372e3906a365085a91d2a6f0fa6cd572b6162
Author: John Ralls <jralls at ceridwen.us>
Date:   Thu Aug 2 13:29:47 2018 -0700

    Convert GNC_TYPE_TIMESPEC to GNC_TYPE_TIME64, Kvp::Type::Timespec to Kvp::Type::Time64
    
    They have to go together because of using gvalues to hide KVP from most of
    GnuCash.

diff --git a/gnucash/import-export/aqb/gnc-ab-kvp.c b/gnucash/import-export/aqb/gnc-ab-kvp.c
index 4b5b1f6..ed0a1c5 100644
--- a/gnucash/import-export/aqb/gnc-ab-kvp.c
+++ b/gnucash/import-export/aqb/gnc-ab-kvp.c
@@ -98,20 +98,20 @@ gnc_ab_set_account_uid(Account *a, guint32 uid)
 time64
 gnc_ab_get_account_trans_retrieval(const Account *a)
 {
-    Timespec *t = NULL;
+    Time64 *t = NULL;
     qof_instance_get (QOF_INSTANCE (a),
 		      "ab-trans-retrieval", &t,
 		      NULL);
-    return t ? t->tv_sec : 0;
+    return t ? t->t : 0;
 }
 
 void
 gnc_ab_set_account_trans_retrieval(Account *a, time64 time)
 {
-    Timespec ts = {time, 0};
+    Time64 t = {time};
     xaccAccountBeginEdit(a);
     qof_instance_set (QOF_INSTANCE (a),
-		      "ab-trans-retrieval", &ts,
+		      "ab-trans-retrieval", &t,
 		      NULL);
     xaccAccountCommitEdit(a);
 }
diff --git a/libgnucash/backend/dbi/test/test-backend-dbi-basic.cpp b/libgnucash/backend/dbi/test/test-backend-dbi-basic.cpp
index 1447f39..4c0d7ac 100644
--- a/libgnucash/backend/dbi/test/test-backend-dbi-basic.cpp
+++ b/libgnucash/backend/dbi/test/test-backend-dbi-basic.cpp
@@ -138,7 +138,7 @@ setup_memory (Fixture* fixture, gconstpointer pData)
     frame->set ({"int64-val"}, new KvpValue (INT64_C (100)));
     frame->set ({"double-val"}, new KvpValue (3.14159));
     frame->set ({"numeric-val"}, new KvpValue (gnc_numeric_zero ()));
-    frame->set ({"timespec-val"}, new KvpValue (timespec_now ()));
+    frame->set ({"timespec-val"}, new KvpValue (gnc_time(nullptr)));
     frame->set ({"string-val"}, new KvpValue ("abcdefghijklmnop"));
     auto guid = qof_instance_get_guid (QOF_INSTANCE (acct1));
     frame->set ({"guid-val"}, new KvpValue (const_cast<GncGUID*> (guid_copy (
diff --git a/libgnucash/backend/sql/gnc-slots-sql.cpp b/libgnucash/backend/sql/gnc-slots-sql.cpp
index d0a5145..6cb48ff 100644
--- a/libgnucash/backend/sql/gnc-slots-sql.cpp
+++ b/libgnucash/backend/sql/gnc-slots-sql.cpp
@@ -397,8 +397,9 @@ get_timespec_val (gpointer pObject)
 
     g_return_val_if_fail (pObject != NULL, gnc_dmy2timespec (1, 1, 1970));
 
-//if( kvp_value_get_type( pInfo->pKvpValue ) == KvpValue::Type::TIMESPEC ) {
-    return pInfo->pKvpValue->get<Timespec> ();
+//if( kvp_value_get_type( pInfo->pKvpValue ) == KvpValue::Type::TIME64 ) {
+    auto t = pInfo->pKvpValue->get<Time64> ();
+    return {t.t, 0};
 }
 
 static void
@@ -406,11 +407,11 @@ set_timespec_val (gpointer pObject, Timespec *ts)
 {
     slot_info_t* pInfo = (slot_info_t*)pObject;
     KvpValue* value = NULL;
-
+    Time64 t{ts->tv_sec};
     g_return_if_fail (pObject != NULL);
 
-    if (pInfo->value_type != KvpValue::Type::TIMESPEC) return;
-    value = new KvpValue {*ts};
+    if (pInfo->value_type != KvpValue::Type::TIME64) return;
+    value = new KvpValue {t};
     set_slot_from_value (pInfo, value);
 }
 
diff --git a/libgnucash/backend/xml/sixtp-dom-generators.cpp b/libgnucash/backend/xml/sixtp-dom-generators.cpp
index ce7bc5b..4d8fff4 100644
--- a/libgnucash/backend/xml/sixtp-dom-generators.cpp
+++ b/libgnucash/backend/xml/sixtp-dom-generators.cpp
@@ -237,7 +237,7 @@ add_kvp_value_node (xmlNodePtr node, const gchar* tag, KvpValue* val)
         g_free (newstr);
         break;
     }
-    case KvpValue::Type::TIMESPEC:
+    case KvpValue::Type::TIME64:
         val_node = NULL;
         break;
     case KvpValue::Type::GDATE:
@@ -277,10 +277,10 @@ add_kvp_value_node (xmlNodePtr node, const gchar* tag, KvpValue* val)
         add_text_to_node (val_node, "guid", guidstr);
         break;
     }
-    case KvpValue::Type::TIMESPEC:
+    case KvpValue::Type::TIME64:
     {
-        auto ts = val->get<Timespec> ();
-        val_node = time64_to_dom_tree (tag, ts.tv_sec);
+        auto t = val->get<Time64> ();
+        val_node = time64_to_dom_tree (tag, t.t);
         xmlSetProp (val_node, BAD_CAST "type", BAD_CAST "timespec");
         xmlAddChild (node, val_node);
         break;
diff --git a/libgnucash/backend/xml/sixtp-dom-parsers.cpp b/libgnucash/backend/xml/sixtp-dom-parsers.cpp
index a788ef0..1408004 100644
--- a/libgnucash/backend/xml/sixtp-dom-parsers.cpp
+++ b/libgnucash/backend/xml/sixtp-dom-parsers.cpp
@@ -235,7 +235,8 @@ dom_tree_to_guid_kvp_value (xmlNodePtr node)
 static KvpValue*
 dom_tree_to_time64_kvp_value (xmlNodePtr node)
 {
-    return new KvpValue {Timespec {dom_tree_to_time64 (node), 0}};
+    Time64 t{dom_tree_to_time64 (node)};
+    return new KvpValue {t};
 }
 
 static KvpValue*
diff --git a/libgnucash/engine/Account.cpp b/libgnucash/engine/Account.cpp
index 7920660..5379b0a 100644
--- a/libgnucash/engine/Account.cpp
+++ b/libgnucash/engine/Account.cpp
@@ -995,7 +995,7 @@ gnc_account_class_init (AccountClass *klass)
                         "AQBanking Last Transaction Retrieval",
                         "The time of the last transaction retrieval for this "
                         "account.",
-                        GNC_TYPE_TIMESPEC,
+                        GNC_TYPE_TIME64,
                         static_cast<GParamFlags>(G_PARAM_READWRITE)));
 
 }
diff --git a/libgnucash/engine/Split.c b/libgnucash/engine/Split.c
index b10714e..b709551 100644
--- a/libgnucash/engine/Split.c
+++ b/libgnucash/engine/Split.c
@@ -170,7 +170,7 @@ gnc_split_get_property(GObject         *object,
             g_value_set_boxed(value, &split->amount);
             break;
         case PROP_RECONCILE_DATE:
-            g_value_set_boxed(value, &split->date_reconciled);
+            g_value_set_boxed(value, &split->date_reconciled.tv_sec);
             break;
         case PROP_TX:
             g_value_take_object(value, split->parent);
@@ -223,7 +223,7 @@ gnc_split_set_property(GObject         *object,
     Split *split;
     gnc_numeric* number;
     gchar *key;
-
+    Time64 *t;
     g_return_if_fail(GNC_IS_SPLIT(object));
 
     split = GNC_SPLIT(object);
@@ -247,7 +247,8 @@ gnc_split_set_property(GObject         *object,
             xaccSplitSetAmount(split, *number);
             break;
         case PROP_RECONCILE_DATE:
-            xaccSplitSetDateReconciledTS(split, g_value_get_boxed(value));
+            t = g_value_get_boxed(value);
+            xaccSplitSetDateReconciledSecs(split, t->t);
             break;
         case PROP_TX:
             xaccSplitSetParent(split, g_value_get_object(value));
@@ -353,7 +354,7 @@ gnc_split_class_init(SplitClass* klass)
          g_param_spec_boxed("reconcile-date",
                             "Reconcile Date",
                             "The date this split was reconciled.",
-                            GNC_TYPE_TIMESPEC,
+                            GNC_TYPE_TIME64,
                             G_PARAM_READWRITE));
 
     g_object_class_install_property
diff --git a/libgnucash/engine/Transaction.c b/libgnucash/engine/Transaction.c
index 8f8469b..2223c89 100644
--- a/libgnucash/engine/Transaction.c
+++ b/libgnucash/engine/Transaction.c
@@ -310,7 +310,6 @@ gnc_transaction_get_property(GObject* object,
 {
     Transaction* tx;
     gchar *key;
-    Timespec ts = {0,0};
 
     g_return_if_fail(GNC_IS_TRANSACTION(object));
 
@@ -327,12 +326,10 @@ gnc_transaction_get_property(GObject* object,
         g_value_take_object(value, tx->common_currency);
         break;
     case PROP_POST_DATE:
-        ts.tv_sec = tx->date_posted;
-        g_value_set_boxed(value, &ts);
+        g_value_set_boxed(value, &tx->date_posted);
         break;
     case PROP_ENTER_DATE:
-        ts.tv_sec = tx->date_entered;
-        g_value_set_boxed(value, &ts);
+        g_value_set_boxed(value, &tx->date_entered);
         break;
     case PROP_INVOICE:
         qof_instance_get_kvp (QOF_INSTANCE (tx), value, 2, GNC_INVOICE_ID, GNC_INVOICE_GUID);
@@ -357,6 +354,7 @@ gnc_transaction_set_property(GObject* object,
 {
     Transaction* tx;
     gchar *key;
+    Time64 *t;
 
     g_return_if_fail(GNC_IS_TRANSACTION(object));
 
@@ -375,10 +373,12 @@ gnc_transaction_set_property(GObject* object,
         xaccTransSetCurrency(tx, g_value_get_object(value));
         break;
     case PROP_POST_DATE:
-        xaccTransSetDatePostedSecs(tx, ((Timespec*)g_value_get_boxed(value))->tv_sec);
+        t = (Time64*)g_value_get_boxed(value);
+        xaccTransSetDatePostedSecs(tx, t->t);
         break;
     case PROP_ENTER_DATE:
-        xaccTransSetDateEnteredSecs(tx, ((Timespec*)g_value_get_boxed(value))->tv_sec);
+        t = (Time64*)g_value_get_boxed(value);
+        xaccTransSetDateEnteredSecs(tx, t->t);
         break;
     case PROP_INVOICE:
         qof_instance_set_kvp (QOF_INSTANCE (tx), value, 2, GNC_INVOICE_ID, GNC_INVOICE_GUID);
@@ -446,7 +446,7 @@ gnc_transaction_class_init(TransactionClass* klass)
      g_param_spec_boxed("post-date",
                         "Post Date",
                         "The date the transaction occurred.",
-                        GNC_TYPE_TIMESPEC,
+                        GNC_TYPE_TIME64,
                         G_PARAM_READWRITE));
 
     g_object_class_install_property
@@ -455,7 +455,7 @@ gnc_transaction_class_init(TransactionClass* klass)
      g_param_spec_boxed("enter-date",
                         "Enter Date",
                         "The date the transaction was entered.",
-                        GNC_TYPE_TIMESPEC,
+                        GNC_TYPE_TIME64,
                         G_PARAM_READWRITE));
 
      g_object_class_install_property(
@@ -2035,10 +2035,9 @@ void
 xaccTransSetDateDue (Transaction * trans, time64 time)
 {
     GValue v = G_VALUE_INIT;
-    Timespec send_ts = {time, 0};
     if (!trans) return;
-    g_value_init (&v, GNC_TYPE_TIMESPEC);
-    g_value_set_boxed (&v, &send_ts);
+    g_value_init (&v, GNC_TYPE_TIME64);
+    g_value_set_boxed (&v, &time);
     xaccTransBeginEdit(trans);
     qof_instance_set_kvp (QOF_INSTANCE (trans), &v, 1, TRANS_DATE_DUE_KVP);
     qof_instance_set_dirty(QOF_INSTANCE(trans));
diff --git a/libgnucash/engine/gnc-date.cpp b/libgnucash/engine/gnc-date.cpp
index 3107f1a..23e2a81 100644
--- a/libgnucash/engine/gnc-date.cpp
+++ b/libgnucash/engine/gnc-date.cpp
@@ -1262,18 +1262,6 @@ gnc_timespec_to_iso8601_buff (Timespec ts, char * buff)
     }
 }
 
-void
-gnc_timespec2dmy (Timespec t, int *day, int *month, int *year)
-{
-    struct tm result;
-    time64 t_secs = t.tv_sec + (t.tv_nsec / NANOS_PER_SECOND);
-    gnc_localtime_r(&t_secs, &result);
-
-    if (day) *day = result.tm_mday;
-    if (month) *month = result.tm_mon + 1;
-    if (year) *year = result.tm_year + 1900;
-}
-
 #define THIRTY_TWO_YEARS 0x3c30fc00LL
 
 static Timespec
@@ -1518,33 +1506,34 @@ gnc_dow_abbrev(gchar *buf, int buf_len, int dow)
 /* *******************************************************************
  *  GValue handling
  ********************************************************************/
+
 static gpointer
-timespec_boxed_copy_func( gpointer in_timespec )
+time64_boxed_copy_func (gpointer in_time64)
 {
-    Timespec* newvalue;
+    Time64* newvalue;
 
-    newvalue = static_cast<Timespec*>(g_malloc (sizeof (Timespec)));
-    memcpy( newvalue, in_timespec, sizeof( Timespec ) );
+    newvalue = static_cast<Time64*>(g_malloc (sizeof (Time64)));
+    memcpy (newvalue, in_time64, sizeof(Time64));
 
     return newvalue;
 }
 
 static void
-timespec_boxed_free_func( gpointer in_timespec )
+time64_boxed_free_func (gpointer in_time64)
 {
-    g_free( in_timespec );
+    g_free (in_time64);
 }
 
 GType
-timespec_get_type( void )
+time64_get_type( void )
 {
     static GType type = 0;
 
     if ( type == 0 )
     {
-        type = g_boxed_type_register_static( "timespec",
-                                             timespec_boxed_copy_func,
-                                             timespec_boxed_free_func );
+        type = g_boxed_type_register_static( "time64",
+                                             time64_boxed_copy_func,
+                                             time64_boxed_free_func );
     }
     return type;
 }
diff --git a/libgnucash/engine/gnc-date.h b/libgnucash/engine/gnc-date.h
index ce00801..140dc92 100644
--- a/libgnucash/engine/gnc-date.h
+++ b/libgnucash/engine/gnc-date.h
@@ -82,6 +82,14 @@ extern "C"
  * this stops working in 2038, we define our own:
  */
 typedef gint64 time64;
+/* A bit of a hack to create a type separate from the alias of int64_t so that
+ * compile-time dispatch can use the right KVP visitor.
+ */
+typedef struct
+{
+    time64 t;
+} Time64;
+
 
 /** The Timespec is just like the unix 'struct timespec'
  * except that we use a 64-bit unsigned int to
@@ -96,8 +104,8 @@ typedef struct timespec64 Timespec;
 /** @name GValue
   @{
 */
-GType timespec_get_type( void );
-#define GNC_TYPE_TIMESPEC (timespec_get_type ())
+GType time64_get_type( void );
+#define GNC_TYPE_TIME64 (time64_get_type ())
 
 /** @} */
 /** The default date format for use with strftime. */
diff --git a/libgnucash/engine/gncInvoice.h b/libgnucash/engine/gncInvoice.h
index fa9eedc..fce06f2 100644
--- a/libgnucash/engine/gncInvoice.h
+++ b/libgnucash/engine/gncInvoice.h
@@ -101,7 +101,7 @@ GncInvoice *gncInvoiceCopy (const GncInvoice *other_invoice);
 void gncInvoiceSetID (GncInvoice *invoice, const char *id);
 void gncInvoiceSetOwner (GncInvoice *invoice, GncOwner *owner);
 /** Set the DateOpened using a GDate argument. (Note: Internally this stores
-the date in a time64 as created through timespecCanonicalDayTime()). */
+the date in a time64 as created through time64CanonicalDayTime()). */
 void gncInvoiceSetDateOpenedGDate (GncInvoice *invoice, const GDate *date);
 void gncInvoiceSetDateOpened (GncInvoice *invoice, time64 date);
 void gncInvoiceSetDatePosted (GncInvoice *invoice, time64 date);
diff --git a/libgnucash/engine/gncOrder.c b/libgnucash/engine/gncOrder.c
index b80f406..2130e6d 100644
--- a/libgnucash/engine/gncOrder.c
+++ b/libgnucash/engine/gncOrder.c
@@ -257,7 +257,7 @@ gnc_order_class_init (GncOrderClass *klass)
      g_param_spec_boxed("date-opened",
                         "Date Opened",
                         "The date the order was opened.",
-                        GNC_TYPE_TIMESPEC,
+                        GNC_TYPE_TIME64,
                         G_PARAM_READWRITE));
 
     g_object_class_install_property
@@ -266,7 +266,7 @@ gnc_order_class_init (GncOrderClass *klass)
      g_param_spec_boxed("date-closed",
                         "Date Closed",
                         "The date the order was closed.",
-                        GNC_TYPE_TIMESPEC,
+                        GNC_TYPE_TIME64,
                         G_PARAM_READWRITE));
 
     g_object_class_install_property
diff --git a/libgnucash/engine/kvp-frame.cpp b/libgnucash/engine/kvp-frame.cpp
index b320814..60a46ed 100644
--- a/libgnucash/engine/kvp-frame.cpp
+++ b/libgnucash/engine/kvp-frame.cpp
@@ -261,7 +261,7 @@ gvalue_from_kvp_value (const KvpValue *kval)
 {
     GValue *val;
     gnc_numeric num;
-    Timespec tm;
+    Time64 tm;
     GDate gdate;
 
     if (kval == NULL) return NULL;
@@ -290,9 +290,9 @@ gvalue_from_kvp_value (const KvpValue *kval)
             g_value_init (val, GNC_TYPE_GUID);
             g_value_set_boxed (val, kval->get<GncGUID*>());
             break;
-        case KvpValue::Type::TIMESPEC:
-            g_value_init (val, GNC_TYPE_TIMESPEC);
-            tm = kval->get<Timespec>();
+        case KvpValue::Type::TIME64:
+            g_value_init (val, GNC_TYPE_TIME64);
+            tm = kval->get<Time64>();
             g_value_set_boxed (val, &tm);
             break;
         case KvpValue::Type::GDATE:
@@ -357,8 +357,8 @@ kvp_value_from_gvalue (const GValue *gval)
         if (boxed != nullptr)
             val = new KvpValue(guid_copy(static_cast<GncGUID*>(boxed)));
     }
-    else if (type == GNC_TYPE_TIMESPEC)
-        val = new KvpValue(*(Timespec*)g_value_get_boxed (gval));
+    else if (type == GNC_TYPE_TIME64)
+        val = new KvpValue(*(Time64*)g_value_get_boxed (gval));
     else if (type == G_TYPE_DATE)
         val = new KvpValue(*(GDate*)g_value_get_boxed (gval));
     else if (type == GNC_TYPE_VALUE_LIST)
diff --git a/libgnucash/engine/kvp-value.cpp b/libgnucash/engine/kvp-value.cpp
index 990197e..ab2f3be 100644
--- a/libgnucash/engine/kvp-value.cpp
+++ b/libgnucash/engine/kvp-value.cpp
@@ -85,8 +85,8 @@ KvpValueImpl::get_type() const noexcept
         return KvpValue::Type::STRING;
     else if (datastore.type() == typeid(GncGUID *))
         return KvpValue::Type::GUID;
-    else if (datastore.type() == typeid(Timespec))
-        return KvpValue::Type::TIMESPEC;
+    else if (datastore.type() == typeid(Time64))
+        return KvpValue::Type::TIME64;
     else if (datastore.type() == typeid(GList *))
         return KvpValue::Type::GLIST;
     else if (datastore.type() == typeid(KvpFrameImpl *))
@@ -155,11 +155,11 @@ struct to_string_visitor : boost::static_visitor<void>
         output << ")";
     }
 
-    void operator()(Timespec val)
+    void operator()(Time64 val)
     {
-        char tmp1[40] {};
-        gnc_timespec_to_iso8601_buff (val, tmp1);
-        output << tmp1 << " (timespec)";
+        char tmp1[MAX_DATE_LENGTH + 1] {};
+        gnc_time64_to_iso8601_buff (val.t, tmp1);
+        output << tmp1 << " (time64)";
     }
 
     void operator()(gnc_numeric val)
@@ -301,9 +301,9 @@ template <> int compare_visitor::operator()(GncGUID * const & one, GncGUID * con
 {
     return guid_compare(one, two);
 }
-template <> int compare_visitor::operator()(Timespec const & one, Timespec const & two) const
+template <> int compare_visitor::operator()(Time64 const & one, Time64 const & two) const
 {
-    return timespec_cmp(&one,&two);
+    return one.t < two.t ? -1 : one.t > two.t ? 1 : 0;
 }
 template <> int compare_visitor::operator()(GDate const & one, GDate const & two) const
 {
diff --git a/libgnucash/engine/kvp-value.hpp b/libgnucash/engine/kvp-value.hpp
index 78a8eb7..acc072b 100644
--- a/libgnucash/engine/kvp-value.hpp
+++ b/libgnucash/engine/kvp-value.hpp
@@ -65,7 +65,7 @@ struct KvpValueImpl
         NUMERIC,    /**< QOF_TYPE_NUMERIC */
         STRING,     /**< QOF_TYPE_STRING gchar* */
         GUID,       /**< QOF_TYPE_GUID */
-        TIMESPEC,   /**< QOF_TYPE_DATE */
+        TIME64,   /**< QOF_TYPE_DATE */
         PLACEHOLDER_DONT_USE, /* Replaces KVP_TYPE_BINARY */
         GLIST,      /**< no QOF equivalent. */
         FRAME,      /**< no QOF equivalent. */
@@ -156,7 +156,7 @@ struct KvpValueImpl
         gnc_numeric,
         const char*,
         GncGUID *,
-        Timespec,
+        Time64,
         GList *,
         KvpFrame *,
         GDate> datastore;
diff --git a/libgnucash/engine/kvp_doc.txt b/libgnucash/engine/kvp_doc.txt
index e9f6717..4f36b40 100644
--- a/libgnucash/engine/kvp_doc.txt
+++ b/libgnucash/engine/kvp_doc.txt
@@ -72,7 +72,7 @@ Use:  An enumerated identifier indicating how often books are supposed
 
 \verbatim
 Name: /book/close-date
-Type: Timespec
+Type: Time64
 Entities: Book
 Use:  The posted closing date of this book.  This book only contains
       transactions whose posted date is earlier than this closing date.
@@ -98,7 +98,7 @@ Use:  The GUID of the book for which this transaction represents the
 
 \verbatim
 Name: /book/log-date
-Type: Timespec
+Type: Time64
 Entities: Book
 Use:  A log of the date which the user performed the closing of the book.
 \endverbatim
@@ -131,7 +131,7 @@ Use:  User-suplied notes for the book.  The user can set this to any value
 
 \verbatim
 Name: /book/open-date
-Type: Timespec
+Type: Time64
 Entities: Book
 Use:  The posted opening date of this book.  This book only contains transactions
       whose posted date is later than this closing date.
@@ -254,7 +254,7 @@ Use:  When this appears in an account, then it contains the guid of
 
 \verbatim
 Name: /gemini/<type>/date
-Type: timespec
+Type: time64
 Entities: Account, Book
 Use:  date that the copy was created.
 \endverbatim
@@ -293,7 +293,7 @@ Use: Country code of the bank of HBCI account
 
 \verbatim
 Name: /hbci/trans-retrieval
-Type: Timespec
+Type: Time64
 Entities: Account
 Use: Time of the last statement retrieval through HBCI for this
 specific account
@@ -577,7 +577,7 @@ Use:  A user-supplied title for the lot.  The user can set this to
 
 \verbatim
 Name: trans-date-due
-Type: Timespec
+Type: Time64
 Entities: Transaction
 Use: Accounts/Receivable, Accounts/Payable Due Date.
 \endverbatim
diff --git a/libgnucash/engine/qofinstance.cpp b/libgnucash/engine/qofinstance.cpp
index db5a88b..0ce79c0 100644
--- a/libgnucash/engine/qofinstance.cpp
+++ b/libgnucash/engine/qofinstance.cpp
@@ -1144,8 +1144,9 @@ qof_instance_kvp_add_guid (const QofInstance *inst, const char* path,
     g_return_if_fail (inst->kvp_data != NULL);
 
     auto container = new KvpFrame;
+    Time64 t{time.tv_sec};
     container->set({key}, new KvpValue(const_cast<GncGUID*>(guid)));
-    container->set({"date"}, new KvpValue(time));
+    container->set({"date"}, new KvpValue(t));
     delete inst->kvp_data->set_path({path}, new KvpValue(container));
 }
 
diff --git a/libgnucash/engine/test-core/test-engine-stuff.cpp b/libgnucash/engine/test-core/test-engine-stuff.cpp
index 9f9d5f9..045ac34 100644
--- a/libgnucash/engine/test-core/test-engine-stuff.cpp
+++ b/libgnucash/engine/test-core/test-engine-stuff.cpp
@@ -324,11 +324,10 @@ get_random_kvp_value_depth (int type, gint depth)
     }
     break;
 
-    case KvpValue::Type::TIMESPEC:
+    case KvpValue::Type::TIME64:
     {
-        Timespec *ts = get_random_timespec();
-        ret = new KvpValue(*ts);
-        g_free(ts);
+        time64 t = get_random_time();
+        ret = new KvpValue(t);
     }
     break;
 
diff --git a/libgnucash/engine/test/test-engine-kvp-properties.c b/libgnucash/engine/test/test-engine-kvp-properties.c
index f857e5d..baddd35 100644
--- a/libgnucash/engine/test/test-engine-kvp-properties.c
+++ b/libgnucash/engine/test/test-engine-kvp-properties.c
@@ -144,8 +144,8 @@ test_account_kvp_properties (Fixture *fixture, gconstpointer pData)
     gchar *online_id_r, *ab_acct_id_r, *ab_bank_code_r;
     GncGUID *ofx_income_acct = guid_malloc ();
     GncGUID *ofx_income_acct_r;
-    Timespec trans_retr = timespec_now ();
-    Timespec *trans_retr_r;
+    Time64 trans_retr = {gnc_time(NULL)};
+    Time64 *trans_retr_r;
 
     xaccAccountBeginEdit (fixture->acct);
     qof_instance_set (QOF_INSTANCE (fixture->acct),
@@ -176,7 +176,7 @@ test_account_kvp_properties (Fixture *fixture, gconstpointer pData)
     g_assert_cmpstr (ab_acct_id, ==, ab_acct_id_r);
     g_assert_cmpstr (ab_bank_code, ==, ab_bank_code_r);
     g_assert_cmpint (ab_acct_uid, ==, ab_acct_uid_r);
-    g_assert (timespec_equal (&trans_retr, trans_retr_r));
+    g_assert_cmpint (trans_retr.t, ==, trans_retr_r->t);
     g_assert (!qof_instance_is_dirty (QOF_INSTANCE (fixture->acct)));
 }
 
diff --git a/libgnucash/engine/test/test-kvp-value.cpp b/libgnucash/engine/test/test-kvp-value.cpp
index f564fe3..b89a408 100644
--- a/libgnucash/engine/test/test-kvp-value.cpp
+++ b/libgnucash/engine/test/test-kvp-value.cpp
@@ -55,14 +55,14 @@ TEST (KvpValueTest, Equality)
     v2 = std::unique_ptr<KvpValueImpl> {new KvpValueImpl {guid_copy (guid)}};
     EXPECT_EQ (compare (*v1, *v2), 0);
 
-    v1 = std::unique_ptr<KvpValueImpl> {new KvpValueImpl {timespec_now ()}};
+    v1 = std::unique_ptr<KvpValueImpl> {new KvpValueImpl {gnc_time(nullptr)}};
     v2 = std::unique_ptr<KvpValueImpl> {new KvpValueImpl {*v1}};
     EXPECT_EQ (compare (*v1, *v2), 0);
 }
 
 TEST (KvpValueTest, Add)
 {
-    auto v3 = new KvpValueImpl {timespec_now ()};
+    auto v3 = new KvpValueImpl {gnc_time(nullptr)};
     auto v4 = new KvpValueImpl {*v3};
     auto new_one = v3->add (v4);
     EXPECT_NE (new_one, v3);
diff --git a/libgnucash/engine/test/utest-Split.cpp b/libgnucash/engine/test/utest-Split.cpp
index 23bff9b..bbf296f 100644
--- a/libgnucash/engine/test/utest-Split.cpp
+++ b/libgnucash/engine/test/utest-Split.cpp
@@ -201,7 +201,8 @@ test_gnc_split_set_get_property ()
     Account *acc = xaccMallocAccount (book), *racc = NULL;
     GNCLot *lot = gnc_lot_new (book), *rlot = NULL;
     Split *split = xaccMallocSplit (book);
-    Timespec time = timespec_now (), *rtime;
+    time64 time = gnc_time(nullptr);
+    Time64 t = {time}, *rtime;
     char *r_action, *r_memo;
     gnc_numeric value = gnc_numeric_create (123, 100);
     gnc_numeric amount = gnc_numeric_create (321, 100);
@@ -218,7 +219,7 @@ test_gnc_split_set_get_property ()
                   "memo", "bar",
                   "value", &value,
                   "amount", &amount,
-                  "reconcile-date", &time,
+                  "reconcile-date", &t,
                   "account", acc,
                   "lot", lot,
                   "transaction", txn,
@@ -240,7 +241,7 @@ test_gnc_split_set_get_property ()
     g_assert (gnc_numeric_equal (*r_value, value));
     /* Setting the transaction causes the amount to be scrubbed into the value */
     g_assert (gnc_numeric_equal (*r_amount, value));
-    g_assert (timespec_equal (rtime, &time));
+    g_assert_cmpint (rtime->t, ==, time);
     g_assert (txn == rtxn);
     g_assert (acc == racc);
     g_assert (lot == rlot);

commit b60aef9d2a5f793227c58c302345975c28a6c774
Author: John Ralls <jralls at ceridwen.us>
Date:   Tue Jul 31 16:19:39 2018 -0700

    Remove timespec2dmy.
    
    It had only two uses and one was in a test. Replace those calls with
    gnc_localtime_r.

diff --git a/libgnucash/engine/gnc-date.h b/libgnucash/engine/gnc-date.h
index 2b34ae3..ce00801 100644
--- a/libgnucash/engine/gnc-date.h
+++ b/libgnucash/engine/gnc-date.h
@@ -415,15 +415,6 @@ time64 gnc_iso8601_to_time64_gmt(const gchar *);
  */
 gchar * gnc_timespec_to_iso8601_buff (Timespec ts, gchar * buff);
 gchar * gnc_time64_to_iso8601_buff (time64, char * buff);
-
-/** Set the proleptic Gregorian day, month, and year from a Timespec
- * \param ts: input timespec
- * \param day: output day, 1 - 31
- * \param month: output month, 1 - 12
- * \param year: output year, 0001 - 9999 CE
- */
-void gnc_timespec2dmy (Timespec ts, gint *day, gint *month, gint *year);
-
 // @}
 
 /* ======================================================== */
diff --git a/libgnucash/engine/gncBillTerm.c b/libgnucash/engine/gncBillTerm.c
index 525d8f1..73e19d7 100644
--- a/libgnucash/engine/gncBillTerm.c
+++ b/libgnucash/engine/gncBillTerm.c
@@ -753,15 +753,18 @@ gboolean gncBillTermIsDirty (const GncBillTerm *term)
  *
  */
 static void
-compute_monthyear (const GncBillTerm *term, Timespec post_date,
+compute_monthyear (const GncBillTerm *term, time64 post_date,
                    int *month, int *year)
 {
     int iday, imonth, iyear;
+    struct tm tm;
     int cutoff = term->cutoff;
 
     g_return_if_fail (term->type == GNC_TERM_TYPE_PROXIMO);
-
-    gnc_timespec2dmy (post_date, &iday, &imonth, &iyear);
+    gnc_localtime_r (&post_date, &tm);
+    iday = tm.tm_mday;
+    imonth = tm.tm_mon + 1;
+    iyear = tm.tm_year + 1;
 
     if (cutoff <= 0)
         cutoff += gnc_date_get_last_mday (imonth - 1, iyear);
@@ -810,7 +813,7 @@ compute_time (const GncBillTerm *term, Timespec post_date, int days)
         res.tv_sec += (SECS_PER_DAY * days);
         break;
     case GNC_TERM_TYPE_PROXIMO:
-        compute_monthyear (term, post_date, &month, &year);
+        compute_monthyear (term, post_date.tv_sec, &month, &year);
         day = gnc_date_get_last_mday (month - 1, year);
         if (days < day)
             day = days;
diff --git a/libgnucash/engine/test/test-date.cpp b/libgnucash/engine/test/test-date.cpp
index 9014fcd..86f802d 100644
--- a/libgnucash/engine/test/test-date.cpp
+++ b/libgnucash/engine/test/test-date.cpp
@@ -82,15 +82,19 @@ static gboolean
 check_conversion (const char * str, Timespec expected_ts)
 {
     Timespec ts;
+    struct tm tm;
     int day, month, year;
     GDate d1, d2;
 
     ts = {gnc_iso8601_to_time64_gmt (str), 0};
 
-    // We test the conversion to GDate against the timespec2dmy
+    // We test the conversion to GDate against the gnc_localtime_r
     // conversion, and also the conversion back to timespec and again
     // to GDate so that it is still the original GDate
-    gnc_timespec2dmy(ts, &day, &month, &year);
+    gnc_localtime_r (&ts.tv_sec, &tm);
+    day = tm.tm_mday;
+    month = tm.tm_mon + 1;
+    year = tm.tm_year + 1900;
     d1 = timespec_to_gdate(ts);
     d2 = timespec_to_gdate(gdate_to_timespec(d1));
     if ((g_date_compare(&d1, &d2) != 0)
diff --git a/libgnucash/engine/test/test-gnc-date.c b/libgnucash/engine/test/test-gnc-date.c
index b262ff6..c084b3d 100644
--- a/libgnucash/engine/test/test-gnc-date.c
+++ b/libgnucash/engine/test/test-gnc-date.c
@@ -1738,54 +1738,7 @@ test_gnc_timespec_to_iso8601_buff (FixtureA *f, gconstpointer pData)
     g_assert_cmpstr (buff, ==, time_str);
     g_free (time_str);
 }
-/* gnc_timespec2dmy
-void
-gnc_timespec2dmy (Timespec t, int *day, int *month, int *year)// C: 1  Local: 0:0:0
-*/
-static void
-test_gnc_timespec2dmy (FixtureA *f, gconstpointer pData)
-{
-    struct tm tm;
-    int day, r_day, mo, r_mo, yr, r_yr;
-
-
-    gnc_timespec2dmy (f->ts0, &r_day, &r_mo, &r_yr);
-    gnc_localtime_r (&f->ts0.tv_sec, &tm);
-    g_assert_cmpint (r_day, ==, tm.tm_mday);
-    g_assert_cmpint (r_mo, ==, tm.tm_mon + 1);
-    g_assert_cmpint (r_yr, ==, tm.tm_year + 1900);
-
-    gnc_timespec2dmy (f->ts1, &r_day, &r_mo, &r_yr);
-    gnc_localtime_r (&f->ts1.tv_sec, &tm);
-    g_assert_cmpint (r_day, ==, tm.tm_mday);
-    g_assert_cmpint (r_mo, ==, tm.tm_mon + 1);
-    g_assert_cmpint (r_yr, ==, tm.tm_year + 1900);
-
-    gnc_timespec2dmy (f->ts2, &r_day, &r_mo, &r_yr);
-    gnc_localtime_r (&f->ts2.tv_sec, &tm);
-    g_assert_cmpint (r_day, ==, tm.tm_mday);
-    g_assert_cmpint (r_mo, ==, tm.tm_mon + 1);
-    g_assert_cmpint (r_yr, ==, tm.tm_year + 1900);
-
-    gnc_timespec2dmy (f->ts3, &r_day, &r_mo, &r_yr);
-    gnc_localtime_r (&f->ts3.tv_sec, &tm);
-    g_assert_cmpint (r_day, ==, tm.tm_mday);
-    g_assert_cmpint (r_mo, ==, tm.tm_mon + 1);
-    g_assert_cmpint (r_yr, ==, tm.tm_year + 1900);
-
-    gnc_timespec2dmy (f->ts4, &r_day, &r_mo, &r_yr);
-    gnc_localtime_r (&f->ts4.tv_sec, &tm);
-    g_assert_cmpint (r_day, ==, tm.tm_mday);
-    g_assert_cmpint (r_mo, ==, tm.tm_mon + 1);
-    g_assert_cmpint (r_yr, ==, tm.tm_year + 1900);
-
-    gnc_timespec2dmy (f->ts5, &r_day, &r_mo, &r_yr);
-    gnc_localtime_r (&f->ts5.tv_sec, &tm);
-    g_assert_cmpint (r_day, ==, tm.tm_mday);
-    g_assert_cmpint (r_mo, ==, tm.tm_mon + 1);
-    g_assert_cmpint (r_yr, ==, tm.tm_year + 1900);
 
-}
 /* gnc_dmy2timespec_internal
 static Timespec
 gnc_dmy2timespec_internal (int day, int month, int year, gboolean start_of_day)// Local: 2:0:0
@@ -2259,7 +2212,6 @@ test_suite_gnc_date (void)
     GNC_TEST_ADD_FUNC (suitename, "gnc_date_timestamp", test_gnc_date_timestamp);
     GNC_TEST_ADD (suitename, "gnc iso8601 to time64 gmt", FixtureA, NULL, setup, test_gnc_iso8601_to_time64_gmt, NULL);
     GNC_TEST_ADD (suitename, "gnc timespec to iso8601 buff", FixtureA, NULL, setup, test_gnc_timespec_to_iso8601_buff, NULL);
-    GNC_TEST_ADD (suitename, "gnc timespec2dmy", FixtureA, NULL, setup, test_gnc_timespec2dmy, NULL);
 // GNC_TEST_ADD_FUNC (suitename, "gnc dmy2timespec internal", test_gnc_dmy2timespec_internal);
 
     GNC_TEST_ADD (suitename, "gnc dmy2timespec", FixtureB, NULL, setup_begin, test_gnc_dmy2timespec, NULL);

commit 6f89bd62b3cf7089fb10c1c1ed908f0d9b5cc31c
Author: John Ralls <jralls at ceridwen.us>
Date:   Tue Jul 31 14:43:27 2018 -0700

    Remove timespec from gnucash/gnome.
    
    With a little API bleed into engine.

diff --git a/gnucash/gnome/assistant-acct-period.c b/gnucash/gnome/assistant-acct-period.c
index 87a503a..06e9bb4 100644
--- a/gnucash/gnome/assistant-acct-period.c
+++ b/gnucash/gnome/assistant-acct-period.c
@@ -465,7 +465,6 @@ ap_assistant_finish (GtkAssistant *assistant, gpointer user_data)
     gint len;
     const char *btitle;
     char *bnotes;
-    Timespec closing_date;
 
     ENTER("info=%p", info);
 
@@ -478,8 +477,6 @@ ap_assistant_finish (GtkAssistant *assistant, gpointer user_data)
     bnotes = gtk_text_buffer_get_text(buffer, &startiter, &enditer , 0);
     PINFO("Book title is - %s\n", btitle);
 
-    timespecFromTime64 (&closing_date,
-                        gnc_time64_get_day_end_gdate (&info->closing_date));
     g_free(bnotes);
 
     /* Report the status back to the user. */
diff --git a/gnucash/gnome/assistant-stock-split.c b/gnucash/gnome/assistant-stock-split.c
index 287a437..77fb8b3 100644
--- a/gnucash/gnome/assistant-stock-split.c
+++ b/gnucash/gnome/assistant-stock-split.c
@@ -388,19 +388,14 @@ gnc_stock_split_assistant_finish (GtkAssistant *assistant,
         GNCPrice *price;
         GNCPriceDB *pdb;
         GNCCurrencyEdit *ce;
-        Timespec ts;
 
         ce = GNC_CURRENCY_EDIT (info->price_currency_edit);
-
-        ts.tv_sec = date;
-        ts.tv_nsec = 0;
-
         price = gnc_price_create (gnc_get_current_book ());
 
         gnc_price_begin_edit (price);
         gnc_price_set_commodity (price, xaccAccountGetCommodity (account));
         gnc_price_set_currency (price, gnc_currency_edit_get_currency (ce));
-        gnc_price_set_time (price, ts);
+        gnc_price_set_time64 (price, date);
         gnc_price_set_source (price, PRICE_SOURCE_STOCK_SPLIT);
         gnc_price_set_typestr (price, PRICE_TYPE_UNK);
         gnc_price_set_value (price, amount);
diff --git a/gnucash/gnome/dialog-date-close.c b/gnucash/gnome/dialog-date-close.c
index 6a34d80..977a637 100644
--- a/gnucash/gnome/dialog-date-close.c
+++ b/gnucash/gnome/dialog-date-close.c
@@ -45,7 +45,7 @@ typedef struct _dialog_date_close_window
     GtkWidget *memo_entry;
     GtkWidget *question_check;
     GncBillTerm *terms;
-    Timespec *ts, *ts2;
+    time64 t, t2;
     GList * acct_types;
     GList * acct_commodities;
     QofBook *book;
@@ -87,14 +87,14 @@ gnc_dialog_date_close_ok_cb (GtkWidget *widget, gpointer user_data)
     }
 
     if (ddc->post_date)
-        ddc->ts2->tv_sec = gnc_date_edit_get_date (GNC_DATE_EDIT (ddc->post_date));
+        ddc->t2 = gnc_date_edit_get_date (GNC_DATE_EDIT (ddc->post_date));
 
     if (ddc->date)
     {
         if (ddc->terms)
-            ddc->ts->tv_sec = gncBillTermComputeDueDate (ddc->terms, ddc->ts2->tv_sec);
+            ddc->t = gncBillTermComputeDueDate (ddc->terms, ddc->t2);
         else
-            ddc->ts->tv_sec = gnc_date_edit_get_date (GNC_DATE_EDIT (ddc->date));
+            ddc->t = gnc_date_edit_get_date (GNC_DATE_EDIT (ddc->date));
     }
 
     if (ddc->memo_entry && ddc->memo)
@@ -122,7 +122,7 @@ gnc_dialog_date_close_parented (GtkWidget *parent, const char *message,
                                 const char *label_message,
                                 gboolean ok_is_default,
                                 /* Returned data ... */
-                                Timespec *ts)
+                                time64 *t)
 {
     DialogDateClose *ddc;
     GtkWidget *date_box;
@@ -130,11 +130,11 @@ gnc_dialog_date_close_parented (GtkWidget *parent, const char *message,
     GtkBuilder *builder;
     gboolean retval;
 
-    if (!message || !label_message || !ts)
+    if (!message || !label_message || !t)
         return FALSE;
 
     ddc = g_new0 (DialogDateClose, 1);
-    ddc->ts = ts;
+    ddc->t = *t;
 
     builder = gtk_builder_new();
     gnc_builder_add_from_file (builder, "dialog-date-close.glade", "date_close_dialog");
@@ -146,7 +146,7 @@ gnc_dialog_date_close_parented (GtkWidget *parent, const char *message,
     date_box = GTK_WIDGET(gtk_builder_get_object (builder, "date_box"));
     ddc->date = gnc_date_edit_new (time(NULL), FALSE, FALSE);
     gtk_box_pack_start (GTK_BOX(date_box), ddc->date, TRUE, TRUE, 0);
-    gnc_date_edit_set_time (GNC_DATE_EDIT (ddc->date), ts->tv_sec);
+    gnc_date_edit_set_time (GNC_DATE_EDIT (ddc->date), *t);
 
     if (parent)
         gtk_window_set_transient_for (GTK_WINDOW(ddc->dialog), GTK_WINDOW(parent));
@@ -203,7 +203,7 @@ gnc_dialog_dates_acct_question_parented (GtkWidget *parent, const char *message,
         GList * acct_types, GList * acct_commodities,
         QofBook *book, GncBillTerm *terms,
         /* Returned Data... */
-        Timespec *ddue, Timespec *post,
+        time64 *ddue, time64 *post,
         char **memo, Account **acct, gboolean *answer)
 {
     DialogDateClose *ddc;
@@ -220,8 +220,8 @@ gnc_dialog_dates_acct_question_parented (GtkWidget *parent, const char *message,
         return FALSE;
 
     ddc = g_new0 (DialogDateClose, 1);
-    ddc->ts = ddue;
-    ddc->ts2 = post;
+    ddc->t = *ddue;
+    ddc->t2 = *post;
     ddc->book = book;
     ddc->acct_types = acct_types;
     ddc->acct_commodities = acct_commodities;
@@ -278,7 +278,7 @@ gnc_dialog_dates_acct_question_parented (GtkWidget *parent, const char *message,
 
 
     /* Set the post date widget */
-    gnc_date_edit_set_time (GNC_DATE_EDIT (ddc->post_date), post->tv_sec);
+    gnc_date_edit_set_time (GNC_DATE_EDIT (ddc->post_date), *post);
 
     /* Deal with the terms handling of the due date */
     if (terms)
@@ -289,7 +289,7 @@ gnc_dialog_dates_acct_question_parented (GtkWidget *parent, const char *message,
         post_date_changed_cb (GNC_DATE_EDIT (ddc->post_date), ddc);
     }
     else
-        gnc_date_edit_set_time (GNC_DATE_EDIT (ddc->date), ddue->tv_sec);
+        gnc_date_edit_set_time (GNC_DATE_EDIT (ddc->date), *ddue);
 
     /* Setup the account widget */
     fill_in_acct_info (ddc, set_default_acct);
@@ -329,7 +329,7 @@ gnc_dialog_date_acct_parented (GtkWidget *parent, const char *message,
                                gboolean ok_is_default,
                                GList * acct_types, QofBook *book,
                                /* Returned Data... */
-                               Timespec *date, Account **acct)
+                               time64 *date, Account **acct)
 {
     DialogDateClose *ddc;
     GtkLabel *label;
@@ -343,7 +343,7 @@ gnc_dialog_date_acct_parented (GtkWidget *parent, const char *message,
         return FALSE;
 
     ddc = g_new0 (DialogDateClose, 1);
-    ddc->ts = date;
+    ddc->t = *date;
     ddc->book = book;
     ddc->acct_types = acct_types;
     ddc->acct = *acct;
@@ -378,7 +378,7 @@ gnc_dialog_date_acct_parented (GtkWidget *parent, const char *message,
     gtk_label_set_text (label, acct_label_message);
 
     /* Set the date widget */
-    gnc_date_edit_set_time (GNC_DATE_EDIT (ddc->date), date->tv_sec);
+    gnc_date_edit_set_time (GNC_DATE_EDIT (ddc->date), *date);
 
     /* Setup the account widget */
     fill_in_acct_info (ddc, FALSE);
diff --git a/gnucash/gnome/dialog-date-close.h b/gnucash/gnome/dialog-date-close.h
index 03d33f0..757113e 100644
--- a/gnucash/gnome/dialog-date-close.h
+++ b/gnucash/gnome/dialog-date-close.h
@@ -33,7 +33,7 @@ gnc_dialog_date_close_parented (GtkWidget *parent, const char *message,
                                 const char *label_message,
                                 gboolean ok_is_default,
                                 /* Returned data ... */
-                                Timespec *date);
+                                time64 *date);
 
 
 /*
@@ -55,7 +55,7 @@ gnc_dialog_dates_acct_question_parented (GtkWidget *parent, const char *message,
         GList * acct_types, GList * acct_commodities,
         QofBook *book, GncBillTerm *terms,
         /* Returned Data... */
-        Timespec *ddue, Timespec *post,
+        time64 *ddue, time64 *post,
         char **memo, Account **acct, gboolean *answer);
 
 
@@ -66,6 +66,6 @@ gnc_dialog_date_acct_parented (GtkWidget *parent, const char *message,
                                gboolean ok_is_default,
                                GList * acct_types, QofBook *book,
                                /* Returned Data... */
-                               Timespec *date, Account **acct);
+                               time64 *date, Account **acct);
 
 #endif /* _DIALOG_DATE_CLOSE_H */
diff --git a/gnucash/gnome/dialog-invoice.c b/gnucash/gnome/dialog-invoice.c
index f1cb06a..8c2ece9 100644
--- a/gnucash/gnome/dialog-invoice.c
+++ b/gnucash/gnome/dialog-invoice.c
@@ -686,7 +686,7 @@ gnc_invoice_window_printCB (GtkWindow* parent, gpointer data)
 
 static gboolean
 gnc_dialog_post_invoice(InvoiceWindow *iw, char *message,
-                        Timespec *ddue, Timespec *postdate,
+                        time64 *ddue, time64 *postdate,
                         char **memo, Account **acc, gboolean *accumulate)
 {
     GncInvoice *invoice;
@@ -719,17 +719,17 @@ gnc_dialog_post_invoice(InvoiceWindow *iw, char *message,
      * For Vendor Bills and Employee Vouchers
      * that would be the date of the most recent invoice entry.
      * Failing that, today is used as a fallback */
-    *postdate = timespec_now();
+    *postdate = gnc_time(NULL);
 
     if (entries && ((gncInvoiceGetOwnerType (invoice) == GNC_OWNER_VENDOR) ||
                     (gncInvoiceGetOwnerType (invoice) == GNC_OWNER_EMPLOYEE)))
     {
-        postdate->tv_sec = gncEntryGetDate ((GncEntry*)entries->data);
+        *postdate = gncEntryGetDate ((GncEntry*)entries->data);
         for (entries_iter = entries; entries_iter != NULL; entries_iter = g_list_next(entries_iter))
         {
             time64 entrydate = gncEntryGetDate ((GncEntry*)entries_iter->data);
-            if (entrydate > postdate->tv_sec)
-                postdate->tv_sec = entrydate;
+            if (entrydate > *postdate)
+                *postdate = entrydate;
         }
     }
 
@@ -758,8 +758,8 @@ gnc_dialog_post_invoice(InvoiceWindow *iw, char *message,
 
 struct post_invoice_params
 {
-    Timespec ddue;          /* Due date */
-    Timespec postdate;      /* Date posted */
+    time64 ddue;            /* Due date */
+    time64 postdate;        /* Date posted */
     char *memo;             /* Memo for posting transaction */
     Account *acc;           /* Account to post to */
     gboolean accumulate;    /* Whether to accumulate splits */
@@ -772,7 +772,7 @@ gnc_invoice_post(InvoiceWindow *iw, struct post_invoice_params *post_params)
     GncInvoice *invoice;
     char *message, *memo;
     Account *acc = NULL;
-    Timespec ddue, postdate;
+    time64 ddue, postdate;
     gboolean accumulate;
     QofInstance *owner_inst;
     const char *text;
@@ -873,7 +873,7 @@ gnc_invoice_post(InvoiceWindow *iw, struct post_invoice_params *post_params)
         xfer = gnc_xfer_dialog (iw_get_window(iw), acc);
         gnc_xfer_dialog_is_exchange_dialog(xfer, &exch_rate);
         gnc_xfer_dialog_select_to_currency(xfer, account_currency);
-        gnc_xfer_dialog_set_date (xfer, timespecToTime64 (postdate));
+        gnc_xfer_dialog_set_date (xfer, postdate);
         /* Even if amount is 0 ask for an exchange rate. It's required
          * for the transaction generating code. Use an amount of 1 in
          * that case as the dialog won't allow to specify an exchange
@@ -913,7 +913,7 @@ gnc_invoice_post(InvoiceWindow *iw, struct post_invoice_params *post_params)
             gnc_price_begin_edit (convprice);
             gnc_price_set_commodity (convprice, account_currency);
             gnc_price_set_currency (convprice, gncInvoiceGetCurrency (invoice));
-            gnc_price_set_time (convprice, postdate);
+            gnc_price_set_time64 (convprice, postdate);
             gnc_price_set_source (convprice, PRICE_SOURCE_TEMP);
             gnc_price_set_typestr (convprice, PRICE_TYPE_LAST);
             gnc_price_set_value (convprice, exch_rate);
@@ -948,7 +948,7 @@ gnc_invoice_post(InvoiceWindow *iw, struct post_invoice_params *post_params)
     else
         auto_pay = gnc_prefs_get_bool (GNC_PREFS_GROUP_BILL, GNC_PREF_AUTO_PAY);
 
-    gncInvoicePostToAccount (invoice, acc, postdate.tv_sec, ddue.tv_sec, memo, accumulate, auto_pay);
+    gncInvoicePostToAccount (invoice, acc, postdate, ddue, memo, accumulate, auto_pay);
 
 cleanup:
     gncInvoiceCommitEdit (invoice);
diff --git a/gnucash/gnome/dialog-order.c b/gnucash/gnome/dialog-order.c
index 1cb7cb9..0c9bfbe 100644
--- a/gnucash/gnome/dialog-order.c
+++ b/gnucash/gnome/dialog-order.c
@@ -261,7 +261,7 @@ gnc_order_window_close_order_cb (GtkWidget *widget, gpointer data)
     GList *entries;
     char *message, *label;
     gboolean non_inv = FALSE;
-    Timespec ts = {gnc_time (NULL), 0};
+    time64 t = gnc_time (NULL);
 
     /* Make sure the order is ok */
     if (!gnc_order_window_verify_ok (ow))
@@ -310,10 +310,10 @@ gnc_order_window_close_order_cb (GtkWidget *widget, gpointer data)
     message = _("Do you really want to close the order?");
     label = _("Close Date");
 
-    if (!gnc_dialog_date_close_parented (ow->dialog, message, label, TRUE, &ts))
+    if (!gnc_dialog_date_close_parented (ow->dialog, message, label, TRUE, &t))
         return;
 
-    gncOrderSetDateClosed (order, ts.tv_nsec);
+    gncOrderSetDateClosed (order, t);
 
     /* save it off */
     gnc_order_window_ok_save (ow);
diff --git a/gnucash/gnome/dialog-payment.c b/gnucash/gnome/dialog-payment.c
index ee6d20c..39465a8 100644
--- a/gnucash/gnome/dialog-payment.c
+++ b/gnucash/gnome/dialog-payment.c
@@ -921,7 +921,7 @@ gnc_payment_ok_cb (G_GNUC_UNUSED GtkWidget *widget, gpointer data)
     {
         const char *memo, *num;
         GDate date;
-        Timespec ts;
+        time64 t;
         gnc_numeric exch = gnc_numeric_create(1, 1); //default to "one to one" rate
         GList *selected_lots = NULL;
         GtkTreeSelection *selection;
@@ -932,7 +932,7 @@ gnc_payment_ok_cb (G_GNUC_UNUSED GtkWidget *widget, gpointer data)
         num = gtk_entry_get_text (GTK_ENTRY (pw->num_entry));
         g_date_clear (&date, 1);
         gnc_date_edit_get_gdate (GNC_DATE_EDIT (pw->date_edit), &date);
-        ts = gdate_to_timespec (date);
+        t = gdate_to_time64 (date);
 
         /* Obtain the list of selected lots (documents/payments) from the dialog */
         selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(pw->docs_list_tree_view));
@@ -974,8 +974,8 @@ gnc_payment_ok_cb (G_GNUC_UNUSED GtkWidget *widget, gpointer data)
             auto_pay = gnc_prefs_get_bool (GNC_PREFS_GROUP_BILL, GNC_PREF_AUTO_PAY);
 
         gncOwnerApplyPayment (&pw->owner, &(pw->tx_info->txn), selected_lots,
-                              pw->post_acct, pw->xfer_acct, pw->amount_tot, exch,
-                              ts, memo, num, auto_pay);
+                              pw->post_acct, pw->xfer_acct, pw->amount_tot,
+                              exch, t, memo, num, auto_pay);
     }
     gnc_resume_gui_refresh ();
 
diff --git a/gnucash/gnome/dialog-price-edit-db.c b/gnucash/gnome/dialog-price-edit-db.c
index 4fdcc09..99835f9 100644
--- a/gnucash/gnome/dialog-price-edit-db.c
+++ b/gnucash/gnome/dialog-price-edit-db.c
@@ -223,7 +223,7 @@ gnc_prices_dialog_remove_clicked (GtkWidget *widget, gpointer data)
 /** Enumeration for the price delete list-store */
 enum GncPriceColumn {PRICED_FULL_NAME, PRICED_COMM, PRICED_DATE, PRICED_COUNT};
 
-static Timespec
+static time64
 gnc_prices_dialog_load_view (GtkTreeView *view, GNCPriceDB *pdb)
 {
     GtkTreeModel *model = gtk_tree_view_get_model (view);
@@ -234,8 +234,7 @@ gnc_prices_dialog_load_view (GtkTreeView *view, GNCPriceDB *pdb)
     GList *commodity_list = NULL;
     GtkTreeIter iter;
 
-    Timespec oldest_ts = timespec_now ();
-    oldest_ts.tv_nsec = 0;
+    time64 oldest = gnc_time (NULL);
 
     namespace_list = g_list_first (namespace_list);
     while (namespace_list != NULL)
@@ -256,14 +255,13 @@ gnc_prices_dialog_load_view (GtkTreeView *view, GNCPriceDB *pdb)
                 PriceList *list = gnc_pricedb_get_prices (pdb, tmp_commodity, NULL);
                 GList *node = g_list_last (list);
                 GNCPrice *price = (GNCPrice*)node->data;
-                Timespec price_ts = gnc_price_get_time (price);
+                time64 price_time = gnc_price_get_time64 (price);
                 const gchar *name_str = gnc_commodity_get_printname (tmp_commodity);
                 gchar *date_str, *num_str;
+                if (oldest > price_time)
+                    oldest = price_time;
 
-                if (timespec_cmp(&oldest_ts, &price_ts) >= 0)
-                    oldest_ts.tv_sec = price_ts.tv_sec;
-
-                date_str = g_strdup (gnc_print_date (price_ts));
+                date_str = qof_print_date (price_time);
                 num_str = g_strdup_printf ("%d", num);
 
                 gtk_list_store_append (GTK_LIST_STORE(model), &iter);
@@ -282,7 +280,7 @@ gnc_prices_dialog_load_view (GtkTreeView *view, GNCPriceDB *pdb)
     g_list_free (commodity_list);
     g_list_free (namespace_list);
 
-    return oldest_ts;
+    return oldest;
 }
 
 static GList *
@@ -371,15 +369,16 @@ selection_changed_cb (GtkTreeSelection *selection, gpointer data)
 static GDate
 get_fiscal_end_date (void)
 {
-    Timespec ts_end;
-    GDate f_end;
-
-    timespecFromTime64 (&ts_end, gnc_accounting_period_fiscal_end());
-    f_end = timespec_to_gdate (ts_end);
+    time64 end;
+    char datebuff[MAX_DATE_LENGTH + 1];
+    memset (datebuff, 0, sizeof(datebuff));
+    end = gnc_accounting_period_fiscal_end();
+    qof_print_date_buff(datebuff, sizeof(datebuff),
+                        gnc_accounting_period_fiscal_end());
+    PINFO("Fiscal end date is %s", datebuff);
 
-    PINFO("Fiscal end date is %s", qof_print_date (gnc_accounting_period_fiscal_end()));
+    return time64_to_gdate (end);
 
-    return f_end;
 }
 
 void
@@ -393,7 +392,7 @@ gnc_prices_dialog_remove_old_clicked (GtkWidget *widget, gpointer data)
     GtkTreeSelection *selection;
     GtkTreeViewColumn *tree_column;
     GtkCellRenderer   *cr;
-    Timespec first_ts;
+    time64 first;
     gint result;
 
     ENTER(" ");
@@ -430,7 +429,7 @@ gnc_prices_dialog_remove_old_clicked (GtkWidget *widget, gpointer data)
     gtk_cell_renderer_set_alignment (cr, 0.5, 0.5);
 
     // Load the view and get the earliest date
-    first_ts = gnc_prices_dialog_load_view (pdb_dialog->remove_view, pdb_dialog->price_db);
+    first = gnc_prices_dialog_load_view (pdb_dialog->remove_view, pdb_dialog->price_db);
     gtk_tree_selection_select_all (selection);
     g_signal_connect (selection, "changed", G_CALLBACK(selection_changed_cb), pdb_dialog);
 
@@ -455,7 +454,7 @@ gnc_prices_dialog_remove_old_clicked (GtkWidget *widget, gpointer data)
         // Are you sure you want to delete the entries and we have commodities
         if ((g_list_length (comm_list) != 0) && (gnc_verify_dialog (GTK_WINDOW (pdb_dialog->remove_dialog), FALSE, fmt, NULL)))
         {
-            Timespec last_ts;
+            time64 last;
             GDate fiscal_end_date = get_fiscal_end_date ();
             PriceRemoveSourceFlags source = PRICE_REMOVE_SOURCE_FQ;
             PriceRemoveKeepOptions keep = PRICE_REMOVE_KEEP_NONE;
@@ -466,8 +465,7 @@ gnc_prices_dialog_remove_old_clicked (GtkWidget *widget, gpointer data)
             gtk_tree_view_set_model (GTK_TREE_VIEW(pdb_dialog->price_tree), NULL);
 
             DEBUG("deleting prices");
-            last_ts.tv_sec = gnc_date_edit_get_date (GNC_DATE_EDIT (date));
-            last_ts.tv_nsec = 0;
+            last = gnc_date_edit_get_date (GNC_DATE_EDIT (date));
 
             button = GTK_WIDGET(gtk_builder_get_object (builder, "radiobutton_last_week"));
             if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)))
@@ -486,23 +484,29 @@ gnc_prices_dialog_remove_old_clicked (GtkWidget *widget, gpointer data)
                 keep = PRICE_REMOVE_KEEP_SCALED;
 
             if (keep != PRICE_REMOVE_KEEP_SCALED)
-                gnc_pricedb_remove_old_prices (pdb_dialog->price_db, comm_list, &fiscal_end_date,
-                                               last_ts, pdb_dialog->remove_source, keep);
+                gnc_pricedb_remove_old_prices (pdb_dialog->price_db, comm_list,
+                                               &fiscal_end_date,
+                                               last, pdb_dialog->remove_source,
+                                               keep);
             else
             {
-                Timespec tmp_ts;
-                GDate tmp_date = timespec_to_gdate (last_ts);
+                time64 tmp;
+                GDate tmp_date = time64_to_gdate (last);
                 g_date_subtract_months (&tmp_date, 6);
-                tmp_ts = gdate_to_timespec (tmp_date);
+                tmp = gdate_to_time64 (tmp_date);
 
-                gnc_pricedb_remove_old_prices (pdb_dialog->price_db, comm_list, &fiscal_end_date, tmp_ts,
-                                               pdb_dialog->remove_source, PRICE_REMOVE_KEEP_LAST_WEEKLY);
+                gnc_pricedb_remove_old_prices (pdb_dialog->price_db, comm_list,
+                                               &fiscal_end_date, tmp,
+                                               pdb_dialog->remove_source,
+                                               PRICE_REMOVE_KEEP_LAST_WEEKLY);
 
                 g_date_subtract_months (&tmp_date, 6);
-                tmp_ts = gdate_to_timespec (tmp_date);
+                tmp = gdate_to_time64 (tmp_date);
 
-                gnc_pricedb_remove_old_prices (pdb_dialog->price_db, comm_list, &fiscal_end_date, tmp_ts,
-                                               pdb_dialog->remove_source, PRICE_REMOVE_KEEP_LAST_MONTHLY);
+                gnc_pricedb_remove_old_prices (pdb_dialog->price_db, comm_list,
+                                               &fiscal_end_date, tmp,
+                                               pdb_dialog->remove_source,
+                                               PRICE_REMOVE_KEEP_LAST_MONTHLY);
             }
             // reconnect the model to the price treeview
             gtk_tree_view_set_model (GTK_TREE_VIEW(pdb_dialog->price_tree), model);
diff --git a/gnucash/gnome/dialog-price-editor.c b/gnucash/gnome/dialog-price-editor.c
index 5b474c6..e6ccfa1 100644
--- a/gnucash/gnome/dialog-price-editor.c
+++ b/gnucash/gnome/dialog-price-editor.c
@@ -143,7 +143,7 @@ price_to_gui (PriceEditDialog *pedit_dialog)
     const char *source;
     const char *type;
     gnc_numeric value;
-    Timespec date;
+    time64 date;
 
     if (pedit_dialog->price)
     {
@@ -160,7 +160,7 @@ price_to_gui (PriceEditDialog *pedit_dialog)
                                        name_space, fullname);
 
         currency = gnc_price_get_currency (pedit_dialog->price);
-        date = gnc_price_get_time (pedit_dialog->price);
+        date = gnc_price_get_time64 (pedit_dialog->price);
         source = gnc_price_get_source_string (pedit_dialog->price);
         type = gnc_price_get_typestr (pedit_dialog->price);
         value = gnc_price_get_value (pedit_dialog->price);
@@ -168,8 +168,7 @@ price_to_gui (PriceEditDialog *pedit_dialog)
     else
     {
         currency = gnc_default_currency ();
-        date.tv_sec = gnc_time (NULL);
-        date.tv_nsec = 0;
+        date = gnc_time (NULL);
         source = "user:price-editor"; //Sync with source_names in gnc-pricedb.c
         type = "";
         value = gnc_numeric_zero ();
@@ -182,7 +181,7 @@ price_to_gui (PriceEditDialog *pedit_dialog)
         (GNC_CURRENCY_EDIT (pedit_dialog->currency_edit), currency);
     }
 
-    gnc_date_edit_set_time (GNC_DATE_EDIT (pedit_dialog->date_edit), date.tv_sec);
+    gnc_date_edit_set_time (GNC_DATE_EDIT (pedit_dialog->date_edit), date);
 
     gtk_entry_set_text (GTK_ENTRY (pedit_dialog->source_entry), source);
 
@@ -203,7 +202,7 @@ gui_to_price (PriceEditDialog *pedit_dialog)
     const char *source;
     const char *type;
     gnc_numeric value;
-    Timespec date;
+    time64 date;
 
     name_space = gnc_ui_namespace_picker_ns (pedit_dialog->namespace_cbwe);
     fullname = gtk_entry_get_text( GTK_ENTRY( gtk_bin_get_child( GTK_BIN( GTK_COMBO_BOX(pedit_dialog->commodity_cbwe)))));
@@ -217,8 +216,7 @@ gui_to_price (PriceEditDialog *pedit_dialog)
     if (!currency)
         return _("You must select a Currency.");
 
-    date.tv_sec = gnc_date_edit_get_date (GNC_DATE_EDIT (pedit_dialog->date_edit));
-    date.tv_nsec = 0;
+    date = gnc_date_edit_get_date (GNC_DATE_EDIT (pedit_dialog->date_edit));
 
     source = gtk_entry_get_text (GTK_ENTRY (pedit_dialog->source_entry));
 
@@ -236,7 +234,7 @@ gui_to_price (PriceEditDialog *pedit_dialog)
     gnc_price_begin_edit (pedit_dialog->price);
     gnc_price_set_commodity (pedit_dialog->price, commodity);
     gnc_price_set_currency (pedit_dialog->price, currency);
-    gnc_price_set_time (pedit_dialog->price, date);
+    gnc_price_set_time64 (pedit_dialog->price, date);
     gnc_price_set_source_string (pedit_dialog->price, source);
     gnc_price_set_typestr (pedit_dialog->price, type);
     gnc_price_set_value (pedit_dialog->price, value);
diff --git a/gnucash/gnome/dialog-trans-assoc.c b/gnucash/gnome/dialog-trans-assoc.c
index 9429a32..0c1eab8 100644
--- a/gnucash/gnome/dialog-trans-assoc.c
+++ b/gnucash/gnome/dialog-trans-assoc.c
@@ -336,11 +336,12 @@ get_trans_info (AssocDialog *assoc_dialog)
             {
                 gchar *uri_u;
                 gboolean rel = FALSE;
-                Timespec ts = {xaccTransRetDatePosted (trans),0};
-
-                if (ts.tv_sec == 0)
-                    ts.tv_sec = gnc_time (NULL);
-
+                time64 t = xaccTransRetDatePosted (trans);
+                char datebuff[MAX_DATE_LENGTH + 1];
+                memset (datebuff, 0, sizeof(datebuff));
+                if (t == 0)
+                    t = gnc_time (NULL);
+                qof_print_date_buff (datebuff, sizeof(datebuff), t);
                 gtk_list_store_append (GTK_LIST_STORE(model), &iter);
 
                 if (g_str_has_prefix (uri,"file:/") && !g_str_has_prefix (uri,"file://")) // path is relative
@@ -349,7 +350,7 @@ get_trans_info (AssocDialog *assoc_dialog)
                 uri_u = convert_uri_to_unescaped (assoc_dialog, uri);
 
                 gtk_list_store_set (GTK_LIST_STORE(model), &iter,
-                                    DATE_TRANS, gnc_print_date (ts),
+                                    DATE_TRANS, datebuff,
                                     DESC_TRANS, xaccTransGetDescription (trans),
                                     URI_U, uri_u, AVAILABLE, _("Unknown"),
                                     URI_SPLIT, split, URI, uri,
diff --git a/libgnucash/engine/gnc-pricedb.c b/libgnucash/engine/gnc-pricedb.c
index daa0aa7..d148570 100644
--- a/libgnucash/engine/gnc-pricedb.c
+++ b/libgnucash/engine/gnc-pricedb.c
@@ -1327,7 +1327,7 @@ gnc_pricedb_remove_price(GNCPriceDB *db, GNCPrice *p)
 typedef struct
 {
     GNCPriceDB *db;
-    Timespec cutoff;
+    time64 cutoff;
     gboolean delete_fq;
     gboolean delete_user;
     gboolean delete_app;
@@ -1365,7 +1365,7 @@ check_one_price_date (GNCPrice *price, gpointer user_data)
         gnc_timespec_to_iso8601_buff(pt , buf);
         DEBUG("checking date %s", buf);
     }
-    if (timespec_cmp (&pt, &data->cutoff) < 0)
+    if (pt.tv_sec < data->cutoff)
     {
         data->list = g_slist_prepend(data->list, price);
         DEBUG("will delete");
@@ -1625,12 +1625,14 @@ gnc_pricedb_process_removal_list (GNCPriceDB *db, GDate *fiscal_end_date,
 
 gboolean
 gnc_pricedb_remove_old_prices (GNCPriceDB *db, GList *comm_list,
-                              GDate *fiscal_end_date, Timespec cutoff,
+                              GDate *fiscal_end_date, time64 cutoff,
                               PriceRemoveSourceFlags source,
                               PriceRemoveKeepOptions keep)
 {
     remove_info data;
     GList *node;
+    char datebuff[MAX_DATE_LENGTH + 1];
+    memset (datebuff, sizeof(datebuff), 0);
 
     data.db = db;
     data.cutoff = cutoff;
@@ -1663,7 +1665,9 @@ gnc_pricedb_remove_old_prices (GNCPriceDB *db, GList *comm_list,
         LEAVE("Empty price list");
         return FALSE;
     }
-    DEBUG("Number of Prices in list is %d, Cutoff date is %s", g_slist_length (data.list), gnc_print_date (cutoff));
+    qof_print_date_buff (datebuff, sizeof(datebuff), cutoff);
+    DEBUG("Number of Prices in list is %d, Cutoff date is %s",
+          g_slist_length (data.list), datebuff);
 
     // Check for a valid fiscal end of year date
     if (fiscal_end_date == NULL)
diff --git a/libgnucash/engine/gnc-pricedb.h b/libgnucash/engine/gnc-pricedb.h
index 3f0b65e..61ed2c9 100644
--- a/libgnucash/engine/gnc-pricedb.h
+++ b/libgnucash/engine/gnc-pricedb.h
@@ -406,7 +406,7 @@ typedef enum
  * @return True if there were prices to process, False if not.
  */
 gboolean     gnc_pricedb_remove_old_prices(GNCPriceDB *db, GList *comm_list,
-                                           GDate *fiscal_end_date, Timespec cutoff,
+                                           GDate *fiscal_end_date, time64 cutoff,
                                            PriceRemoveSourceFlags source,
                                            PriceRemoveKeepOptions keep);
 
diff --git a/libgnucash/engine/gncInvoice.c b/libgnucash/engine/gncInvoice.c
index 60f643a..40d87be 100644
--- a/libgnucash/engine/gncInvoice.c
+++ b/libgnucash/engine/gncInvoice.c
@@ -1935,7 +1935,6 @@ gncInvoiceApplyPayment (const GncInvoice *invoice, Transaction *txn,
     GNCLot *payment_lot;
     GList *selected_lots = NULL;
     const GncOwner *owner;
-    Timespec ts_pass = {date,0};
 
     /* Verify our arguments */
     if (!invoice || !gncInvoiceIsPosted (invoice) || !xfer_acc) return;
@@ -1944,8 +1943,9 @@ gncInvoiceApplyPayment (const GncInvoice *invoice, Transaction *txn,
     g_return_if_fail (owner->owner.undefined);
 
     /* Create a lot for this payment */
-    payment_lot = gncOwnerCreatePaymentLot (owner, &txn, invoice->posted_acc, xfer_acc,
-                                            amount, exch, ts_pass, memo, num);
+    payment_lot = gncOwnerCreatePaymentLot (owner, &txn, invoice->posted_acc,
+                                            xfer_acc, amount, exch,
+                                            date, memo, num);
 
     /* Select the invoice as only payment candidate */
     selected_lots = g_list_prepend (selected_lots, invoice->posted_lot);
diff --git a/libgnucash/engine/gncOwner.c b/libgnucash/engine/gncOwner.c
index 56b6036..6011936 100644
--- a/libgnucash/engine/gncOwner.c
+++ b/libgnucash/engine/gncOwner.c
@@ -725,7 +725,7 @@ gncOwnerLotsSortFunc (GNCLot *lotA, GNCLot *lotB)
 GNCLot *
 gncOwnerCreatePaymentLot (const GncOwner *owner, Transaction **preset_txn,
                           Account *posted_acc, Account *xfer_acc,
-                          gnc_numeric amount, gnc_numeric exch, Timespec date,
+                          gnc_numeric amount, gnc_numeric exch, time64 date,
                           const char *memo, const char *num)
 {
     QofBook *book;
@@ -814,7 +814,7 @@ gncOwnerCreatePaymentLot (const GncOwner *owner, Transaction **preset_txn,
         /* set per book option */
         xaccTransSetCurrency (txn, commodity);
         xaccTransSetDateEnteredSecs (txn, gnc_time (NULL));
-        xaccTransSetDatePostedSecs (txn, date.tv_sec);
+        xaccTransSetDatePostedSecs (txn, date);
 
 
         /* The split for the transfer account */
@@ -1378,7 +1378,7 @@ void gncOwnerAutoApplyPaymentsWithLots (const GncOwner *owner, GList *lots)
 void
 gncOwnerApplyPayment (const GncOwner *owner, Transaction **preset_txn, GList *lots,
                       Account *posted_acc, Account *xfer_acc,
-                      gnc_numeric amount, gnc_numeric exch, Timespec date,
+                      gnc_numeric amount, gnc_numeric exch, time64 date,
                       const char *memo, const char *num, gboolean auto_pay)
 {
     GNCLot *payment_lot = NULL;
diff --git a/libgnucash/engine/gncOwner.h b/libgnucash/engine/gncOwner.h
index 1542f98..79bbaba 100644
--- a/libgnucash/engine/gncOwner.h
+++ b/libgnucash/engine/gncOwner.h
@@ -216,7 +216,7 @@ gboolean gncOwnerGetOwnerFromTypeGuid (QofBook *book, GncOwner *owner, QofIdType
 GNCLot *
 gncOwnerCreatePaymentLot (const GncOwner *owner, Transaction **preset_txn,
                           Account *posted_acc, Account *xfer_acc,
-                          gnc_numeric amount, gnc_numeric exch, Timespec date,
+                          gnc_numeric amount, gnc_numeric exch, time64 date,
                           const char *memo, const char *num);
 
 /**
@@ -269,7 +269,7 @@ void gncOwnerAutoApplyPaymentsWithLots (const GncOwner *owner, GList *lots);
 void
 gncOwnerApplyPayment (const GncOwner *owner, Transaction **preset_txn, GList *lots,
                       Account *posted_acc, Account *xfer_acc,
-                      gnc_numeric amount, gnc_numeric exch, Timespec date,
+                      gnc_numeric amount, gnc_numeric exch, time64 date,
                       const char *memo, const char *num, gboolean auto_pay);
 
 /** Helper function to find a split in lot that best offsets target_value
diff --git a/libgnucash/engine/test/utest-gnc-pricedb.c b/libgnucash/engine/test/utest-gnc-pricedb.c
index 345a34d..841260a 100644
--- a/libgnucash/engine/test/utest-gnc-pricedb.c
+++ b/libgnucash/engine/test/utest-gnc-pricedb.c
@@ -789,9 +789,9 @@ static void test_gnc_pricedb_remove_old_prices (PriceDBFixture *fixture, gconstp
                                         PRICE_REMOVE_SOURCE_USER |
                                         PRICE_REMOVE_SOURCE_APP;
 
-    Timespec t_cut = gnc_dmy2timespec(1, 1, 2008);
-    Timespec t_cut1 = gnc_dmy2timespec(1, 1, 2009);
-    Timespec t_cut2 = gnc_dmy2timespec(1, 1, 2010);
+    time64 t_cut = gnc_dmy2time64(1, 1, 2008);
+    time64 t_cut1 = gnc_dmy2time64(1, 1, 2009);
+    time64 t_cut2 = gnc_dmy2time64(1, 1, 2010);
 
     GDate *fiscal_end_date = g_date_new ();
     g_date_set_dmy (fiscal_end_date, 31, 12, 2017);

commit e79612035946a2b0c2d323918d3f1d63152e535b
Author: John Ralls <jralls at ceridwen.us>
Date:   Tue Jul 31 11:25:45 2018 -0700

    Remove Timespec from gnucash/gnome-utils.
    
    Plus a bit of bleed into gnome because of deleted functions.

diff --git a/gnucash/gnome-utils/dialog-dup-trans.c b/gnucash/gnome-utils/dialog-dup-trans.c
index bd30860..0b5692d 100644
--- a/gnucash/gnome-utils/dialog-dup-trans.c
+++ b/gnucash/gnome-utils/dialog-dup-trans.c
@@ -282,7 +282,7 @@ gnc_dup_trans_dialog_gdate (GtkWidget * parent, GDate *gdate_p,
     time64 tmp_time;
     g_assert(gdate_p);
 
-    tmp_time = timespecToTime64(gdate_to_timespec(*gdate_p));
+    tmp_time = gdate_to_time64 (*gdate_p);
     return gnc_dup_trans_dialog_internal(parent, NULL, TRUE, &tmp_time, gdate_p,
                                          num, out_num, NULL, NULL);
 }
@@ -293,7 +293,7 @@ gnc_dup_date_dialog (GtkWidget * parent, const char* title, GDate *gdate_p)
     time64 tmp_time;
     g_assert(gdate_p);
 
-    tmp_time = timespecToTime64(gdate_to_timespec(*gdate_p));
+    tmp_time = gdate_to_time64(*gdate_p);
     return gnc_dup_trans_dialog_internal(parent, title, TRUE, &tmp_time, gdate_p,
                                          NULL, NULL, NULL, NULL);
 }
diff --git a/gnucash/gnome-utils/dialog-transfer.c b/gnucash/gnome-utils/dialog-transfer.c
index 89a4bd9..fb15697 100644
--- a/gnucash/gnome-utils/dialog-transfer.c
+++ b/gnucash/gnome-utils/dialog-transfer.c
@@ -230,7 +230,7 @@ typedef struct
     GNCPriceDB *pricedb;
     gnc_commodity *from;
     gnc_commodity *to;
-    Timespec ts;
+    time64 time;
     gboolean reverse;
 } PriceReq;
 
@@ -243,7 +243,7 @@ price_request_from_xferData(PriceReq *pr, XferDialog *xd)
     pr->pricedb = xd->pricedb;
     pr->from = xd->from_commodity;
     pr->to = xd->to_commodity;
-    pr->ts = gnc_date_edit_get_date_ts (GNC_DATE_EDIT (xd->date_entry));
+    pr->time = gnc_date_edit_get_date (GNC_DATE_EDIT (xd->date_entry));
     pr->reverse = FALSE;
 }
 
@@ -261,12 +261,12 @@ lookup_price(PriceReq *pr, PriceDate pd)
     {
         default:
         case SAME_DAY:
-            prc = gnc_pricedb_lookup_day (pr->pricedb, pr->from,
-                                          pr->to, pr->ts);
+            prc = gnc_pricedb_lookup_day_t64 (pr->pricedb, pr->from,
+                                              pr->to, pr->time);
             break;
         case NEAREST:
-            prc = gnc_pricedb_lookup_nearest_in_time (pr->pricedb, pr->from,
-                                                      pr->to, pr->ts);
+            prc = gnc_pricedb_lookup_nearest_in_time64 (pr->pricedb, pr->from,
+                                                      pr->to, pr->time);
             break;
         case LATEST:
             prc = gnc_pricedb_lookup_latest (pr->pricedb, pr->from, pr->to);
@@ -1499,7 +1499,7 @@ check_edit(XferDialog *xferData)
 }
 
 static void
-create_transaction(XferDialog *xferData, Timespec *ts,
+create_transaction(XferDialog *xferData, time64 time,
                    Account *from_account, Account* to_account,
                    gnc_numeric amount, gnc_numeric to_amount)
 {
@@ -1513,7 +1513,7 @@ create_transaction(XferDialog *xferData, Timespec *ts,
     xaccTransBeginEdit(trans);
 
     xaccTransSetCurrency(trans, xferData->from_commodity);
-    xaccTransSetDatePostedSecs(trans, ts->tv_sec);
+    xaccTransSetDatePostedSecs(trans, time);
 
     /* Trans-Num or Split-Action set with gnc_set_num_action below per book
      * option */
@@ -1601,7 +1601,7 @@ update_price(XferDialog *xferData, PriceReq *pr)
         return;
     }
     gnc_price_begin_edit (pr->price);
-    gnc_price_set_time (pr->price, pr->ts);
+    gnc_price_set_time64 (pr->price, pr->time);
     gnc_price_set_typestr(pr->price, xferData->price_type);
     gnc_price_set_value (pr->price, value);
     gnc_price_commit_edit (pr->price);
@@ -1613,7 +1613,7 @@ update_price(XferDialog *xferData, PriceReq *pr)
 }
 
 static void
-new_price(XferDialog *xferData, Timespec ts)
+new_price(XferDialog *xferData, time64 time)
 {
     GNCPrice *price = NULL;
     gnc_commodity *from = xferData->from_commodity;
@@ -1637,7 +1637,7 @@ new_price(XferDialog *xferData, Timespec ts)
     gnc_price_begin_edit (price);
     gnc_price_set_commodity (price, from);
     gnc_price_set_currency (price, to);
-    gnc_price_set_time (price, ts);
+    gnc_price_set_time64 (price, time);
     gnc_price_set_source (price, xferData->price_source);
     gnc_price_set_typestr (price, xferData->price_type);
     gnc_price_set_value (price, value);
@@ -1649,7 +1649,7 @@ new_price(XferDialog *xferData, Timespec ts)
 }
 
 static void
-create_price(XferDialog *xferData, Timespec ts)
+create_price(XferDialog *xferData, time64 time)
 {
     PriceReq pr;
 
@@ -1664,7 +1664,7 @@ create_price(XferDialog *xferData, Timespec ts)
         update_price(xferData, &pr);
         return;
     }
-    new_price (xferData, ts);
+    new_price (xferData, time);
 }
 
 void
@@ -1674,7 +1674,7 @@ gnc_xfer_dialog_response_cb (GtkDialog *dialog, gint response, gpointer data)
     Account *to_account;
     Account *from_account;
     gnc_numeric amount, to_amount;
-    Timespec ts;
+    time64 time;
     GDate date;
 
     g_return_if_fail (xferData != NULL);
@@ -1718,7 +1718,7 @@ gnc_xfer_dialog_response_cb (GtkDialog *dialog, gint response, gpointer data)
     }
     g_date_clear (&date, 1);
     gnc_date_edit_get_gdate (GNC_DATE_EDIT (xferData->date_entry), &date);
-    ts = gdate_to_timespec (date);
+    time = gdate_to_time64 (date);
 
     if (!gnc_commodity_equiv(xferData->from_commodity, xferData->to_commodity))
     {
@@ -1748,12 +1748,12 @@ gnc_xfer_dialog_response_cb (GtkDialog *dialog, gint response, gpointer data)
         *(xferData->exch_rate) = gnc_numeric_abs(price_value);
     }
     else
-        create_transaction (xferData, &ts, from_account, to_account,
+        create_transaction (xferData, time, from_account, to_account,
                             amount, to_amount);
     /* try to save this to the pricedb */
     if (xferData->pricedb && !gnc_commodity_equal (xferData->from_commodity,
                                                    xferData->to_commodity))
-        create_price(xferData, ts);
+        create_price(xferData, time);
     /* Refresh everything */
     gnc_resume_gui_refresh ();
 
diff --git a/gnucash/gnome-utils/gnc-date-edit.c b/gnucash/gnome-utils/gnc-date-edit.c
index c2e93a9..b729c33 100644
--- a/gnucash/gnome-utils/gnc-date-edit.c
+++ b/gnucash/gnome-utils/gnc-date-edit.c
@@ -184,13 +184,13 @@ gnc_date_edit_popdown(GNCDateEdit *gde)
 static void
 day_selected (GtkCalendar *calendar, GNCDateEdit *gde)
 {
-    Timespec t;
+    time64 t;
     guint year, month, day;
     gde->in_selected_handler = TRUE;
     gtk_calendar_get_date (calendar, &year, &month, &day);
     /* GtkCalendar returns a 0-based month */
-    t = gnc_dmy2timespec (day, month + 1, year);
-    gnc_date_edit_set_time_ts (gde, t);
+    t = gnc_dmy2time64 (day, month + 1, year);
+    gnc_date_edit_set_time (gde, t);
     gde->in_selected_handler = FALSE;
 }
 
@@ -809,12 +809,6 @@ gnc_date_edit_set_gdate (GNCDateEdit *gde, const GDate *date)
     gnc_date_edit_set_time(gde, t);
 }
 
-void
-gnc_date_edit_set_time_ts (GNCDateEdit *gde, Timespec the_time)
-{
-    gnc_date_edit_set_time (gde, the_time.tv_sec);
-}
-
 /**
  * gnc_date_edit_set_popup_range:
  * @gde: The GNCDateEdit widget
@@ -1033,13 +1027,6 @@ gnc_date_edit_new (time64 the_time, int show_time, int use_24_format)
              | (use_24_format ? GNC_DATE_EDIT_24_HR : 0)));
 }
 
-GtkWidget *
-gnc_date_edit_new_ts (Timespec the_time, int show_time, int use_24_format)
-{
-    return gnc_date_edit_new (the_time.tv_sec, show_time, use_24_format);
-}
-
-
 /*
  * Create a new GncDateEdit widget from a glade file.  The widget
  * generated is set to today's date, and will not show a time as part
@@ -1193,16 +1180,6 @@ gnc_date_edit_get_gdate (GNCDateEdit *gde, GDate *date)
     gnc_gdate_set_time64 (date, t);
 }
 
-Timespec
-gnc_date_edit_get_date_ts (GNCDateEdit *gde)
-{
-    Timespec ts = { 0, 0 };
-
-    ts.tv_sec = gnc_date_edit_get_date (gde);
-
-    return ts;
-}
-
 /**
  * gnc_date_edit_get_date_end:
  * @gde: The GNCDateEdit widget
@@ -1224,16 +1201,6 @@ gnc_date_edit_get_date_end (GNCDateEdit *gde)
     return gnc_mktime (&tm);
 }
 
-Timespec
-gnc_date_edit_get_date_end_ts (GNCDateEdit *gde)
-{
-    Timespec ts = { 0, 0 };
-
-    ts.tv_sec = gnc_date_edit_get_date_end (gde);
-
-    return ts;
-}
-
 /**
  * gnc_date_edit_set_flags:
  * @gde: The date editor widget whose flags should be changed.
diff --git a/gnucash/gnome-utils/gnc-date-edit.h b/gnucash/gnome-utils/gnc-date-edit.h
index f6b7472..68f5478 100644
--- a/gnucash/gnome-utils/gnc-date-edit.h
+++ b/gnucash/gnome-utils/gnc-date-edit.h
@@ -93,8 +93,6 @@ GType     gnc_date_edit_get_type        (void);
 
 GtkWidget *gnc_date_edit_new            (time64 the_time,
         int show_time, int use_24_format);
-GtkWidget *gnc_date_edit_new_ts         (Timespec the_time,
-        int show_time, int use_24_format);
 
 /**
  * Create a new GncDateEdit widget from a glade file.  The widget
@@ -121,16 +119,13 @@ GtkWidget *gnc_date_edit_new_flags      (time64 the_time,
 
 void      gnc_date_edit_set_gdate       (GNCDateEdit *gde, const GDate *date);
 void      gnc_date_edit_set_time        (GNCDateEdit *gde, time64 the_time);
-void      gnc_date_edit_set_time_ts     (GNCDateEdit *gde, Timespec the_time);
 
 void      gnc_date_edit_set_popup_range (GNCDateEdit *gde,
-        int low_hour, int up_hour);
+                                         int low_hour, int up_hour);
 
 void      gnc_date_edit_get_gdate       (GNCDateEdit *gde, GDate *date);
-time64  gnc_date_edit_get_date        (GNCDateEdit *gde);
-Timespec  gnc_date_edit_get_date_ts     (GNCDateEdit *gde);
-time64  gnc_date_edit_get_date_end    (GNCDateEdit *gde);
-Timespec  gnc_date_edit_get_date_end_ts (GNCDateEdit *gde);
+time64    gnc_date_edit_get_date        (GNCDateEdit *gde);
+time64    gnc_date_edit_get_date_end    (GNCDateEdit *gde);
 
 void      gnc_date_edit_set_flags       (GNCDateEdit *gde,
         GNCDateEditFlags flags);
diff --git a/gnucash/gnome-utils/gnc-tree-control-split-reg.c b/gnucash/gnome-utils/gnc-tree-control-split-reg.c
index 3c68ddd..f366e82 100644
--- a/gnucash/gnome-utils/gnc-tree-control-split-reg.c
+++ b/gnucash/gnome-utils/gnc-tree-control-split-reg.c
@@ -1537,15 +1537,15 @@ static gboolean gtcsr_move_current_entry_updown(GncTreeViewSplitReg *view,
             }
 
             /* Special treatment if the equality doesn't hold if we access the
-            dates as timespec. See the comment in gncEntrySetDateGDate() for the
-            reason: Some code used the timespec at noon for the EntryDate, other
-            code used the timespec at the start of day. */
+            dates as time64. See the comment in gncEntrySetDateGDate() for the
+            reason: Some code used the time64 at noon for the EntryDate, other
+            code used the time64 at the start of day. */
             time1 = xaccTransRetDatePosted(current_trans);
             time2 = xaccTransRetDatePosted(target_trans);
             if (really_do_it && time1 != time2)
             {
-                /* Timespecs are not equal, even though the GDates were equal? Then
-                we set the GDates again. This will force the timespecs to be equal
+                /* Times are not equal, even though the GDates were equal? Then
+                we set the GDates again. This will force the times to be equal
                 as well. */
                 xaccTransSetDatePostedGDate(current_trans, d1);
                 xaccTransSetDatePostedGDate(target_trans, d2);
diff --git a/gnucash/gnome-utils/gnc-tree-model-price.c b/gnucash/gnome-utils/gnc-tree-model-price.c
index eea39aa..2192806 100644
--- a/gnucash/gnome-utils/gnc-tree-model-price.c
+++ b/gnucash/gnome-utils/gnc-tree-model-price.c
@@ -679,6 +679,8 @@ gnc_tree_model_price_get_value (GtkTreeModel *tree_model,
     gnc_commodity_namespace *name_space;
     gnc_commodity *commodity;
     GNCPrice *price;
+    char datebuff[MAX_DATE_LENGTH + 1];
+    memset (datebuff, 0, sizeof(datebuff));
 
     g_return_if_fail (GNC_IS_TREE_MODEL_PRICE (model));
     g_return_if_fail (iter != NULL);
@@ -767,8 +769,10 @@ gnc_tree_model_price_get_value (GtkTreeModel *tree_model,
         g_value_set_string (value, gnc_commodity_get_printname (commodity));
         break;
     case GNC_TREE_MODEL_PRICE_COL_DATE:
+        qof_print_date_buff (datebuff, sizeof(datebuff),
+                             gnc_price_get_time (price));
         g_value_init (value, G_TYPE_STRING);
-        g_value_set_string (value, gnc_print_date (gnc_price_get_time (price)));
+        g_value_set_string (value, datebuff);
         break;
     case GNC_TREE_MODEL_PRICE_COL_SOURCE:
         g_value_init (value, G_TYPE_STRING);
diff --git a/gnucash/gnome-utils/gnc-tree-model-split-reg.c b/gnucash/gnome-utils/gnc-tree-model-split-reg.c
index 7965bf3..e44fd76 100644
--- a/gnucash/gnome-utils/gnc-tree-model-split-reg.c
+++ b/gnucash/gnome-utils/gnc-tree-model-split-reg.c
@@ -830,10 +830,11 @@ gnc_tree_model_split_reg_get_tooltip (GncTreeModelSplitReg *model, gint position
 {
     GncTreeModelSplitRegPrivate *priv;
     Transaction *trans;
-    const gchar *date_text;
+    char date_text[MAX_DATE_LENGTH + 1];
     const gchar *desc_text;
     GList *node;
 
+    memset (date_text, 0, sizeof(date_text));
     priv = model->priv;
 
     node = g_list_nth (priv->full_tlist, position);
@@ -848,8 +849,8 @@ gnc_tree_model_split_reg_get_tooltip (GncTreeModelSplitReg *model, gint position
            return g_strconcat ("Blank Transaction", NULL);
         else
         {
-            Timespec ts = {xaccTransRetDatePosted (trans), 0};
-            date_text = gnc_print_date (ts);
+            time64 t = xaccTransRetDatePosted (trans);
+            qof_print_date_buff (date_text, sizeof(date_text), t);
             desc_text = xaccTransGetDescription (trans);
             model->current_trans = trans;
             return g_strconcat (date_text, "\n", desc_text, NULL);
diff --git a/gnucash/gnome-utils/gnc-tree-view-price.c b/gnucash/gnome-utils/gnc-tree-view-price.c
index ad95cca..f4488fb 100644
--- a/gnucash/gnome-utils/gnc-tree-view-price.c
+++ b/gnucash/gnome-utils/gnc-tree-view-price.c
@@ -219,7 +219,7 @@ static gint
 default_sort (GNCPrice *price_a, GNCPrice *price_b)
 {
     gnc_commodity *curr_a, *curr_b;
-    Timespec ts_a, ts_b;
+    time64 time_a, time_b;
     gint result;
 
     /* Primary sort (i.e. commodity name) handled by the tree structure.  */
@@ -237,9 +237,9 @@ default_sort (GNCPrice *price_a, GNCPrice *price_b)
     if (result != 0) return result;
 
     /* tertiary sort: time */
-    ts_a = gnc_price_get_time (price_a);
-    ts_b = gnc_price_get_time (price_b);
-    result = timespec_cmp (&ts_a, &ts_b);
+    time_a = gnc_price_get_time64 (price_a);
+    time_b = gnc_price_get_time64 (price_b);
+    result = time_a < time_b ? -1 : time_a > time_b ? 1 : 0;
     if (result)
         /* Reverse the result to present the most recent quote first. */
         return -result;
@@ -270,16 +270,16 @@ sort_by_date (GtkTreeModel *f_model,
               gpointer user_data)
 {
     GNCPrice *price_a, *price_b;
-    Timespec ts_a, ts_b;
+    time64 time_a, time_b;
     gboolean result;
 
     if (!get_prices (f_model, f_iter_a, f_iter_b, &price_a, &price_b))
         return sort_ns_or_cm (f_model, f_iter_a, f_iter_b);
 
     /* sort by time first */
-    ts_a = gnc_price_get_time (price_a);
-    ts_b = gnc_price_get_time (price_b);
-    result = timespec_cmp (&ts_a, &ts_b);
+    time_a = gnc_price_get_time64 (price_a);
+    time_b = gnc_price_get_time64 (price_b);
+    result = time_a < time_b ? -1 : time_a > time_b ? 1 : 0;
     if (result)
         /* Reverse the result to present the most recent quote first. */
         return -result;
diff --git a/gnucash/gnome-utils/gnc-tree-view-split-reg.c b/gnucash/gnome-utils/gnc-tree-view-split-reg.c
index c10d3af..d6fc079 100644
--- a/gnucash/gnome-utils/gnc-tree-view-split-reg.c
+++ b/gnucash/gnome-utils/gnc-tree-view-split-reg.c
@@ -1394,6 +1394,7 @@ gtv_sr_cdf0 (GtkTreeViewColumn *col, GtkCellRenderer *cell, GtkTreeModel *s_mode
     gnc_numeric num = gnc_numeric_zero();
     const gchar *s = "";
     const gchar *row_color;
+    char datebuff[MAX_DATE_LENGTH + 1];
     RowDepth depth;
     gint *indices;
     Account *anchor = view->priv->anchor;
@@ -1462,6 +1463,7 @@ gtv_sr_cdf0 (GtkTreeViewColumn *col, GtkCellRenderer *cell, GtkTreeModel *s_mode
     switch (viewcol) {
     case COL_DATE:
         /* Column is DATE */
+        memset (datebuff, 0, sizeof(datebuff));
         if (is_split)
             g_object_set (cell, "cell-background", "white", (gchar*)NULL);
 
@@ -1474,65 +1476,60 @@ gtv_sr_cdf0 (GtkTreeViewColumn *col, GtkCellRenderer *cell, GtkTreeModel *s_mode
             show_extra_dates = TRUE;
 
         if (is_trow1) {
-            Timespec ts = {xaccTransRetDatePosted (trans),0};
+            time64 t = xaccTransRetDatePosted (trans);
             //If the time returned by xaccTransGetDatePostedTS is 0 then assume it
             //is a new transaction and set the time to current time to show current
             //date on new transactions
-            if (ts.tv_sec == 0)
-                ts.tv_sec = gnc_time (NULL);
-            s = gnc_print_date (ts);
+            if (t == 0)
+                t = gnc_time (NULL);
+            qof_print_date_buff (datebuff, sizeof(datebuff), t);
             editable = TRUE;
         }
         else if (is_trow2 && show_extra_dates) {
-            Timespec ts = {xaccTransRetDateEntered (trans),0};
+            time64 t = xaccTransRetDateEntered (trans);
             g_object_set (cell, "cell-background", YELLOWCELL, (gchar*)NULL);
             //If the time returned by xaccTransGetDateEnteredTS is 0 then assume it
             //is a new transaction and set the time to current time to show current
             //date on new transactions
-            if (ts.tv_sec == 0)
-                ts.tv_sec = gnc_time (NULL);
-            s = gnc_print_date (ts);
+            if (t == 0)
+                t = gnc_time (NULL);
+            qof_print_date_buff (datebuff, sizeof(datebuff), t);
             editable = FALSE;
         }
         else if (is_split && show_extra_dates) {
-            Timespec ts = {0,0};
+            time64 t = 0;
 
             if (xaccSplitGetReconcile (split) == YREC)
             {
-                xaccSplitGetDateReconciledTS (split, &ts);
+                t = xaccSplitGetDateReconciled (split);
                 //If the time returned by xaccTransGetDateEnteredTS is 0 then assume it
                 //is a new transaction and set the time to current time to show current
                 //date on new transactions
-                if (ts.tv_sec == 0)
+                if (t == 0)
                 {
-                    ts.tv_sec = gnc_time (NULL);
+                    t = gnc_time (NULL);
                     //xaccSplitSetDateReconciledTS (split, ts.tv_sec);
                 }//if
-                s = gnc_print_date (ts);
+                qof_print_date_buff (datebuff, sizeof(datebuff), 0);
             }
-            else
-                s = "";
             editable = FALSE;
         }
         else {
-            s = "";
             editable = FALSE;
         }
 
         /* Is this a template */
         if (is_template && is_trow1)
         {
-            s =  _(" Scheduled ");
+            strncpy (datebuff,  _(" Scheduled "), sizeof(datebuff));
             editable = FALSE;
         }
         else if (is_template && is_trow2 && show_extra_dates)
         {
-            s = "";
             editable = FALSE;
         }
         else if (is_template && is_split && show_extra_dates)
         {
-            s = "";
             editable = FALSE;
         }
 
@@ -1540,11 +1537,12 @@ gtv_sr_cdf0 (GtkTreeViewColumn *col, GtkCellRenderer *cell, GtkTreeModel *s_mode
 
         /* This will remove the calander buttons if FALSE */
         g_object_set (cell, "use_buttons", view->priv->show_calendar_buttons, NULL );
-        g_object_set (cell, "text", s, "editable", editable, NULL);
+        g_object_set (cell, "text", datebuff, "editable", editable, NULL);
         break;
 
     case COL_DUEDATE:
         /* Column is DUE DATE */
+        memset (datebuff, 0, sizeof(datebuff));
         if (is_split)
             g_object_set (cell, "cell-background", "white", (gchar*)NULL);
 
@@ -1552,18 +1550,17 @@ gtv_sr_cdf0 (GtkTreeViewColumn *col, GtkCellRenderer *cell, GtkTreeModel *s_mode
             /* Only print the due date for invoice transactions */
             if (type == TXN_TYPE_INVOICE)
             {
-                Timespec ts = {xaccTransRetDateDue (trans), 0};
-                s = gnc_print_date (ts);
+                time64 t = xaccTransRetDateDue (trans);
+                qof_print_date_buff (datebuff, sizeof(datebuff), t);
                 editable = FALSE;
             }
             else {
-                s = "";
                 editable = FALSE;
             }
         }
         editable = (read_only == TRUE) ? FALSE : editable;
 
-        g_object_set (cell, "text", s, "editable", editable, NULL);
+        g_object_set (cell, "text", datebuff, "editable", editable, NULL);
         break;
 
     case COL_NUMACT:
diff --git a/gnucash/gnome/dialog-date-close.c b/gnucash/gnome/dialog-date-close.c
index 5c22725..6a34d80 100644
--- a/gnucash/gnome/dialog-date-close.c
+++ b/gnucash/gnome/dialog-date-close.c
@@ -87,14 +87,14 @@ gnc_dialog_date_close_ok_cb (GtkWidget *widget, gpointer user_data)
     }
 
     if (ddc->post_date)
-        *(ddc->ts2) = gnc_date_edit_get_date_ts (GNC_DATE_EDIT (ddc->post_date));
+        ddc->ts2->tv_sec = gnc_date_edit_get_date (GNC_DATE_EDIT (ddc->post_date));
 
     if (ddc->date)
     {
         if (ddc->terms)
             ddc->ts->tv_sec = gncBillTermComputeDueDate (ddc->terms, ddc->ts2->tv_sec);
         else
-            *(ddc->ts) = gnc_date_edit_get_date_ts (GNC_DATE_EDIT (ddc->date));
+            ddc->ts->tv_sec = gnc_date_edit_get_date (GNC_DATE_EDIT (ddc->date));
     }
 
     if (ddc->memo_entry && ddc->memo)
@@ -146,7 +146,7 @@ gnc_dialog_date_close_parented (GtkWidget *parent, const char *message,
     date_box = GTK_WIDGET(gtk_builder_get_object (builder, "date_box"));
     ddc->date = gnc_date_edit_new (time(NULL), FALSE, FALSE);
     gtk_box_pack_start (GTK_BOX(date_box), ddc->date, TRUE, TRUE, 0);
-    gnc_date_edit_set_time_ts (GNC_DATE_EDIT (ddc->date), *ts);
+    gnc_date_edit_set_time (GNC_DATE_EDIT (ddc->date), ts->tv_sec);
 
     if (parent)
         gtk_window_set_transient_for (GTK_WINDOW(ddc->dialog), GTK_WINDOW(parent));
@@ -184,12 +184,12 @@ static void
 post_date_changed_cb (GNCDateEdit *gde, gpointer d)
 {
     DialogDateClose *ddc = d;
-    Timespec post_date;
-    Timespec due_date = {0,0};
+    time64 post_date;
+    time64 due_date = 0;
 
-    post_date = gnc_date_edit_get_date_ts (gde);
-    due_date.tv_sec = gncBillTermComputeDueDate (ddc->terms, post_date.tv_sec);
-    gnc_date_edit_set_time_ts (GNC_DATE_EDIT (ddc->date), due_date);
+    post_date = gnc_date_edit_get_date (gde);
+    due_date = gncBillTermComputeDueDate (ddc->terms, post_date);
+    gnc_date_edit_set_time (GNC_DATE_EDIT (ddc->date), due_date);
 }
 
 gboolean
@@ -278,7 +278,7 @@ gnc_dialog_dates_acct_question_parented (GtkWidget *parent, const char *message,
 
 
     /* Set the post date widget */
-    gnc_date_edit_set_time_ts (GNC_DATE_EDIT (ddc->post_date), *post);
+    gnc_date_edit_set_time (GNC_DATE_EDIT (ddc->post_date), post->tv_sec);
 
     /* Deal with the terms handling of the due date */
     if (terms)
@@ -289,7 +289,7 @@ gnc_dialog_dates_acct_question_parented (GtkWidget *parent, const char *message,
         post_date_changed_cb (GNC_DATE_EDIT (ddc->post_date), ddc);
     }
     else
-        gnc_date_edit_set_time_ts (GNC_DATE_EDIT (ddc->date), *ddue);
+        gnc_date_edit_set_time (GNC_DATE_EDIT (ddc->date), ddue->tv_sec);
 
     /* Setup the account widget */
     fill_in_acct_info (ddc, set_default_acct);
@@ -378,7 +378,7 @@ gnc_dialog_date_acct_parented (GtkWidget *parent, const char *message,
     gtk_label_set_text (label, acct_label_message);
 
     /* Set the date widget */
-    gnc_date_edit_set_time_ts (GNC_DATE_EDIT (ddc->date), *date);
+    gnc_date_edit_set_time (GNC_DATE_EDIT (ddc->date), date->tv_sec);
 
     /* Setup the account widget */
     fill_in_acct_info (ddc, FALSE);

commit dd8732402f6134ce4e89ab8085f4bff2a185d60f
Author: John Ralls <jralls at ceridwen.us>
Date:   Mon Jul 30 17:28:18 2018 -0700

    Remove all timespecs from the register.

diff --git a/gnucash/register/ledger-core/gncEntryLedger.c b/gnucash/register/ledger-core/gncEntryLedger.c
index a0d192c..e54c590 100644
--- a/gnucash/register/ledger-core/gncEntryLedger.c
+++ b/gnucash/register/ledger-core/gncEntryLedger.c
@@ -1036,15 +1036,15 @@ void gnc_entry_ledger_move_current_entry_updown (GncEntryLedger *ledger,
             return;
 
         /* Special treatment if the equality doesn't hold if we access the
-        dates as timespec. See the comment in gncEntrySetDateGDate() for the
-        reason: Some code used the timespec at noon for the EntryDate, other
-        code used the timespec at the start of day. */
+        dates as time64. See the comment in gncEntrySetDateGDate() for the
+        reason: Some code used the time64 at noon for the EntryDate, other
+        code used the time64 at the start of day. */
         t1 = gncEntryGetDate(current);
         t2 = gncEntryGetDate(target);
         if (t1 != t2)
         {
-            /* Timespecs are not equal, even though the GDates were equal? Then
-            we set the GDates again. This will force the timespecs to be equal
+            /* times are not equal, even though the GDates were equal? Then
+            we set the GDates again. This will force the times to be equal
             as well. */
             gncEntrySetDateGDate(current, &d1);
             gncEntrySetDateGDate(target, &d2);
diff --git a/gnucash/register/ledger-core/gncEntryLedgerModel.c b/gnucash/register/ledger-core/gncEntryLedgerModel.c
index ef47c13..a248fed 100644
--- a/gnucash/register/ledger-core/gncEntryLedgerModel.c
+++ b/gnucash/register/ledger-core/gncEntryLedgerModel.c
@@ -186,13 +186,9 @@ static const char * get_date_entry (VirtualLocation virt_loc,
                                     gpointer user_data)
 {
     GncEntryLedger *ledger = user_data;
-    GncEntry *entry;
-    Timespec ts = {0,0};
-
-    entry = gnc_entry_ledger_get_entry (ledger, virt_loc.vcell_loc);
-
-    ts.tv_sec = gncEntryGetDate (entry);
-    return gnc_print_date (ts);
+    GncEntry *entry = gnc_entry_ledger_get_entry (ledger, virt_loc.vcell_loc);
+    time64 time = gncEntryGetDate (entry);
+    return qof_print_date(time);
 }
 
 static const char * get_desc_entry (VirtualLocation virt_loc,
diff --git a/gnucash/register/ledger-core/split-register-load.c b/gnucash/register/ledger-core/split-register-load.c
index c1508f8..d5286ad 100644
--- a/gnucash/register/ledger-core/split-register-load.c
+++ b/gnucash/register/ledger-core/split-register-load.c
@@ -487,7 +487,7 @@ gnc_split_register_load (SplitRegister *reg, GList * slist,
     {
         GDate *d = qof_book_get_autoreadonly_gdate(gnc_get_current_book());
         // "d" is NULL if use_autoreadonly is FALSE
-        autoreadonly_time = d ? timespecToTime64(gdate_to_timespec(*d)) : 0;
+        autoreadonly_time = d ? gdate_to_time64 (*d) : 0;
         g_date_free(d);
     }
 
diff --git a/gnucash/register/ledger-core/split-register-model.c b/gnucash/register/ledger-core/split-register-model.c
index bc65d38..0ecf31f 100644
--- a/gnucash/register/ledger-core/split-register-model.c
+++ b/gnucash/register/ledger-core/split-register-model.c
@@ -521,11 +521,11 @@ gnc_split_register_get_recn_tooltip (VirtualLocation virt_loc,
 
     if (xaccSplitGetReconcile (split) == YREC)
     {
-        Timespec     ts = {0,0};
-        const char *str_rec_date;
-        xaccSplitGetDateReconciledTS (split, &ts);
-        str_rec_date = gnc_print_date (ts);
-        return g_strdup_printf (_("Reconciled on %s"), str_rec_date);
+        char datebuff[MAX_DATE_LENGTH + 1];
+        time64 time = xaccSplitGetDateReconciled (split);
+        memset (datebuff, 0, sizeof(datebuff));
+        qof_print_date_buff (datebuff, sizeof(datebuff), time);
+        return g_strdup_printf (_("Reconciled on %s"), datebuff);
     }
     else if (xaccSplitGetReconcile (split) == VREC)
     {
@@ -904,7 +904,6 @@ gnc_split_register_get_due_date_entry (VirtualLocation virt_loc,
     SplitRegister *reg = user_data;
     Transaction *trans;
     Split *split;
-    Timespec ts = {0, 0};
     gboolean is_current;
     char type;
 
@@ -941,10 +940,9 @@ gnc_split_register_get_due_date_entry (VirtualLocation virt_loc,
         return NULL;
     }
 
-    ts.tv_sec = xaccTransRetDateDue (trans);
     //PWARN ("returning valid due_date entry");
 
-    return gnc_print_date (ts);
+    return qof_print_date (xaccTransRetDateDue (trans));
 }
 
 static const char *
@@ -956,16 +954,12 @@ gnc_split_register_get_date_entry (VirtualLocation virt_loc,
     SplitRegister *reg = user_data;
     Transaction *trans;
     Split *split;
-    Timespec ts = {0, 0};
 
     split = gnc_split_register_get_split (reg, virt_loc.vcell_loc);
     trans = xaccSplitGetParent (split);
     if (!trans)
         return NULL;
-
-    ts.tv_sec = xaccTransRetDatePosted (trans);
-
-    return gnc_print_date (ts);
+    return qof_print_date (xaccTransRetDatePosted (trans));
 }
 
 static char *
diff --git a/gnucash/register/ledger-core/split-register.c b/gnucash/register/ledger-core/split-register.c
index 9e3beac..5d1eb78 100644
--- a/gnucash/register/ledger-core/split-register.c
+++ b/gnucash/register/ledger-core/split-register.c
@@ -2078,7 +2078,6 @@ record_price (SplitRegister *reg, Account *account, gnc_numeric value,
     time64 time;
     BasicCell *cell = gnc_table_layout_get_cell (reg->table->layout, DATE_CELL);
     gboolean swap = FALSE;
-    Timespec ts;
 
     /* Only record the price for account types that don't have a
      * "rate" cell. They'll get handled later by
@@ -2087,9 +2086,7 @@ record_price (SplitRegister *reg, Account *account, gnc_numeric value,
     if (gnc_split_reg_has_rate_cell (reg->type))
         return;
     gnc_date_cell_get_date ((DateCell*)cell, &time);
-    ts.tv_sec = time;
-    ts.tv_nsec = 0;
-    price = gnc_pricedb_lookup_day (pricedb, comm, curr, ts);
+    price = gnc_pricedb_lookup_day_t64 (pricedb, comm, curr, time);
     if (gnc_commodity_equiv (comm, gnc_price_get_currency (price)))
             swap = TRUE;
 
@@ -2116,7 +2113,7 @@ record_price (SplitRegister *reg, Account *account, gnc_numeric value,
         value = gnc_numeric_convert(value, scu * COMMODITY_DENOM_MULT,
                                     GNC_HOW_RND_ROUND_HALF_UP);
         gnc_price_begin_edit (price);
-        gnc_price_set_time (price, ts);
+        gnc_price_set_time64 (price, time);
         gnc_price_set_source (price, source);
         gnc_price_set_typestr (price, PRICE_TYPE_TRN);
         gnc_price_set_value (price, value);
@@ -2131,7 +2128,7 @@ record_price (SplitRegister *reg, Account *account, gnc_numeric value,
     gnc_price_begin_edit (price);
     gnc_price_set_commodity (price, comm);
     gnc_price_set_currency (price, curr);
-    gnc_price_set_time (price, ts);
+    gnc_price_set_time64 (price, time);
     gnc_price_set_source (price, source);
     gnc_price_set_typestr (price, PRICE_TYPE_TRN);
     gnc_price_set_value (price, value);
diff --git a/gnucash/register/register-core/datecell.h b/gnucash/register/register-core/datecell.h
index e49a72f..e3ce703 100644
--- a/gnucash/register/register-core/datecell.h
+++ b/gnucash/register/register-core/datecell.h
@@ -120,13 +120,13 @@ void        gnc_date_cell_set_value_secs (DateCell *cell, time64 secs);
 */
 void        gnc_date_cell_commit (DateCell *cell);
 
-/** Set a Timespec to the value in the DateCell.
+/** Set a time64 to the value in the DateCell.
  * @param cell The DateCell
  * @param time A time64* to which the function will write the time.
  */
 void        gnc_date_cell_get_date (DateCell *cell, time64 *time);
 
-/**  Timespec to the value in the DateCell.
+/**  Set a GDate to the value in the DateCell.
  * @param cell The DateCell
  * @param date A GDate* into which the functino will write the date.
  */

commit 6846a68691d6bf9b5873ed2dcc434e904d9bbd8c
Author: John Ralls <jralls at ceridwen.us>
Date:   Sun Jul 29 17:11:43 2018 -0700

    Remove two unused functions, one of which used Timespec.

diff --git a/gnucash/register/ledger-core/split-register-control.c b/gnucash/register/ledger-core/split-register-control.c
index de1bc8d..5effb4c 100644
--- a/gnucash/register/ledger-core/split-register-control.c
+++ b/gnucash/register/ledger-core/split-register-control.c
@@ -1204,36 +1204,6 @@ gnc_split_register_get_account_always (SplitRegister *reg,
     return gnc_split_register_get_account_by_name (reg, cell, name);
 }
 
-#if 0 /* Not Used */
-static const char *
-gnc_split_register_get_cell_string (SplitRegister *reg, const char *cell_name)
-{
-    BasicCell *cell;
-
-    cell = gnc_table_layout_get_cell (reg->table->layout, cell_name);
-    if (!cell)
-        return "";
-
-    return gnc_basic_cell_get_value (cell);
-}
-
-static Timespec
-gnc_split_register_get_cell_date (SplitRegister *reg, const char *cell_name)
-{
-    DateCell *cell;
-    Timespec ts;
-
-    cell = (DateCell*) gnc_table_layout_get_cell (reg->table->layout, cell_name);
-
-    if (cell)
-        gnc_date_cell_get_date (cell, &ts);
-    else
-        timespecFromTime64 (&ts, gnc_time (NULL));
-
-    return ts;
-}
-#endif /* Not Used */
-
 /* Creates a transfer dialog and fills its values from register cells (if
  * available) or from the provided transaction and split.
  */

commit e3dce951c714ac94a6e717406f470746fecdc29e
Author: John Ralls <jralls at ceridwen.us>
Date:   Sun Jul 29 16:45:39 2018 -0700

    Remove Timespec from qif importer.

diff --git a/gnucash/import-export/qif-imp/assistant-qif-import.c b/gnucash/import-export/qif-imp/assistant-qif-import.c
index 1d16f99..dcff2f6 100644
--- a/gnucash/import-export/qif-imp/assistant-qif-import.c
+++ b/gnucash/import-export/qif-imp/assistant-qif-import.c
@@ -1137,7 +1137,8 @@ refresh_old_transactions(QIFImportWindow * wind, int selection)
 
         while (!scm_is_null(possible_matches))
         {
-            Timespec ts_send = {0,0};
+            char datebuff[MAX_DATE_LENGTH + 1];
+            memset(datebuff, 0, sizeof(datebuff));
             current_xtn = SCM_CAR(possible_matches);
 #define FUNC_NAME "xaccTransCountSplits"
             gnc_xtn     = SWIG_MustGetPtr(SCM_CAR(current_xtn),
@@ -1159,11 +1160,12 @@ refresh_old_transactions(QIFImportWindow * wind, int selection)
             }
 
             gtk_list_store_append(store, &iter);
-            ts_send.tv_sec = xaccTransRetDatePosted(gnc_xtn);
+            qof_print_date_buff(datebuff, sizeof(datebuff),
+                               xaccTransRetDatePosted(gnc_xtn));
             gtk_list_store_set
             (store, &iter,
              QIF_TRANS_COL_INDEX, rownum++,
-             QIF_TRANS_COL_DATE, gnc_print_date(ts_send),
+             QIF_TRANS_COL_DATE, datebuff,
              QIF_TRANS_COL_DESCRIPTION, xaccTransGetDescription(gnc_xtn),
              QIF_TRANS_COL_AMOUNT, amount_str,
              QIF_TRANS_COL_CHECKED, selected != SCM_BOOL_F,
@@ -3138,8 +3140,8 @@ gnc_ui_qif_import_duplicates_match_prepare (GtkAssistant *assistant,
         while (!scm_is_null(duplicates))
         {
             time64 send_time = 0;
-            char date_buf[MAX_DATE_LENGTH + 1];
-            memset (date_buf, 0, sizeof(date_buf));
+            char datebuff[MAX_DATE_LENGTH + 1];
+            memset (datebuff, 0, sizeof(datebuff));
             current_xtn = SCM_CAAR(duplicates);
 #define FUNC_NAME "xaccTransCountSplits"
             gnc_xtn = SWIG_MustGetPtr(current_xtn,
@@ -3157,12 +3159,12 @@ gnc_ui_qif_import_duplicates_match_prepare (GtkAssistant *assistant,
             }
             gtk_list_store_append(store, &iter);
             send_time = xaccTransRetDatePosted(gnc_xtn);
-            qof_print_date_buff (date_buf, sizeof(date_buf), send_time);
+            qof_print_date_buff (datebuff, sizeof(datebuff), send_time);
             gtk_list_store_set
             (store, &iter,
              QIF_TRANS_COL_INDEX, rownum++,
              QIF_TRANS_COL_DATE,
-             date_buf,
+             datebuff,
              QIF_TRANS_COL_DESCRIPTION, xaccTransGetDescription(gnc_xtn),
              QIF_TRANS_COL_AMOUNT, amount_str,
              -1);



Summary of changes:
 bindings/python/gnucash_core.py                    |   6 +-
 gnucash/gnome-utils/dialog-dup-trans.c             |   4 +-
 gnucash/gnome-utils/dialog-transfer.c              |  34 +-
 gnucash/gnome-utils/gnc-date-edit.c                |  39 +-
 gnucash/gnome-utils/gnc-date-edit.h                |  11 +-
 gnucash/gnome-utils/gnc-tree-control-split-reg.c   |  10 +-
 gnucash/gnome-utils/gnc-tree-model-price.c         |   6 +-
 gnucash/gnome-utils/gnc-tree-model-split-reg.c     |   7 +-
 gnucash/gnome-utils/gnc-tree-view-price.c          |  16 +-
 gnucash/gnome-utils/gnc-tree-view-split-reg.c      |  45 +-
 gnucash/gnome-utils/window-main-summarybar.c       |  28 +-
 gnucash/gnome/assistant-acct-period.c              |   3 -
 gnucash/gnome/assistant-stock-split.c              |   7 +-
 gnucash/gnome/dialog-date-close.c                  |  42 +-
 gnucash/gnome/dialog-date-close.h                  |   6 +-
 gnucash/gnome/dialog-invoice.c                     |  22 +-
 gnucash/gnome/dialog-order.c                       |   6 +-
 gnucash/gnome/dialog-payment.c                     |  10 +-
 gnucash/gnome/dialog-price-edit-db.c               |  66 +-
 gnucash/gnome/dialog-price-editor.c                |  16 +-
 gnucash/gnome/dialog-trans-assoc.c                 |  13 +-
 gnucash/import-export/aqb/gnc-ab-kvp.c             |   8 +-
 .../import-export/qif-imp/assistant-qif-import.c   |  16 +-
 gnucash/register/ledger-core/gncEntryLedger.c      |  10 +-
 gnucash/register/ledger-core/gncEntryLedgerModel.c |  10 +-
 .../register/ledger-core/split-register-control.c  |  30 -
 gnucash/register/ledger-core/split-register-load.c |   2 +-
 .../register/ledger-core/split-register-model.c    |  20 +-
 gnucash/register/ledger-core/split-register.c      |   9 +-
 gnucash/register/register-core/datecell.h          |   4 +-
 gnucash/report/locale-specific/us/taxtxf.scm       |   7 +-
 .../report/report-system/commodity-utilities.scm   |   2 +-
 .../backend/dbi/test/test-backend-dbi-basic.cpp    |   2 +-
 libgnucash/backend/sql/gnc-entry-sql.cpp           |   4 +-
 libgnucash/backend/sql/gnc-invoice-sql.cpp         |   4 +-
 libgnucash/backend/sql/gnc-order-sql.cpp           |   4 +-
 libgnucash/backend/sql/gnc-price-sql.cpp           |   2 +-
 libgnucash/backend/sql/gnc-slots-sql.cpp           |  31 +-
 libgnucash/backend/sql/gnc-sql-backend.hpp         |   2 +-
 .../backend/sql/gnc-sql-column-table-entry.cpp     | 148 ++---
 .../backend/sql/gnc-sql-column-table-entry.hpp     |   3 +-
 libgnucash/backend/sql/gnc-transaction-sql.cpp     |   8 +-
 .../backend/sql/test/utest-gnc-backend-sql.cpp     |  27 -
 libgnucash/backend/xml/gnc-pricedb-xml-v2.cpp      |   9 +-
 libgnucash/backend/xml/gnc-transaction-xml-v2.cpp  |  18 +-
 libgnucash/backend/xml/io-gncxml-v1.cpp            |   3 +-
 libgnucash/backend/xml/sixtp-dom-generators.cpp    |  19 +-
 libgnucash/backend/xml/sixtp-dom-generators.h      |   1 -
 libgnucash/backend/xml/sixtp-dom-parsers.cpp       |  44 +-
 libgnucash/backend/xml/sixtp-utils.cpp             |  15 +-
 libgnucash/backend/xml/sixtp-utils.h               |   6 -
 libgnucash/backend/xml/test/CMakeLists.txt         |   3 +-
 .../backend/xml/test/test-date-converting.cpp      |  67 --
 .../backend/xml/test/test-dom-converters1.cpp      |   2 +-
 libgnucash/doc/design/engine.texi                  |   4 +-
 libgnucash/engine/Account.cpp                      |  18 +-
 libgnucash/engine/CMakeLists.txt                   |   3 +
 libgnucash/engine/Recurrence.c                     |   8 +-
 libgnucash/engine/Split.c                          |  66 +-
 libgnucash/engine/Split.h                          |   9 -
 libgnucash/engine/SplitP.h                         |  26 +-
 libgnucash/engine/TransLog.c                       |   5 +-
 libgnucash/engine/Transaction.c                    |  89 +--
 libgnucash/engine/cap-gains.c                      |  34 +-
 libgnucash/engine/engine-deprecated.c              | 208 +++++++
 libgnucash/engine/engine-deprecated.h              |  90 +++
 libgnucash/engine/engine-helpers.c                 |  28 -
 libgnucash/engine/engine-helpers.h                 |   7 -
 libgnucash/engine/engine.i                         |   7 +-
 libgnucash/engine/gnc-date-p.h                     |   1 -
 libgnucash/engine/gnc-date.cpp                     | 256 +-------
 libgnucash/engine/gnc-date.h                       | 130 +---
 libgnucash/engine/gnc-pricedb-p.h                  |   4 +-
 libgnucash/engine/gnc-pricedb.c                    | 323 ++++------
 libgnucash/engine/gnc-pricedb.h                    |  67 +-
 libgnucash/engine/gncBillTerm.c                    |  22 +-
 libgnucash/engine/gncEntry.c                       |  12 +-
 libgnucash/engine/gncInvoice.c                     |   7 +-
 libgnucash/engine/gncInvoice.h                     |   4 +-
 libgnucash/engine/gncOrder.c                       |   4 +-
 libgnucash/engine/gncOwner.c                       |  24 +-
 libgnucash/engine/gncOwner.h                       |  16 +-
 libgnucash/engine/gncTaxTable.c                    |   9 +-
 libgnucash/engine/gncTaxTable.h                    |   4 +-
 libgnucash/engine/kvp-frame.cpp                    |  12 +-
 libgnucash/engine/kvp-value.cpp                    |  16 +-
 libgnucash/engine/kvp-value.hpp                    |   4 +-
 libgnucash/engine/kvp_doc.txt                      |  12 +-
 libgnucash/engine/qofinstance-p.h                  |   4 +-
 libgnucash/engine/qofinstance.cpp                  |  27 +-
 libgnucash/engine/qofquery.cpp                     |   5 +-
 libgnucash/engine/qofquerycore.cpp                 |   2 +-
 libgnucash/engine/test-core/test-engine-stuff.cpp  |  56 +-
 libgnucash/engine/test-core/test-engine-stuff.h    |   4 +-
 libgnucash/engine/test/CMakeLists.txt              |   2 -
 libgnucash/engine/test/test-date.cpp               | 417 -------------
 .../engine/test/test-engine-kvp-properties.c       |   6 +-
 libgnucash/engine/test/test-gnc-date.c             | 671 +++++----------------
 libgnucash/engine/test/test-kvp-value.cpp          |   4 +-
 libgnucash/engine/test/test-qofinstance.cpp        |  53 +-
 libgnucash/engine/test/utest-Account.cpp           |   2 +-
 libgnucash/engine/test/utest-Budget.c              |   2 +-
 libgnucash/engine/test/utest-Split.cpp             |  23 +-
 libgnucash/engine/test/utest-Transaction.cpp       |  18 +-
 libgnucash/engine/test/utest-gnc-pricedb.c         | 256 ++++----
 po/POTFILES.in                                     |   1 +
 106 files changed, 1375 insertions(+), 2644 deletions(-)
 delete mode 100644 libgnucash/backend/xml/test/test-date-converting.cpp
 create mode 100644 libgnucash/engine/engine-deprecated.c
 create mode 100644 libgnucash/engine/engine-deprecated.h
 delete mode 100644 libgnucash/engine/test/test-date.cpp



More information about the gnucash-changes mailing list