This patch tests OK using all the timezone specifiers that I can find (80).
http://www.timeanddate.com/library/abbreviations/timezones/ I'll prepare 0.7.0-2 and hopefully my sponsor can arrange an upload to close this bug. -- Neil Williams ============= http://www.data-freedom.org/ http://www.nosoftwarepatents.com/ http://www.linux.codehelp.co.uk/
Index: qof/qofdate.c =================================================================== RCS file: /cvsroot/qof/qof/qof/qofdate.c,v retrieving revision 1.19 diff -p -u -b -B -r1.19 qofdate.c --- qof/qofdate.c 13 Aug 2006 23:07:20 -0000 1.19 +++ qof/qofdate.c 21 Aug 2006 19:03:54 -0000 @@ -26,6 +26,7 @@ #include "config.h" #include <glib.h> #include <glib/gprintf.h> +#include <stdlib.h> #include <time.h> #include "qof.h" #include "qofdate-p.h" @@ -857,6 +858,7 @@ qof_date_from_qtime (const QofTime *qt) g_return_val_if_fail (qof_time_is_valid (qt), NULL); qd = qof_date_new (); leap_extra_secs = 0; + setenv ("TZ", "GMT", 1); tzset(); leap_extra_secs = extract_interval (qt); qof_date_offset (qt, leap_extra_secs, qd); Index: qof/qofstrftime.c =================================================================== RCS file: /cvsroot/qof/qof/qof/qofstrftime.c,v retrieving revision 1.2 diff -p -u -b -B -r1.2 qofstrftime.c --- qof/qofstrftime.c 12 Jul 2006 21:24:21 -0000 1.2 +++ qof/qofstrftime.c 21 Aug 2006 19:03:54 -0000 @@ -176,12 +176,15 @@ strftime_case (gboolean upcase, gchar * if (ut) { if (!(zone && *zone)) + { + setenv ("TZ", "GMT", 1); zone = "GMT"; } + } else { - /* POSIX.1 requires that local time zone information be used as - though strftime called tzset. */ + /* POSIX.1 requires that local time zone information be + used as though strftime called tzset. */ tzset (); } Index: qof/qoftime.c =================================================================== RCS file: /cvsroot/qof/qof/qof/qoftime.c,v retrieving revision 1.7 diff -p -u -b -B -r1.7 qoftime.c --- qof/qoftime.c 23 Jul 2006 22:10:52 -0000 1.7 +++ qof/qoftime.c 21 Aug 2006 19:03:54 -0000 @@ -31,6 +31,7 @@ #include <stdlib.h> #include <string.h> #include "qof.h" +#include "qofdate-p.h" static QofLogModule log_module = QOF_MOD_TIME; @@ -297,27 +298,11 @@ qof_time_from_gtimeval (QofTime * qt, GT GDate * qof_time_to_gdate (QofTime * qt) { + QofDate *qd; GDate *d; - time_t t; - glong nsecs; - gboolean success; - struct tm utc; - - /** \todo replace with qofstrftime ( [qof]strptime actually) - %Y for 2006 == (tm_year) - %m for 05 == (tm_mon + 1) - %d for 22 - to avoid range problems with time_t - then g_date_set_parse (GDate, gchar*) - gchar* str = "%d/%m/%Y"; - - */ - success = qof_time_to_time_t (qt, &t, &nsecs); - if (!success) - return NULL; - utc = *gmtime_r (&t, &utc); - d = g_date_new_dmy (utc.tm_mday, utc.tm_mon + 1, - utc.tm_year + 1900); + + qd = qof_date_from_qtime (qt); + d = g_date_new_dmy (qd->qd_mday, qd->qd_mon, qd->qd_year); if (g_date_valid (d)) return d; return NULL; @@ -326,23 +311,15 @@ qof_time_to_gdate (QofTime * qt) QofTime * qof_time_from_gdate (GDate * date) { - GTimeVal *current, from_date; - GDate *now; - gint days_between; - gint64 secs_between; + struct tm gtm; QofTime *qt; + QofDate *qd; g_return_val_if_fail (date, NULL); - current = qof_time_get_current_start (); - now = g_date_new (); - g_date_set_time_val (now, current); - /* if date is in the future, days_between is negative */ - days_between = g_date_days_between (date, now); - qt = qof_time_new (); - qof_time_from_gtimeval (qt, &from_date); - secs_between = days_between * SECS_PER_DAY; - qof_time_set_secs (qt, current->tv_sec - secs_between); - qof_time_set_nanosecs (qt, 0); + g_date_to_struct_tm (date, >m); + qd = qof_date_from_struct_tm (>m); + qt = qof_date_to_qtime (qd); + qof_date_free (qd); return qt; } @@ -396,25 +373,28 @@ qof_time_get_current (void) gboolean qof_time_set_day_start (QofTime * qt) { - GDate *d, *now; - GTimeVal *current, from_date; - gint days_between; + QofDate *qd; + QofTimeSecs c; - /** \todo convert to QofDate */ g_return_val_if_fail (qt, FALSE); - d = qof_time_to_gdate (qt); - if (!d) - return FALSE; - now = g_date_new (); - current = qof_time_get_current_start (); - g_date_set_time_val (now, current); - /* if date is in the future, days_between is negative */ - days_between = g_date_days_between (d, now); - from_date.tv_sec = current->tv_sec - (days_between * SECS_PER_DAY); - from_date.tv_usec = 0; - qof_time_from_gtimeval (qt, &from_date); - g_date_free (d); - g_free (current); + qd = qof_date_from_qtime (qt); + if (qd->qd_year < 1970) + { + c = QOF_DAYS_TO_SEC(qd->qd_yday); + c -= QOF_DAYS_TO_SEC(days_between (1970, qd->qd_year)); + c -= qd->qd_gmt_off; + qt->qt_sec = c; + qt->qt_nsec = 0; + } + if (qd->qd_year >= 1970) + { + c = QOF_DAYS_TO_SEC(qd->qd_yday); + c += QOF_DAYS_TO_SEC(days_between (1970, qd->qd_year)); + c -= qd->qd_gmt_off; + qt->qt_sec = c; + qt->qt_nsec = 0; + } + qof_date_free (qd); return TRUE; }
signature.asc
Description: OpenPGP digital signature