QOF: Date: 64bit UTC date handling.

QOF 0.7.5

- Main Page
- Related Pages
- Modules
- Data Structures
- Files

Files | Data Structures | Macros | Typedefs | Functions
Date: 64bit UTC date handling.
Query Object Framework » Time: 64bit UTC Time handling.

## Files
file | qofdate.h
| 64bit Date handling routines

## Data Structures
struct | QofDate_s
| Full range replacement for struct tm. More...

## Macros
#define | MAX_DATE_LENGTH 41
| The maximum length of a string used for or created by dates. More...
#define | MAX_DATE_BUFFER 256
| The maximum length of a QofDate buffer. More...
#define | SECS_PER_DAY 86400
#define | SECS_PER_HOUR 3600
#define | QOF_MOD_DATE "qof-dates"
#define | qof_date_isleap(year) ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0))
#define | QOF_UTC_DATE_FORMAT "%Y-%m-%dT%H:%M:%SZ"
| UTC date format string. More...
#define | QOF_HOUR_TO_SEC(x) (x * SECS_PER_HOUR)
#define | QOF_MIN_TO_SEC(x) (x * 60)
#define | QOF_DAYS_TO_SEC(x) (x * SECS_PER_DAY)

## Typedefs
typedef struct QofDate_s | QofDate
| Full range replacement for struct tm. More...
typedef gint | QofDateFormat

## Functions
void | qof_date_init (void)
| initialise the QofDate tables
void | qof_date_close (void)
| close down the QofDate tables

## Default QofDate formats
#define | QOF_DATE_FORMAT_US 1
| Continental US default. "%m/%d/%Y". More...
#define | QOF_DATE_FORMAT_UK 2
| United Kingdom default. "%d/%m/%Y". More...
#define | QOF_DATE_FORMAT_CE 3
| Contintental European default. "%d.%m.%Y". More...
#define | QOF_DATE_FORMAT_ISO 4
| Short ISO form. "%F". More...
#define | QOF_DATE_FORMAT_UTC 5
| QOF UTC format, xsd:date compatible. QOF_UTC_DATE_FORMAT "%Y-%m-%dT%H:%M:%SZ". More...
#define | QOF_DATE_FORMAT_ISO8601 6
#define | QOF_DATE_FORMAT_LOCALE 7
| GNU locale default. "%x". More...
#define | QOF_DATE_FORMAT_CUSTOM 8
| Date and time for the current locale "%c". More...
#define | DATE_FORMAT_LAST QOF_DATE_FORMAT_CUSTOM

## QofDateFormat - standardised date formats
To simplify usage of strftime and strptime (especially checking error states), QofDate uses a set of standard date formats. You can also register your own format strings as long as they are strftime compatible. see also QofDate and locales.
gboolean | qof_date_format_add (const gchar *str, QofDateFormat *identifier)
| Add a specific strftime compatible string as a new QofDateFormat. More...
const gchar * | qof_date_format_to_name (QofDateFormat format)
| Retrieve the shorthand name for the selected date format. More...
QofDateFormat | qof_date_format_from_name (const gchar *name)
| Returns the default date format for a known shorthand name. More...
gboolean | qof_date_format_set_name (const gchar *name, QofDateFormat format)
| Set a shorthand name for a custom date format. More...
QofDateFormat | qof_date_format_get_current (void)
| returns the current date format.
gboolean | qof_date_format_set_current (QofDateFormat df)
| Selects one registered date format as the current default. More...
const gchar * | qof_date_format_get_format (QofDateFormat df)
| Retrieve the strftime format string for a registered date format. More...
gchar | qof_date_format_get_date_separator (QofDateFormat df)
| Return the field separator for the current date format. More...
gboolean | qof_date_format_set_date_separator (const gchar sep, QofDateFormat df)
| Set a locale-specific separator. More...

## QofDate handlers
QofDate * | qof_date_new (void)
QofDate * | qof_date_get_current (void)
QofDate * | qof_date_new_dmy (gint day, gint month, gint64 year)
void | qof_date_free (QofDate *date)
QofTime * | qof_date_time_difference (const QofDate *date1, const QofDate *date2)
gboolean | qof_date_is_last_mday (const QofDate *qd)
gboolean | qof_date_addmonths (QofDate *qd, gint months, gboolean track_last_day)
gboolean | qof_date_equal (const QofDate *d1, const QofDate *d2)
gint | qof_date_compare (const QofDate *d1, const QofDate *d2)
gboolean | qof_date_valid (QofDate *date)
| Validate a QofDate. More...
guint16 | qof_date_get_yday (gint mday, gint month, gint64 year)
guint8 | qof_date_get_mday (gint month, gint64 year)

## Conversion handlers for QofDate
QofDate * | qof_date_from_qtime (const QofTime *qt)
QofTime * | qof_date_to_qtime (const QofDate *qd)
QofDate * | qof_date_from_struct_tm (const struct tm *stm)
| Convert a struct tm to a QofDate. More...
gboolean | qof_date_to_struct_tm (const QofDate *qt, struct tm *stm, glong *nanosecs)
| Convert a QofDate to a struct tm. More...
gboolean | qof_date_to_gdate (const QofDate *qd, GDate *gd)
| Convert a QofDate to a GDate. More...
QofDate * | qof_date_from_gdate (const GDate *gd)
| Create a QofDate from a GDate. More...

## Manipulate QofTime as a date
Shorthand routines to modify a QofTime using date-type values, instead of having to always use seconds.
gboolean | qof_date_adddays (QofDate *qd, gint days)
| Add a number of days to a QofDate and normalise. More...
gboolean | qof_date_set_day_end (QofDate *qd)
gboolean | qof_date_set_day_start (QofDate *qd)
gboolean | qof_date_set_day_middle (QofDate *qd)

## Date Printing/Scanning functions
QofDate supports a wider range of dates than either strftime or GDate and supports all non-locale-specific strftime format specifiers over the full range of QofDate. Note Locale-specific formats cannot be extended to the full range of QofDate dates because the locale data for these formats is only available to the underlying strftime implementation. The formats affected are those involving the E and O modifiers and other format specifiers that use the current locale. e.g. Japanese Emperor reigns, local numeric specifiers, translated days of the week / month etc. If these are used, only dates within the range of the locale-sensitive strftime on that platform can be supported (either inside or outside QofDate). The full list of affected format specifiers is:
    'a', 'A', 'b', 'h', 'B', 'c', 'C', 'x', 'p', 'P', 'r', 'X', 'E', 'O'.
QofDate will attempt to fallback to a usable format if the date is out of range of the underlying strftime. e.g. QOF_DATE_FORMAT_UTC, QOF_DATE_FORMAT_UK, QOF_DATE_FORMAT_US, QOF_DATE_FORMAT_CE or QOF_DATE_FORMAT_ISO. Note It is not particularly sensible to write locale-sensitive date strings to any kind of permanent storage. Locale-specific format specifiers should only be used for displaying dates to the user. For more information, see QofDate and locales. Printing: Convert a QofTime* into a timestamp. To print a string yourself, use qof_date_format_get_format to get the format to pass to strftime or g_date_strftime. To use a registered date format, use qof_date_format_set_current and qof_date_print. Scanning: Convert a timestamp into a QofTime* To scan a string yourself, use qof_date_format_get_format to get the format to pass to strptime or use g_date_set_parse To scan a stamp created with a registered date format, use qof_date_parse
gchar * | qof_date_print (const QofDate *date, QofDateFormat df)
| Convert a QofDate to a timestamp according to the specified date format. More...
QofDate * | qof_date_parse (const gchar *str, QofDateFormat df)
| Convert a timestamp to a QofTime. More...

## Detailed Description

All dates in QOF use Universal Coordinated Time, (UTC), wrapped to allow representation of dates before the epoch.

localtime is available via GDate but there are limitations.

1. The GDate data structure represents a day between January 1, Year 1, and sometime a few thousand years in the future, not the full range of QofTime.
2. Right now GDate will go to the year 65535 or so, but g_date_set_parse() only parses up to the year 8000 or so - just count on "a few thousand".

3. g_date_strftime only deals with date related formats, results of using time formats is undefined.

   A QofDateEntry is one a collection of formats for handling dates, including common defaults. New entries need to be registered using qof_date_add_format before being used to print or scan strings containing dates.

Todo:
  Add support for customised handlers for added formats.

A QofDate is theoretically able to go forward to the year 292,471,206,707 AD and back to the year 292,471,206,708 BC. Whether such dates actually exist is outside the scope of this documentation.

Note
  Time moves at a constant rate, dates do not. Dates are inherently tied to the rotation of the Earth and that rotation is slowing down, causing the need for leapseconds. The incidence of leapseconds cannot be accurately predicted and dates far into the future may be out by a number of seconds. This is important if future dates are based around the start (or end) of a particular day - when those dates come to be viewed as the past, the actual day calculated from the number of seconds may differ to the day originally calculated. When using future dates, avoid using dates at the start or end of a particular day.

Since
  v0.7.0

## Macro Definition Documentation

#define DATE_FORMAT_LAST QOF_DATE_FORMAT_CUSTOM

New identifiers must be larger than this.

Definition at line 322 of file qofdate.h.

#define MAX_DATE_BUFFER 256

The maximum length of a QofDate buffer.

Todo:
  rationalise with MAX_DATE_LENGTH

Definition at line 92 of file qofdate.h.

#define MAX_DATE_LENGTH 41

The maximum length of a string used for or created by dates.

When setting a custom QofDateFormat, neither the format string itself nor any date string created from that format is allowed to exceed this length.

Definition at line 87 of file qofdate.h.

#define QOF_DATE_FORMAT_CE 3

Contintental European default. "%d.%m.%Y".

9th May 2006 == 09.05.2006

Definition at line 263 of file qofdate.h.

#define QOF_DATE_FORMAT_CUSTOM 8

Date and time for the current locale "%c".

QOF_DATE_FORMAT_LOCALE and QOF_DATE_FORMAT_CUSTOM are only suitable for date / time display - storing these values in any kind of file is a recipe for disaster as the exact format can be affected by environment variables and other imponderables.

One example: 9th May 2006 gives Tue 09 May 2006 14:50:10 UTC

Note
  QOF_DATE_FORMAT_CUSTOM includes locale-specific format specifiers and therefore cannot support the full range of QofDate. see QofDate and locales.

Definition at line 319 of file qofdate.h.

#define QOF_DATE_FORMAT_ISO 4

Short ISO form. "%F".

9th May 2006 == 2006-05-09

Definition at line 268 of file qofdate.h.

#define QOF_DATE_FORMAT_ISO8601 6

Date and time with nanoseconds and timezone.

"%Y-%m-%d %H:%M:%S.%N %z"

12th July 2006 gives 2006-07-12 17:08:16.329768000 +0000 in UTC. Timezones can be specified and will then be converted into UTC at validation.

Definition at line 287 of file qofdate.h.

#define QOF_DATE_FORMAT_LOCALE 7

GNU locale default. "%x".

QOF_DATE_FORMAT_LOCALE and QOF_DATE_FORMAT_CUSTOM are only suitable for date / time display - storing these values in any kind of file is a recipe for disaster as the exact format can be affected by environment variables and other imponderables.

One example: 9th May 2006 gives 09/05/06

Note
  QOF_DATE_FORMAT_LOCALE includes locale-specific format specifiers and therefore cannot support the full range of QofDate. see QofDate and locales.

Definition at line 303 of file qofdate.h.

#define QOF_DATE_FORMAT_UK 2

United Kingdom default. "%d/%m/%Y".

9th May 2006 == 09/05/2006

Definition at line 258 of file qofdate.h.

#define QOF_DATE_FORMAT_US 1

Continental US default. "%m/%d/%Y".

9th May 2006 == 05/09/2006

Definition at line 253 of file qofdate.h.

#define QOF_DATE_FORMAT_UTC 5

QOF UTC format, xsd:date compatible. QOF_UTC_DATE_FORMAT "%Y-%m-%dT%H:%M:%SZ".

xsd:date is recommended for any XML data storage of dates and times.

9th May 2006 == 2006-05-09T14:49:04Z

Definition at line 277 of file qofdate.h.

#define qof_date_isleap | ( |  | year | ) | ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0))

Nonzero if YEAR is a leap year (every 4 years, except every 100th isn't, and every 400th is).

Definition at line 222 of file qofdate.h.

#define QOF_DAYS_TO_SEC | ( |  | x | ) | (x * SECS_PER_DAY)

convenience macro to turn days into seconds.

Definition at line 331 of file qofdate.h.

#define QOF_HOUR_TO_SEC | ( |  | x | ) | (x * SECS_PER_HOUR)

convenience macro to turn hours into seconds.

Definition at line 327 of file qofdate.h.

#define QOF_MIN_TO_SEC | ( |  | x | ) | (x * 60)

convenience macro to turn minutes into seconds.

Definition at line 329 of file qofdate.h.

#define QOF_MOD_DATE "qof-dates"

QofLogModule name for QofDate

Definition at line 98 of file qofdate.h.

#define QOF_UTC_DATE_FORMAT "%Y-%m-%dT%H:%M:%SZ"

UTC date format string.

Timezone independent, date and time inclusive, as used in the QSF backend. The T and Z characters are from xsd:dateTime format in coordinated universal time, UTC. You can reproduce the string from the GNU/Linux command line using the date utility:

    $ date -u +%Y-%m-%dT%H:M:SZ
    2004-12-12T23:39:11Z

The datestring must be timezone independent and include all specified fields. Remember to use gmtime() NOT localtime()!

Definition at line 244 of file qofdate.h.

#define SECS_PER_DAY 86400

number of seconds in one whole day.

Definition at line 94 of file qofdate.h.

#define SECS_PER_HOUR 3600

number of seconds in one whole hour.

Definition at line 96 of file qofdate.h.

## Typedef Documentation

typedef struct QofDate_s QofDate

Full range replacement for struct tm.

Based on struct tm but using signed integers. The year value uses a signed 64bit value to prevent overflows. (A glong is insufficient by two orders of magnitude.) To retain precision, a QofDate includes a nanoseconds value that can be used with a QofTime and a 64bit value for seconds.

Note
  All QofDate values can be negative. The normalising cascade handles rollovers. e.g. If a QofDate qd_min value is 5 initially, setting qd_sec to 68 causes qd_sec to actually hold the value 8 and qd_min to hold the value 6. Alternatively, setting qd_sec to -64 with qd_min set to 5 causes qd_sec to hold the value 56 and qd_min to hold the value 3.

Todo:
  check - years work like this, days don't!! Only qd_year retains a negative value once set. Adding one year to a negative QofDate causes the QofDate to be set to one year further into the past. This follows the same pattern as typical BC dates: the 1st of May 501BC is further into the past than the 5th of May 500BC.

Why is this a date? Because it represents a date, broken down into the component variables. A QofTime always (and only) relates to seconds, a QofDate always relates to how that number of seconds can be represented as a sequence of days, months, years etc.

Note
  Although values can be set directly, qof_date_valid should be called before attempting to manipulate a QofDate.

Todo:
  Reorganise the qof_time_* functions to reflect this statement. qof_time_set_day_end should be qof_date_set_day_end and the various qof_date_time functions need to be reviewed.

typedef gint QofDateFormat

Index value of the selected QofDateFormat in the DateFormatTable

Definition at line 335 of file qofdate.h.

## Function Documentation

gboolean qof_date_adddays | ( | QofDate * | qd,
|  | gint | days
| ) |  |

Add a number of days to a QofDate and normalise.

Parameters

  qd | A valid QofDate.
  days | Number of days to add - use negative value to subtract.

Returns
  FALSE on error, otherwise TRUE.

Definition at line 966 of file qofdate.c.

967 {
968 g_return_val_if_fail (qd, FALSE);
969 g_return_val_if_fail (qof_date_valid (qd), FALSE);
970 qd->qd_mday += days;
971 return qof_date_valid (qd);
972 }
QofDate_s::qd_mday
glong qd_mday
Signed replacement of struct tm.tm_mday.
Definition: qofdate.h:164
qof_date_valid
gboolean qof_date_valid(QofDate *date)
Validate a QofDate.
Definition: qofdate.c:616

gboolean qof_date_addmonths | ( | QofDate * | qd,
|  | gint | months,
|  | gboolean | track_last_day
| ) |  |

Add (or subtract) months from a QofDate

Optionally tracks the last day of the month so that if the original QofDate is the last day of the month in the specified year, the updated QofDate will also be the last day of the updated month in the updated year.

Parameters

  qd | A QofDate which will be normalised before calculations begin.
  months | Number of months to add (or subtract if months is negative).
  track_last_day | Whether to track the last day.

Returns
  FALSE on error, otherwise TRUE.

Definition at line 975 of file qofdate.c.

977 {
978 g_return_val_if_fail (qd, FALSE);
979 g_return_val_if_fail (qof_date_valid (qd), FALSE);
980 qd->qd_mon += months % 12;
981 qd->qd_year += months / 12;
982 g_return_val_if_fail (qof_date_valid (qd), FALSE);
983 if (track_last_day && qof_date_is_last_mday (qd))
984 {
985 qd->qd_mday = qof_date_get_mday (qd->qd_mon,
986 qd->qd_year);
987 }
988 return TRUE;
989 }
QofDate_s::qd_year
gint64 qd_year
Extended version to cope with full range of dates.
Definition: qofdate.h:181
qof_date_get_mday
guint8 qof_date_get_mday(gint month, gint64 year)
Definition: qofdate.c:183
QofDate_s::qd_mon
glong qd_mon
Signed replacement of struct tm.tm_mon.
Definition: qofdate.h:171
qof_date_is_last_mday
gboolean qof_date_is_last_mday(const QofDate *qd)
Definition: qofdate.c:193
QofDate_s::qd_mday
glong qd_mday
Signed replacement of struct tm.tm_mday.
Definition: qofdate.h:164
qof_date_valid
gboolean qof_date_valid(QofDate *date)
Validate a QofDate.
Definition: qofdate.c:616

gint qof_date_compare | ( | const QofDate * | d1,
|  | const QofDate * | d2
| ) |  |

Compare two QofDates

Definition at line 637 of file qofdate.c.

638 {
639 if ((!d1) && (!d2))
640 return 0;
641 if (d1 == d2)
642 return 0;
643 if (!d1)
644 return -1;
645 if (!d2)
646 return 1;
647 if (d1->qd_year < d2->qd_year)
648 return -1;
649 if (d1->qd_year > d2->qd_year)
650 return 1;
651 if (d1->qd_mon < d2->qd_mon)
652 return -1;
653 if (d1->qd_mon > d2->qd_mon)
654 return 1;
655 if (d1->qd_mday < d2->qd_mday)
656 return -1;
657 if (d1->qd_mday > d2->qd_mday)
658 return 1;
659 if (d1->qd_hour < d2->qd_hour)
660 return -1;
661 if (d1->qd_hour > d2->qd_hour)
662 return 1;
663 if (d1->qd_min < d2->qd_min)
664 return -1;
665 if (d1->qd_min > d2->qd_min)
666 return 1;
667 if (d1->qd_sec < d2->qd_sec)
668 return -1;
669 if (d1->qd_sec > d2->qd_sec)
670 return 1;
671 if (d1->qd_nanosecs < d2->qd_nanosecs)
672 return -1;
673 if (d1->qd_nanosecs > d2->qd_nanosecs)
674 return 1;
675 return 0;
676 }
QofDate_s::qd_year
gint64 qd_year
Extended version to cope with full range of dates.
Definition: qofdate.h:181
QofDate_s::qd_hour
glong qd_hour
Signed replacement of struct tm.tm_hour.
Definition: qofdate.h:157
QofDate_s::qd_min
glong qd_min
Signed replacement of struct tm.tm_min.
Definition: qofdate.h:150
QofDate_s::qd_mon
glong qd_mon
Signed replacement of struct tm.tm_mon.
Definition: qofdate.h:171
QofDate_s::qd_sec
gint64 qd_sec
Definition: qofdate.h:143
QofDate_s::qd_nanosecs
glong qd_nanosecs
Definition: qofdate.h:141
QofDate_s::qd_mday
glong qd_mday
Signed replacement of struct tm.tm_mday.
Definition: qofdate.h:164

gboolean qof_date_equal | ( | const QofDate * | d1,
|  | const QofDate * | d2
| ) |  |

Check two QofDates for equality

Definition at line 629 of file qofdate.c.

630 {
631 if (0 == qof_date_compare (d1, d2))
632 return TRUE;
633 return FALSE;
634 }
qof_date_compare
gint qof_date_compare(const QofDate *d1, const QofDate *d2)
Definition: qofdate.c:637

gboolean qof_date_format_add | ( | const gchar * | str,
|  | QofDateFormat * | identifier
| ) |  |

Add a specific strftime compatible string as a new QofDateFormat.

Unlike GDate, QofDate allows time-related formats.

Parameters

  str | A pre-formatted string, suitable to be passed directly to strftime.
  identifier | integer pointer. Will be set to the positive value to be used to identify this date format later.

Returns
  TRUE on success, otherwise FALSE

Todo:
  Move to QofDate and qofgmtime_r

Definition at line 202 of file qofdate.c.

203 {
204 struct tm check;
205 gint len;
206 time_t now;
207 gchar test[MAX_DATE_BUFFER];
208
210 g_return_val_if_fail (QofDateInit, FALSE);
211 g_return_val_if_fail (str, FALSE);
212 g_return_val_if_fail (strlen (str) != 0, FALSE);
213 /* prevent really long strings being passed */
214 ENTER (" str=%s", str);
215 if (strlen (str) > MAX_DATE_LENGTH)
216 {
217 LEAVE (" '%s' is too long! Max=%d str_len=%d",
218 str, MAX_DATE_LENGTH, (gint) strlen (str));
219 return FALSE;
220 }
221 /* test the incoming string using the current time. */
222 now = time (NULL);
223 test[0] = '\1';
224 check = *gmtime_r (&now, &check);
225 /* need to allow time related formats -
226 don't use g_date_strftime here. */
227 len = strftime (test, (MAX_DATE_BUFFER - 1), str, &check);
228 if (len == 0 && test[0] != '\0')
229 {
230 LEAVE (" strftime could not understand '%s'", str);
231 return FALSE;
232 }
233 len = strlen (test);
234 if (len > MAX_DATE_LENGTH)
235 {
236 LEAVE (" %s creates a string '%s' that is too long!"
237 " Max=%d str_len=%d", str, test, MAX_DATE_LENGTH, len);
238 return FALSE;
239 }
240 *identifier = g_hash_table_size (DateFormatTable) + 1;
241 {
242 QofDateEntry *d = g_new0 (QofDateEntry, 1);
243 d->format = str;
244 d->name = str;
245 d->separator = locale_separator;
246 d->df = *identifier;
247 g_hash_table_insert (DateFormatTable, GINT_TO_POINTER (d->df), d);
248 }
249 LEAVE (" successful");
250 return TRUE;
251 }
MAX_DATE_BUFFER
#define MAX_DATE_BUFFER
The maximum length of a QofDate buffer.
Definition: qofdate.h:92
LEAVE
#define LEAVE(format, args...)
Definition: qoflog.h:227
MAX_DATE_LENGTH
#define MAX_DATE_LENGTH
The maximum length of a string used for or created by dates.
Definition: qofdate.h:87
ENTER
#define ENTER(format, args...)
Definition: qoflog.h:217

QofDateFormat qof_date_format_from_name | ( | const gchar * | name | ) |

Returns the default date format for a known shorthand name.

If the selected QofDateFormat is one of the defaults, the shorthand "name" is returned. If format is not a default, returns negative one.

Parameters

  name | Shorthand "name" of this format.

Returns
  the QofDateFormat on success, negative one on failure.

Definition at line 385 of file qofdate.c.

386 {
387 struct iter i;
388
389 if (!name)
390 return -1;
391 if (0 == safe_strcmp (name, "us"))
392 return QOF_DATE_FORMAT_US;
393 if (0 == safe_strcmp (name, "uk"))
394 return QOF_DATE_FORMAT_UK;
395 if (0 == safe_strcmp (name, "ce"))
396 return QOF_DATE_FORMAT_CE;
397 if (0 == safe_strcmp (name, "utc"))
398 return QOF_DATE_FORMAT_UTC;
399 if (0 == safe_strcmp (name, "iso"))
400 return QOF_DATE_FORMAT_ISO;
401 if (0 == safe_strcmp (name, "locale"))
402 return QOF_DATE_FORMAT_LOCALE;
403 if (0 == safe_strcmp (name, "custom"))
404 return QOF_DATE_FORMAT_CUSTOM;
405 i.name = name;
406 i.df = -1;
407 g_hash_table_foreach (DateFormatTable, lookup_name, &i);
408 return i.df;
409 }
QOF_DATE_FORMAT_UTC
#define QOF_DATE_FORMAT_UTC
QOF UTC format, xsd:date compatible. QOF_UTC_DATE_FORMAT "%Y-%m-%dT%H:%M:%SZ".
Definition: qofdate.h:277
QOF_DATE_FORMAT_ISO
#define QOF_DATE_FORMAT_ISO
Short ISO form. "%F".
Definition: qofdate.h:268
QOF_DATE_FORMAT_CE
#define QOF_DATE_FORMAT_CE
Contintental European default. "%d.%m.%Y".
Definition: qofdate.h:263
QOF_DATE_FORMAT_UK
#define QOF_DATE_FORMAT_UK
United Kingdom default. "%d/%m/%Y".
Definition: qofdate.h:258
QOF_DATE_FORMAT_LOCALE
#define QOF_DATE_FORMAT_LOCALE
GNU locale default. "%x".
Definition: qofdate.h:303
QOF_DATE_FORMAT_CUSTOM
#define QOF_DATE_FORMAT_CUSTOM
Date and time for the current locale "%c".
Definition: qofdate.h:319
safe_strcmp
gint safe_strcmp(const gchar *da, const gchar *db)
Definition: qofutil.c:72
QOF_DATE_FORMAT_US
#define QOF_DATE_FORMAT_US
Continental US default. "%m/%d/%Y".
Definition: qofdate.h:253

gchar qof_date_format_get_date_separator | ( | QofDateFormat | df | ) |

Return the field separator for the current date format.

Note
  The separator only relates to the date portion of any date format string, i.e. the separator used between day, month and year. Separators used between time fields like hour, minute, second in any date format are not available.

Returns
  date single non-digit character to separate fields within the date section of a date format or a null on error.

Definition at line 325 of file qofdate.c.

326 {
327 QofDateEntry *d;
328
329 g_return_val_if_fail (QofDateInit, locale_separator);
330 d = g_hash_table_lookup (DateFormatTable, GINT_TO_POINTER (df));
331 if (!d)
332 {
333 PERR (" unknown format: '%d'", df);
334 return locale_separator;
335 }
336 return d->separator;
337 }
PERR
#define PERR(format, args...)
Definition: qoflog.h:183

const gchar* qof_date_format_get_format | ( | QofDateFormat | df | ) |

Retrieve the strftime format string for a registered date format.

Parameters

  df | The QofDateFormat identifier for the registered date format.

Returns
  The format string for this date format or NULL on error.

Definition at line 310 of file qofdate.c.

311 {
312 QofDateEntry *d;
313
314 g_return_val_if_fail (QofDateInit, NULL);
315 d = g_hash_table_lookup (DateFormatTable, GINT_TO_POINTER (df));
316 if (!d)
317 {
318 PERR (" unknown format: '%d'", df);
319 return NULL;
320 }
321 return d->format;
322 }
PERR
#define PERR(format, args...)
Definition: qoflog.h:183

gboolean qof_date_format_set_current | ( | QofDateFormat | df | ) |

Selects one registered date format as the current default.

Parameters

  df | QofDateFormat identifier indicating preferred format.

Returns
  TRUE on success, else FALSE.

Definition at line 294 of file qofdate.c.

295 {
296 QofDateEntry *d;
297
298 g_return_val_if_fail (QofDateInit, FALSE);
299 d = g_hash_table_lookup (DateFormatTable, GINT_TO_POINTER (df));
300 if (!d)
301 {
302 PERR (" unknown format: '%d'", df);
303 return FALSE;
304 }
305 dateFormat = d->df;
306 return TRUE;
307 }
PERR
#define PERR(format, args...)
Definition: qoflog.h:183

gboolean qof_date_format_set_date_separator | ( | const gchar | sep,
|  | QofDateFormat | df
| ) |  |

Set a locale-specific separator.

Sets the date separator for a date format added using qof_date_format_add.

Returns
  FALSE if date format is not one of the QOF defaults or if the character is a digit, TRUE on success.

Definition at line 340 of file qofdate.c.

341 {
342 QofDateEntry *d;
343
344 g_return_val_if_fail (QofDateInit, FALSE);
345 if (df < DATE_FORMAT_LAST)
346 {
347 DEBUG (" Prevented attempt to override a default format");
348 return FALSE;
349 }
350 if (g_ascii_isdigit (sep))
351 return FALSE;
352 d = g_hash_table_lookup (DateFormatTable, GINT_TO_POINTER (df));
353 if (!d)
354 {
355 PERR (" unknown format: '%d'", df);
356 return FALSE;
357 }
358 d->separator = sep;
359 g_hash_table_insert (DateFormatTable, GINT_TO_POINTER (df), d);
360 return TRUE;
361 }
PERR
#define PERR(format, args...)
Definition: qoflog.h:183
DATE_FORMAT_LAST
#define DATE_FORMAT_LAST
Definition: qofdate.h:322
DEBUG
#define DEBUG(format, args...)
Definition: qoflog.h:208

gboolean qof_date_format_set_name | ( | const gchar * | name,
|  | QofDateFormat | format
| ) |  |

Set a shorthand name for a custom date format.

Used alongside qof_date_format_add to allow any date format to have a shorthand name.

Parameters

  name | Shorthand name for a date format added with qof_date_format_add. The string becomes the property of QofDate and should not be freed.
  format | identifier used previously with qof_date_format_add

Returns
  TRUE if the shorthand name can be set, FALSE on error or if the chosen QofDateFormat is one of the defaults.

Definition at line 269 of file qofdate.c.

270 {
271 QofDateEntry *d;
272
273 g_return_val_if_fail (QofDateInit, FALSE);
274 if (format <= DATE_FORMAT_LAST)
275 return FALSE;
276 d = g_hash_table_lookup (DateFormatTable, GINT_TO_POINTER (format));
277 if (!d)
278 {
279 PERR (" unknown format: '%d'", format);
280 return FALSE;
281 }
282 d->name = name;
283 g_hash_table_insert (DateFormatTable, GINT_TO_POINTER (format), d);
284 return TRUE;
285 }
PERR
#define PERR(format, args...)
Definition: qoflog.h:183
DATE_FORMAT_LAST
#define DATE_FORMAT_LAST
Definition: qofdate.h:322

const gchar* qof_date_format_to_name | ( | QofDateFormat | format | ) |

Retrieve the shorthand name for the selected date format.

If the selected QofDateFormat is one of the defaults, a shorthand "name" is used. If it is a string added using qof_date_add_format, the string itself is returned.

Parameters

  format | The QofDateFormat to lookup.

Returns
  FALSE on success and TRUE on failure.

Definition at line 254 of file qofdate.c.

255 {
256 QofDateEntry *d;
257
258 g_return_val_if_fail (QofDateInit, NULL);
259 d = g_hash_table_lookup (DateFormatTable, GINT_TO_POINTER (format));
260 if (!d)
261 {
262 PERR (" unknown format: '%d'", format);
263 return NULL;
264 }
265 return d->name;
266 }
PERR
#define PERR(format, args...)
Definition: qoflog.h:183

void qof_date_free | ( | QofDate * | date | ) |

free a QofDate

Definition at line 608 of file qofdate.c.

609 {
610 g_return_if_fail (date);
611 g_free (date);
612 date = NULL;
613 }

QofDate* qof_date_from_gdate | ( | const GDate * | gd | ) |

Create a QofDate from a GDate.

A GDate is always within the range of a QofDate.

Parameters

  gd | A valid GDate.

Returns
  NULL on error, otherwise a newly allocated, valid, QofDate.

Definition at line 750 of file qofdate.c.

751 {
752 QofDate * qd;
753
754 g_return_val_if_fail (g_date_valid (date), NULL);
755 qd = qof_date_new ();
756 qd->qd_year = g_date_get_year (date);
757 qd->qd_mon = g_date_get_month (date);
758 qd->qd_mday = g_date_get_day (date);
759 qd = date_normalise (qd);
760 return qd;
761 }
QofDate_s::qd_year
gint64 qd_year
Extended version to cope with full range of dates.
Definition: qofdate.h:181
QofDate_s
Full range replacement for struct tm.
Definition: qofdate.h:138
QofDate_s::qd_mon
glong qd_mon
Signed replacement of struct tm.tm_mon.
Definition: qofdate.h:171
qof_date_new
QofDate * qof_date_new(void)
Definition: qofdate.c:573
QofDate_s::qd_mday
glong qd_mday
Signed replacement of struct tm.tm_mday.
Definition: qofdate.h:164

QofDate* qof_date_from_qtime | ( | const QofTime * | qt | ) |

Return a QofDate in UTC from a QofTime.

Definition at line 850 of file qofdate.c.

851 {
852 QofDate *qd;
853 gint leap_extra_secs;
854
855 /* may not want to create a new time or date - it
856 complicates memory management. */
857 g_return_val_if_fail (qt, NULL);
858 g_return_val_if_fail (qof_time_is_valid (qt), NULL);
859 qd = qof_date_new ();
860 leap_extra_secs = 0;
861 setenv ("TZ", "GMT", 1);
862 tzset();
863 leap_extra_secs = extract_interval (qt);
864 qof_date_offset (qt, leap_extra_secs, qd);
865 qd->qd_nanosecs = qof_time_get_nanosecs (qt);
866 qd->qd_is_dst = 0;
867 qd->qd_zone = "GMT";
868 qd->qd_gmt_off = 0L;
869 if (!qof_date_valid(qd))
870 return NULL;
871 return qd;
872 }
QofDate_s::qd_zone
const gchar * qd_zone
Calculated value based on struct tm.tm_zone.
Definition: qofdate.h:208
QofDate_s::qd_is_dst
gshort qd_is_dst
Definition: qofdate.h:193
qof_time_get_nanosecs
glong qof_time_get_nanosecs(const QofTime *qt)
Get the number of seconds.
Definition: qoftime.c:141
QofDate_s
Full range replacement for struct tm.
Definition: qofdate.h:138
QofDate_s::qd_gmt_off
glong qd_gmt_off
Calculated value based on struct tm.tm_gmtoff.
Definition: qofdate.h:201
QofDate_s::qd_nanosecs
glong qd_nanosecs
Definition: qofdate.h:141
qof_date_new
QofDate * qof_date_new(void)
Definition: qofdate.c:573
qof_date_valid
gboolean qof_date_valid(QofDate *date)
Validate a QofDate.
Definition: qofdate.c:616

QofDate* qof_date_from_struct_tm | ( | const struct tm * | stm | ) |

Convert a struct tm to a QofDate.

Parameters

  stm | A pointer to a valid struct tm.

Returns
  Newly allocated QofDate or NULL if tm is NULL.

Definition at line 679 of file qofdate.c.

680 {
681 QofDate *d;
682
683 g_return_val_if_fail (stm, NULL);
684 d = g_new0 (QofDate, 1);
685 d->qd_sec = stm->tm_sec;
686 d->qd_min = stm->tm_min;
687 d->qd_hour = stm->tm_hour;
688 d->qd_mday = stm->tm_mday;
689 d->qd_mon = stm->tm_mon + 1;
690 d->qd_year = stm->tm_year + 1900;
691 d->qd_wday = stm->tm_wday;
692 d->qd_yday = stm->tm_yday;
693 d->qd_is_dst = stm->tm_isdst;
694 d->qd_gmt_off = stm->tm_gmtoff;
695 d->qd_zone = stm->tm_zone;
696 d->qd_valid = TRUE;
697 d = date_normalise(d);
698 return d;
699 }
QofDate_s::qd_yday
gshort qd_yday
Definition: qofdate.h:189
QofDate_s::qd_year
gint64 qd_year
Extended version to cope with full range of dates.
Definition: qofdate.h:181
QofDate_s::qd_valid
gboolean qd_valid
If the QofDate is valid or merely initialised.
Definition: qofdate.h:217
QofDate_s::qd_zone
const gchar * qd_zone
Calculated value based on struct tm.tm_zone.
Definition: qofdate.h:208
QofDate_s::qd_is_dst
gshort qd_is_dst
Definition: qofdate.h:193
QofDate_s
Full range replacement for struct tm.
Definition: qofdate.h:138
QofDate_s::qd_hour
glong qd_hour
Signed replacement of struct tm.tm_hour.
Definition: qofdate.h:157
QofDate_s::qd_min
glong qd_min
Signed replacement of struct tm.tm_min.
Definition: qofdate.h:150
QofDate_s::qd_mon
glong qd_mon
Signed replacement of struct tm.tm_mon.
Definition: qofdate.h:171
QofDate_s::qd_sec
gint64 qd_sec
Definition: qofdate.h:143
QofDate_s::qd_gmt_off
glong qd_gmt_off
Calculated value based on struct tm.tm_gmtoff.
Definition: qofdate.h:201
QofDate_s::qd_wday
gshort qd_wday
Definition: qofdate.h:185
QofDate_s::qd_mday
glong qd_mday
Signed replacement of struct tm.tm_mday.
Definition: qofdate.h:164

QofDate* qof_date_get_current | ( | void |  | ) |

create a new QofDate for the current date and time.

Definition at line 582 of file qofdate.c.

583 {
584 QofTime *qt;
585 QofDate *qd;
586
587 qt = qof_time_get_current ();
588 qd = qof_date_from_qtime (qt);
589 qof_time_free (qt);
590 return qd;
591 }
qof_date_from_qtime
QofDate * qof_date_from_qtime(const QofTime *qt)
Definition: qofdate.c:850
QofDate_s
Full range replacement for struct tm.
Definition: qofdate.h:138
qof_time_get_current
QofTime * qof_time_get_current(void)
Get the current QofTime.
Definition: qoftime.c:362
qof_time_free
void qof_time_free(QofTime *qt)
Free a QofTime when no longer required.
Definition: qoftime.c:56
QofTime
struct QofTime64 QofTime
Use a 64-bit signed int QofTime.
Definition: qoftime.h:120

guint8 qof_date_get_mday | ( | gint | month,
|  | gint64 | year
| ) |  |

full range version of g_date_get_days_in_month

Parameters

  month | Any valid QofDate qd_mon, 1 to 12.
  year | Any valid QofDate qd_year.

Returns
  0 on error, otherwise the number of days in the specified month, taking leap years into account.

Definition at line 183 of file qofdate.c.

184 {
185 g_return_val_if_fail (month != 0, 0);
186 g_return_val_if_fail (month <= 12, 0);
187 g_return_val_if_fail (month >= 1, 0);
188 g_return_val_if_fail (year != 0, 0);
189 return days_in_months[qof_date_isleap (year)][month];
190 }
qof_date_isleap
#define qof_date_isleap(year)
Definition: qofdate.h:222

guint16 qof_date_get_yday | ( | gint | mday,
|  | gint | month,
|  | gint64 | year
| ) |  |

full range version of g_date_get_day_of_year

Parameters

  mday | Any valid QofDate qd_mday, 1 to 31.
  month | Any valid QofDate qd_mon, 1 to 12.
  year | Any valid QofDate qd_year.

Returns
  0 if error, otherwise the day of the year, where Jan 1 is 1, the first day of the year.

Definition at line 167 of file qofdate.c.

168 {
169 guint8 leap;
170
171 g_return_val_if_fail (mday != 0, 0);
172 g_return_val_if_fail (month != 0, 0);
173 g_return_val_if_fail (month <= 12, 0);
174 g_return_val_if_fail (month >= 1, 0);
175 g_return_val_if_fail (year != 0, 0);
176 leap = qof_date_isleap (year);
177 g_return_val_if_fail (mday <=
178 qof_date_get_mday (month, year), 0);
179 return days_in_year[leap][month] + mday;
180 }
qof_date_get_mday
guint8 qof_date_get_mday(gint month, gint64 year)
Definition: qofdate.c:183
qof_date_isleap
#define qof_date_isleap(year)
Definition: qofdate.h:222

gboolean qof_date_is_last_mday | ( | const QofDate * | qd | ) |

Checks if QofDate the last day of the month.

Parameters

  qd | A valid QofDate.

Returns
  TRUE if qd_mday is the last day of qd_mon in qd_year, otherwise (or on error), FALSE.

Definition at line 193 of file qofdate.c.

194 {
195 g_return_val_if_fail (qd, FALSE);
196 g_return_val_if_fail (qd->qd_valid, FALSE);
197 return (qd->qd_mday ==
198 qof_date_get_mday (qd->qd_mon, qd->qd_year));
199 }
QofDate_s::qd_year
gint64 qd_year
Extended version to cope with full range of dates.
Definition: qofdate.h:181
QofDate_s::qd_valid
gboolean qd_valid
If the QofDate is valid or merely initialised.
Definition: qofdate.h:217
qof_date_get_mday
guint8 qof_date_get_mday(gint month, gint64 year)
Definition: qofdate.c:183
QofDate_s::qd_mon
glong qd_mon
Signed replacement of struct tm.tm_mon.
Definition: qofdate.h:171
QofDate_s::qd_mday
glong qd_mday
Signed replacement of struct tm.tm_mday.
Definition: qofdate.h:164

QofDate* qof_date_new | ( | void |  | ) |

create a new, empty, QofDate

Definition at line 573 of file qofdate.c.

574 {
575 QofDate *d;
576
577 d = g_new0 (QofDate, 1);
578 return d;
579 }
QofDate_s
Full range replacement for struct tm.
Definition: qofdate.h:138

QofDate* qof_date_new_dmy | ( | gint | day,
|  | gint | month,
|  | gint64 | year
| ) |  |

create a new QofDate from basic calendar data.

Definition at line 594 of file qofdate.c.

595 {
596 QofDate *qd;
597
598 qd = g_new0 (QofDate, 1);
599 qd->qd_mday = day;
600 qd->qd_mon = month;
601 qd->qd_year = year;
602 if(!qof_date_valid (qd))
603 return NULL;
604 return qd;
605 }
QofDate_s::qd_year
gint64 qd_year
Extended version to cope with full range of dates.
Definition: qofdate.h:181
QofDate_s
Full range replacement for struct tm.
Definition: qofdate.h:138
QofDate_s::qd_mon
glong qd_mon
Signed replacement of struct tm.tm_mon.
Definition: qofdate.h:171
QofDate_s::qd_mday
glong qd_mday
Signed replacement of struct tm.tm_mday.
Definition: qofdate.h:164
qof_date_valid
gboolean qof_date_valid(QofDate *date)
Validate a QofDate.
Definition: qofdate.c:616

QofDate* qof_date_parse | ( | const gchar * | str,
|  | QofDateFormat | df
| ) |  |

Convert a timestamp to a QofTime.

Safe for all dates within the range of QofDate.

Parameters

  str | a timestamp created with one of the registered QofDateFormat formats.
  df | The registered QofDateFormat that produced the string.

Returns
  a newly allocated, valid, QofDate or NULL on error.

Definition at line 525 of file qofdate.c.

526 {
527 const gchar *format;
528 QofDateError error;
529 QofDate *date;
530 gchar *check;
531
532 check = NULL;
533 error = ERR_NO_ERROR;
534 date = qof_date_new ();
535 format = qof_date_format_get_format (df);
536 check = strptime_internal (str, format, date, &error);
537 if (error != ERR_NO_ERROR)
538 {
539 qof_date_free (date);
540 return NULL;
541 }
542 date = date_normalise (date);
543 return date;
544 }
qof_date_free
void qof_date_free(QofDate *date)
Definition: qofdate.c:608
qof_date_format_get_format
const gchar * qof_date_format_get_format(QofDateFormat df)
Retrieve the strftime format string for a registered date format.
Definition: qofdate.c:310
QofDate_s
Full range replacement for struct tm.
Definition: qofdate.h:138
qof_date_new
QofDate * qof_date_new(void)
Definition: qofdate.c:573

gchar* qof_date_print | ( | const QofDate * | date,
|  | QofDateFormat | df
| ) |  |

Convert a QofDate to a timestamp according to the specified date format.

Unlike qof_time_stamp_now, any supported QofDate can be converted in any registered QofDateFormat.

Parameters

  date | A valid QofDate.
  df | a registered QofDateFormat to use to create the string.

Returns
  NULL on error, otherwise a string which should be freed when no longer needed.

Definition at line 547 of file qofdate.c.

548 {
549 size_t result;
550 gchar temp[MAX_DATE_BUFFER];
551 QofDateEntry *d;
552
553 g_return_val_if_fail (QofDateInit, NULL);
554 g_return_val_if_fail (date, NULL);
555 g_return_val_if_fail (date->qd_valid, NULL);
556 d = g_hash_table_lookup (DateFormatTable,
557 GINT_TO_POINTER (df));
558 g_return_val_if_fail (d, NULL);
559 temp[0] = '\1';
560 result = strftime_case (FALSE, temp, MAX_DATE_BUFFER,
561 d->format, date, 1, date->qd_nanosecs);
562 if (result == 0 && temp[0] != '\0')
563 {
564 PERR (" qof extended strftime failed");
565 return NULL;
566 }
567 return g_strndup(temp, result);
568 }
MAX_DATE_BUFFER
#define MAX_DATE_BUFFER
The maximum length of a QofDate buffer.
Definition: qofdate.h:92
PERR
#define PERR(format, args...)
Definition: qoflog.h:183
QofDate_s::qd_valid
gboolean qd_valid
If the QofDate is valid or merely initialised.
Definition: qofdate.h:217
QofDate_s::qd_nanosecs
glong qd_nanosecs
Definition: qofdate.h:141

QofTime* qof_date_time_difference | ( | const QofDate * | date1,
|  | const QofDate * | date2
| ) |  |

Calculate the QofTime between two QofDates

Definition at line 925 of file qofdate.c.

927 {
928 gint64 days;
929 QofTime *secs;
930
931 secs = qof_time_new ();
932 days = days_between (date1->qd_year, date2->qd_year);
933 qof_time_add_secs(secs, QOF_DAYS_TO_SEC(days));
934 if (days >= 0)
935 {
936 /* positive value, add date2 secs, subtract date1 */
937 qof_time_add_secs(secs, -1 *
938 (QOF_HOUR_TO_SEC(date1->qd_hour) -
939 QOF_MIN_TO_SEC(date1->qd_min) -
940 (date1->qd_sec)));
941 qof_time_add_secs(secs,
942 QOF_HOUR_TO_SEC(date2->qd_hour) +
943 QOF_MIN_TO_SEC(date2->qd_min) +
944 (date2->qd_sec));
945 qof_time_set_nanosecs(secs,
946 (date1->qd_nanosecs - date2->qd_nanosecs));
947 }
948 if (days < 0)
949 {
950 /* negative value*/
951 qof_time_add_secs (secs,
952 QOF_HOUR_TO_SEC(date1->qd_hour) -
953 QOF_MIN_TO_SEC(date1->qd_min) -
954 (date1->qd_sec));
955 qof_time_add_secs (secs, -1 *
956 (QOF_HOUR_TO_SEC(date2->qd_hour) +
957 QOF_MIN_TO_SEC(date2->qd_min) +
958 (date2->qd_sec)));
959 qof_time_set_nanosecs(secs,
960 (date2->qd_nanosecs - date1->qd_nanosecs));
961 }
962 return secs;
963 }
QofDate_s::qd_year
gint64 qd_year
Extended version to cope with full range of dates.
Definition: qofdate.h:181
qof_time_new
QofTime * qof_time_new(void)
create an empty QofTime
Definition: qoftime.c:46
QofDate_s::qd_hour
glong qd_hour
Signed replacement of struct tm.tm_hour.
Definition: qofdate.h:157
QofDate_s::qd_min
glong qd_min
Signed replacement of struct tm.tm_min.
Definition: qofdate.h:150
qof_time_add_secs
void qof_time_add_secs(QofTime *qt, QofTimeSecs secs)
Add (or subtract) seconds from a QofTime.
Definition: qoftime.c:65
QOF_HOUR_TO_SEC
#define QOF_HOUR_TO_SEC(x)
Definition: qofdate.h:327
qof_time_set_nanosecs
void qof_time_set_nanosecs(QofTime *qt, glong nano)
Set the number of seconds.
Definition: qoftime.c:125
QofDate_s::qd_sec
gint64 qd_sec
Definition: qofdate.h:143
QofDate_s::qd_nanosecs
glong qd_nanosecs
Definition: qofdate.h:141
QofTime
struct QofTime64 QofTime
Use a 64-bit signed int QofTime.
Definition: qoftime.h:120
QOF_MIN_TO_SEC
#define QOF_MIN_TO_SEC(x)
Definition: qofdate.h:329
QOF_DAYS_TO_SEC
#define QOF_DAYS_TO_SEC(x)
Definition: qofdate.h:331

gboolean qof_date_to_gdate | ( | const QofDate * | qd,
|  | GDate * | gd
| ) |  |

Convert a QofDate to a GDate.

Parameters

  qd | a valid QofDate
  gd | a new GDate to store the converted value.

Returns
  FALSE on error, if the QofDate is out of range of a GDate or if QofDate is not valid, otherwise TRUE.

Definition at line 730 of file qofdate.c.

731 {
732 g_return_val_if_fail (qd, FALSE);
733 g_return_val_if_fail (gd, FALSE);
734 g_return_val_if_fail (qd->qd_valid, FALSE);
735 if (qd->qd_year >= G_MAXUINT16)
736 {
737 PERR (" QofDate out of range of GDate");
738 return FALSE;
739 }
740 if (!g_date_valid_dmy (qd->qd_mday, qd->qd_mon, qd->qd_year))
741 {
742 PERR (" GDate failed to allow day, month and/or year");
743 return FALSE;
744 }
745 g_date_set_dmy (gd, qd->qd_mday, qd->qd_mon, qd->qd_year);
746 return TRUE;
747 }
QofDate_s::qd_year
gint64 qd_year
Extended version to cope with full range of dates.
Definition: qofdate.h:181
PERR
#define PERR(format, args...)
Definition: qoflog.h:183
QofDate_s::qd_valid
gboolean qd_valid
If the QofDate is valid or merely initialised.
Definition: qofdate.h:217
QofDate_s::qd_mon
glong qd_mon
Signed replacement of struct tm.tm_mon.
Definition: qofdate.h:171
QofDate_s::qd_mday
glong qd_mday
Signed replacement of struct tm.tm_mday.
Definition: qofdate.h:164

QofTime* qof_date_to_qtime | ( | const QofDate * | qd | ) |

Return a valid QofTime from a valid QofDate.

Definition at line 892 of file qofdate.c.

893 {
894 QofTime *qt;
895 QofTimeSecs c;
896
897 g_return_val_if_fail (qd, NULL);
898 g_return_val_if_fail (qd->qd_valid, NULL);
899 c = 0;
900 qt = NULL;
901 if (qd->qd_year < 1970)
902 {
903 c = qd->qd_sec;
904 c += QOF_MIN_TO_SEC(qd->qd_min);
905 c += QOF_HOUR_TO_SEC(qd->qd_hour);
906 c += QOF_DAYS_TO_SEC(qd->qd_yday);
907 c -= QOF_DAYS_TO_SEC(days_between (1970, qd->qd_year));
908 c -= qd->qd_gmt_off;
909 qt = qof_time_set (c, qd->qd_nanosecs);
910 }
911 if (qd->qd_year >= 1970)
912 {
913 c = qd->qd_sec;
914 c += QOF_MIN_TO_SEC(qd->qd_min);
915 c += QOF_HOUR_TO_SEC(qd->qd_hour);
916 c += QOF_DAYS_TO_SEC(qd->qd_yday);
917 c += QOF_DAYS_TO_SEC(days_between (1970, qd->qd_year));
918 c -= qd->qd_gmt_off;
919 qt = qof_time_set (c, qd->qd_nanosecs);
920 }
921 return qt;
922 }
QofDate_s::qd_yday
gshort qd_yday
Definition: qofdate.h:189
QofDate_s::qd_year
gint64 qd_year
Extended version to cope with full range of dates.
Definition: qofdate.h:181
QofDate_s::qd_valid
gboolean qd_valid
If the QofDate is valid or merely initialised.
Definition: qofdate.h:217
QofDate_s::qd_hour
glong qd_hour
Signed replacement of struct tm.tm_hour.
Definition: qofdate.h:157
QofDate_s::qd_min
glong qd_min
Signed replacement of struct tm.tm_min.
Definition: qofdate.h:150
QOF_HOUR_TO_SEC
#define QOF_HOUR_TO_SEC(x)
Definition: qofdate.h:327
QofDate_s::qd_sec
gint64 qd_sec
Definition: qofdate.h:143
QofDate_s::qd_gmt_off
glong qd_gmt_off
Calculated value based on struct tm.tm_gmtoff.
Definition: qofdate.h:201
qof_time_set
QofTime * qof_time_set(QofTimeSecs t, glong nanosecs)
Definition: qoftime.c:210
QofDate_s::qd_nanosecs
glong qd_nanosecs
Definition: qofdate.h:141
QofTimeSecs
gint64 QofTimeSecs
Replacement for time_t.
Definition: qoftime.h:129
QofTime
struct QofTime64 QofTime
Use a 64-bit signed int QofTime.
Definition: qoftime.h:120
QOF_MIN_TO_SEC
#define QOF_MIN_TO_SEC(x)
Definition: qofdate.h:329
QOF_DAYS_TO_SEC
#define QOF_DAYS_TO_SEC(x)
Definition: qofdate.h:331

gboolean qof_date_to_struct_tm | ( | const QofDate * | qt,
|  | struct tm * | stm,
|  | glong * | nanosecs
| ) |  |

Convert a QofDate to a struct tm.

Warning
  Check the return value - a QofDate has a larger range than a struct tm. The struct tm will be unchanged if a conversion would have been out of range.

Parameters

  qt | A valid QofDate.
  stm | Pointer to a struct tm to store the result.
  nanosecs | Pointer to a glong to store the nanoseconds.

Returns
  FALSE on error or if the QofDate is invalid or out of the range of a struct tm, otherwise TRUE.

Definition at line 702 of file qofdate.c.

704 {
705 g_return_val_if_fail (qd, FALSE);
706 g_return_val_if_fail (stm, FALSE);
707 g_return_val_if_fail (qd->qd_valid, FALSE);
708 if ((qd->qd_year > G_MAXINT) || (qd->qd_year < 1900))
709 {
710 PERR (" date too large for struct tm");
711 return FALSE;
712 }
713 stm->tm_sec = qd->qd_sec;
714 stm->tm_min = qd->qd_min;
715 stm->tm_hour = qd->qd_hour;
716 stm->tm_mday = qd->qd_mday;
717 stm->tm_mon = qd->qd_mon - 1;
718 stm->tm_year = qd->qd_year - 1900;
719 stm->tm_wday = qd->qd_wday;
720 stm->tm_yday = qd->qd_yday;
721 stm->tm_isdst = qd->qd_is_dst;
722 stm->tm_gmtoff = qd->qd_gmt_off;
723 stm->tm_zone = qd->qd_zone;
724 if (nanosecs != NULL)
725 *nanosecs = qd->qd_nanosecs;
726 return TRUE;
727 }
PERR
#define PERR(format, args...)
Definition: qoflog.h:183

gboolean qof_date_valid | ( | QofDate * | date | ) |

Validate a QofDate.

If the QofDate is already valid, just returns TRUE. If the QofDate is not valid but can be normalised, the QofDate is normalised and the function returns TRUE. If the QofDate cannot be normalised, returns FALSE.

Year Zero does not exist in the Christian Era, the Gregorian calendar or the Julian calendar. A year zero does exist in ISO 8601:2004 and in the astronomical year numbering with a defined year zero equal to 1 BC, as well as in some Buddhist and Hindu lunar calendars.

In QofDate, 1BC is immediately followed by 1AD and months are numbered from 1 to 12, not from zero.

Normalising a QofDate tries to use sensible defaults:

- if qd_mon == 0, validating sets qd_mon to 1 (January)
- if qd_year == 0, validating sets qd_year to -1 (1BC).
- if qd_mday == 0, validating sets qd_mday to 1.

Definition at line 616 of file qofdate.c.

617 {
618 g_return_val_if_fail (date, FALSE);
619 date = date_normalise (date);
620 if (date->qd_valid == FALSE)
621 {
622 PERR (" unknown QofDate error");
623 return FALSE;
624 }
625 return TRUE;
626 }
PERR
#define PERR(format, args...)
Definition: qoflog.h:183
QofDate_s::qd_valid
gboolean qd_valid
If the QofDate is valid or merely initialised.
Definition: qofdate.h:217