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, &gtm);
+	qd = qof_date_from_struct_tm (&gtm);
+	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;
 }
 

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to