[goffice] datetime: fix problems with week number calculations.
- From: Morten Welinder <mortenw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [goffice] datetime: fix problems with week number calculations.
- Date: Thu, 22 Apr 2010 18:22:42 +0000 (UTC)
commit 03bbb6d7c63131ac21fc6efe2999a54185878084
Author: Morten Welinder <terra gnome org>
Date: Thu Apr 22 14:22:19 2010 -0400
datetime: fix problems with week number calculations.
ChangeLog | 5 +++++
goffice/utils/datetime.c | 42 ++++++++++++++++++++++++++++++------------
2 files changed, 35 insertions(+), 12 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 4fdbf24..beeb5c6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2010-04-21 Morten Welinder <terra gnome org>
+
+ * goffice/utils/datetime.c (go_date_weeknum): Return the Excel
+ compatible week numbers as intended, not the glib ones.
+
2010-04-16 Valek Filippov <frob gnome org>
* tests/shapes-demo.c: fix warnings.
diff --git a/goffice/utils/datetime.c b/goffice/utils/datetime.c
index 0580cb2..28941c7 100644
--- a/goffice/utils/datetime.c
+++ b/goffice/utils/datetime.c
@@ -202,15 +202,13 @@ go_date_g_years_between (GDate const *date1, GDate const *date2)
* @method: week numbering method
*
* Returns: week number according to the given method.
- * 1: Week starts on Sunday. Days before first Sunday are in week 0.
- * 2: Week starts on Monday. Days before first Monday are in week 0.
- * 150: ISO 8601 week number. See datetime_isoweeknum.
+ * 1: Week starts on Sunday. January 1 is in week 1.
+ * 2: Week starts on Monday. January 1 is in week 1.
+ * 150: ISO 8601 week number.
*/
int
go_date_weeknum (GDate const *date, int method)
{
- int res = -1;
-
g_return_val_if_fail (g_date_valid (date), -1);
g_return_val_if_fail (method == GO_WEEKNUM_METHOD_SUNDAY ||
method == GO_WEEKNUM_METHOD_MONDAY ||
@@ -218,15 +216,35 @@ go_date_weeknum (GDate const *date, int method)
-1);
switch (method) {
- case GO_WEEKNUM_METHOD_SUNDAY:
- res = g_date_get_sunday_week_of_year (date); break;
- case GO_WEEKNUM_METHOD_MONDAY:
- res = g_date_get_monday_week_of_year (date); break;
- case GO_WEEKNUM_METHOD_ISO:
- res = g_date_get_iso8601_week_of_year (date); break;
+ case GO_WEEKNUM_METHOD_SUNDAY: {
+ GDate jan1;
+ GDateWeekday wd;
+ int doy;
+
+ g_date_clear (&jan1, 1);
+ g_date_set_dmy (&jan1, 1, 1, g_date_get_year (date));
+ wd = g_date_get_weekday (&jan1);
+ doy = g_date_get_day_of_year (date);
+
+ return (doy + (int)wd + 6 - (wd == G_DATE_SUNDAY ? 7 : 0)) / 7;
}
+ case GO_WEEKNUM_METHOD_MONDAY: {
+ GDate jan1;
+ GDateWeekday wd;
+ int doy;
+
+ g_date_clear (&jan1, 1);
+ g_date_set_dmy (&jan1, 1, 1, g_date_get_year (date));
+ wd = g_date_get_weekday (&jan1);
+ doy = g_date_get_day_of_year (date);
- return res;
+ return (doy + (int)wd + 5) / 7;
+ }
+ case GO_WEEKNUM_METHOD_ISO:
+ return g_date_get_iso8601_week_of_year (date);
+ default:
+ return -1;
+ }
}
/* ------------------------------------------------------------------------- */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]