Data Structures | |
struct | QofDate_s |
Full range replacement for struct tm. More... | |
Files | |
file | qofdate.h |
64bit Date handling routines | |
Defines | |
#define | MAX_DATE_LENGTH 41 |
The maximum length of a string used for or created by dates. | |
#define | MAX_DATE_BUFFER 256 |
The maximum length of a QofDate buffer. | |
#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. | |
#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. | |
typedef gint | QofDateFormat |
Functions | |
void | qof_date_init (void) |
initialise the QofDate tables | |
void | qof_date_close (void) |
close down the QofDate tables | |
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. | |
const gchar * | qof_date_format_to_name (QofDateFormat format) |
Retrieve the shorthand name for the selected date format. | |
QofDateFormat | qof_date_format_from_name (const gchar *name) |
Returns the default date format for a known shorthand name. | |
gboolean | qof_date_format_set_name (const gchar *name, QofDateFormat format) |
Set a shorthand name for a custom date format. | |
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. | |
const gchar * | qof_date_format_get_format (QofDateFormat df) |
Retrieve the strftime format string for a registered date format. | |
gchar | qof_date_format_get_date_separator (QofDateFormat df) |
Return the field separator for the current date format. | |
gboolean | qof_date_format_set_date_separator (const gchar sep, QofDateFormat df) |
Set a locale-specific separator. | |
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. | |
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. | |
gboolean | qof_date_to_struct_tm (const QofDate *qt, struct tm *stm, glong *nanosecs) |
Convert a QofDate to a struct tm. | |
gboolean | qof_date_to_gdate (const QofDate *qd, GDate *gd) |
Convert a QofDate to a GDate. | |
QofDate * | qof_date_from_gdate (const GDate *gd) |
Create a QofDate from a GDate. | |
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. | |
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.
'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.
| |
gchar * | qof_date_print (const QofDate *date, QofDateFormat df) |
Convert a QofDate to a timestamp according to the specified date format. | |
QofDate * | qof_date_parse (const gchar *str, QofDateFormat df) |
Convert a timestamp to a QofTime. | |
Default QofDate formats | |
#define | QOF_DATE_FORMAT_US 1 |
Continental US default. "%m/%d/%Y". | |
#define | QOF_DATE_FORMAT_UK 2 |
United Kingdom default. "%d/%m/%Y". | |
#define | QOF_DATE_FORMAT_CE 3 |
Contintental European default. "%d.%m.%Y". | |
#define | QOF_DATE_FORMAT_ISO 4 |
Short ISO form. "%F". | |
#define | QOF_DATE_FORMAT_UTC 5 |
QOF UTC format, xsd:date compatible. QOF_UTC_DATE_FORMAT "%Y-%m-%dT%H:%M:%SZ". | |
#define | QOF_DATE_FORMAT_ISO8601 6 |
#define | QOF_DATE_FORMAT_LOCALE 7 |
GNU locale default. "%x". | |
#define | QOF_DATE_FORMAT_CUSTOM 8 |
Date and time for the current locale "%c". | |
#define | DATE_FORMAT_LAST QOF_DATE_FORMAT_CUSTOM |
localtime is available via GDate but there are limitations.
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.
#define DATE_FORMAT_LAST QOF_DATE_FORMAT_CUSTOM |
#define MAX_DATE_BUFFER 256 |
#define MAX_DATE_LENGTH 41 |
#define QOF_DATE_FORMAT_CE 3 |
#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
#define QOF_DATE_FORMAT_ISO 4 |
#define QOF_DATE_FORMAT_ISO8601 6 |
#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
#define QOF_DATE_FORMAT_UK 2 |
#define QOF_DATE_FORMAT_US 1 |
#define QOF_DATE_FORMAT_UTC 5 |
#define qof_date_isleap | ( | year | ) | ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0)) |
#define QOF_DAYS_TO_SEC | ( | x | ) | (x * SECS_PER_DAY) |
#define QOF_HOUR_TO_SEC | ( | x | ) | (x * SECS_PER_HOUR) |
#define QOF_MIN_TO_SEC | ( | x | ) | (x * 60) |
#define QOF_MOD_DATE "qof-dates" |
#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
#define SECS_PER_DAY 86400 |
#define SECS_PER_HOUR 3600 |
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.
typedef gint QofDateFormat |
gboolean qof_date_adddays | ( | QofDate * | qd, | |
gint | days | |||
) |
Add a number of days to a QofDate and normalise.
qd | A valid QofDate. | |
days | Number of days to add - use negative value to subtract. |
Definition at line 991 of file qofdate.c.
00992 { 00993 g_return_val_if_fail (qd, FALSE); 00994 g_return_val_if_fail (qof_date_valid (qd), FALSE); 00995 qd->qd_mday += days; 00996 return qof_date_valid (qd); 00997 }
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.
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. |
Definition at line 1000 of file qofdate.c.
01002 { 01003 g_return_val_if_fail (qd, FALSE); 01004 g_return_val_if_fail (qof_date_valid (qd), FALSE); 01005 qd->qd_mon += months % 12; 01006 qd->qd_year += months / 12; 01007 g_return_val_if_fail (qof_date_valid (qd), FALSE); 01008 if (track_last_day && qof_date_is_last_mday (qd)) 01009 { 01010 qd->qd_mday = qof_date_get_mday (qd->qd_mon, 01011 qd->qd_year); 01012 } 01013 return TRUE; 01014 }
Compare two QofDates
Definition at line 662 of file qofdate.c.
00663 { 00664 if ((!d1) && (!d2)) 00665 return 0; 00666 if (d1 == d2) 00667 return 0; 00668 if (!d1) 00669 return -1; 00670 if (!d2) 00671 return 1; 00672 if (d1->qd_year < d2->qd_year) 00673 return -1; 00674 if (d1->qd_year > d2->qd_year) 00675 return 1; 00676 if (d1->qd_mon < d2->qd_mon) 00677 return -1; 00678 if (d1->qd_mon > d2->qd_mon) 00679 return 1; 00680 if (d1->qd_mday < d2->qd_mday) 00681 return -1; 00682 if (d1->qd_mday > d2->qd_mday) 00683 return 1; 00684 if (d1->qd_hour < d2->qd_hour) 00685 return -1; 00686 if (d1->qd_hour > d2->qd_hour) 00687 return 1; 00688 if (d1->qd_min < d2->qd_min) 00689 return -1; 00690 if (d1->qd_min > d2->qd_min) 00691 return 1; 00692 if (d1->qd_sec < d2->qd_sec) 00693 return -1; 00694 if (d1->qd_sec > d2->qd_sec) 00695 return 1; 00696 if (d1->qd_nanosecs < d2->qd_nanosecs) 00697 return -1; 00698 if (d1->qd_nanosecs > d2->qd_nanosecs) 00699 return 1; 00700 return 0; 00701 }
Check two QofDates for equality
Definition at line 654 of file qofdate.c.
00655 { 00656 if (0 == qof_date_compare (d1, d2)) 00657 return TRUE; 00658 return FALSE; 00659 }
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.
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. |
Definition at line 202 of file qofdate.c.
00203 { 00204 struct tm check; 00205 gint len; 00206 time_t now; 00207 gchar test[MAX_DATE_BUFFER]; 00208 00210 g_return_val_if_fail (QofDateInit, FALSE); 00211 g_return_val_if_fail (str, FALSE); 00212 g_return_val_if_fail (strlen (str) != 0, FALSE); 00213 /* prevent really long strings being passed */ 00214 ENTER (" str=%s", str); 00215 if (strlen (str) > MAX_DATE_LENGTH) 00216 { 00217 LEAVE (" '%s' is too long! Max=%d str_len=%d", 00218 str, MAX_DATE_LENGTH, (gint) strlen (str)); 00219 return FALSE; 00220 } 00221 /* test the incoming string using the current time. */ 00222 now = time (NULL); 00223 test[0] = '\1'; 00224 check = *gmtime_r (&now, &check); 00225 /* need to allow time related formats - 00226 don't use g_date_strftime here. */ 00227 len = strftime (test, (MAX_DATE_BUFFER - 1), str, &check); 00228 if (len == 0 && test[0] != '\0') 00229 { 00230 LEAVE (" strftime could not understand '%s'", str); 00231 return FALSE; 00232 } 00233 len = strlen (test); 00234 if (len > MAX_DATE_LENGTH) 00235 { 00236 LEAVE (" %s creates a string '%s' that is too long!" 00237 " Max=%d str_len=%d", str, test, MAX_DATE_LENGTH, len); 00238 return FALSE; 00239 } 00240 *identifier = g_hash_table_size (DateFormatTable) + 1; 00241 { 00242 QofDateEntry *d = g_new0 (QofDateEntry, 1); 00243 d->format = str; 00244 d->name = str; 00245 d->separator = locale_separator; 00246 d->df = *identifier; 00247 g_hash_table_insert (DateFormatTable, GINT_TO_POINTER (d->df), d); 00248 } 00249 LEAVE (" successful"); 00250 return TRUE; 00251 }
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.
name | Shorthand "name" of this format. |
Definition at line 385 of file qofdate.c.
00386 { 00387 struct iter i; 00388 00389 if (!name) 00390 return -1; 00391 if (0 == safe_strcmp (name, "us")) 00392 return QOF_DATE_FORMAT_US; 00393 if (0 == safe_strcmp (name, "uk")) 00394 return QOF_DATE_FORMAT_UK; 00395 if (0 == safe_strcmp (name, "ce")) 00396 return QOF_DATE_FORMAT_CE; 00397 if (0 == safe_strcmp (name, "utc")) 00398 return QOF_DATE_FORMAT_UTC; 00399 if (0 == safe_strcmp (name, "iso")) 00400 return QOF_DATE_FORMAT_ISO; 00401 if (0 == safe_strcmp (name, "locale")) 00402 return QOF_DATE_FORMAT_LOCALE; 00403 if (0 == safe_strcmp (name, "custom")) 00404 return QOF_DATE_FORMAT_CUSTOM; 00405 i.name = name; 00406 i.df = -1; 00407 g_hash_table_foreach (DateFormatTable, lookup_name, &i); 00408 return i.df; 00409 }
gchar qof_date_format_get_date_separator | ( | QofDateFormat | df | ) |
Return the field separator for the current date format.
Definition at line 325 of file qofdate.c.
00326 { 00327 QofDateEntry *d; 00328 00329 g_return_val_if_fail (QofDateInit, locale_separator); 00330 d = g_hash_table_lookup (DateFormatTable, GINT_TO_POINTER (df)); 00331 if (!d) 00332 { 00333 PERR (" unknown format: '%d'", df); 00334 return locale_separator; 00335 } 00336 return d->separator; 00337 }
const gchar* qof_date_format_get_format | ( | QofDateFormat | df | ) |
Retrieve the strftime format string for a registered date format.
df | The QofDateFormat identifier for the registered date format. |
Definition at line 310 of file qofdate.c.
00311 { 00312 QofDateEntry *d; 00313 00314 g_return_val_if_fail (QofDateInit, NULL); 00315 d = g_hash_table_lookup (DateFormatTable, GINT_TO_POINTER (df)); 00316 if (!d) 00317 { 00318 PERR (" unknown format: '%d'", df); 00319 return NULL; 00320 } 00321 return d->format; 00322 }
gboolean qof_date_format_set_current | ( | QofDateFormat | df | ) |
Selects one registered date format as the current default.
df | QofDateFormat identifier indicating preferred format. |
Definition at line 294 of file qofdate.c.
00295 { 00296 QofDateEntry *d; 00297 00298 g_return_val_if_fail (QofDateInit, FALSE); 00299 d = g_hash_table_lookup (DateFormatTable, GINT_TO_POINTER (df)); 00300 if (!d) 00301 { 00302 PERR (" unknown format: '%d'", df); 00303 return FALSE; 00304 } 00305 dateFormat = d->df; 00306 return TRUE; 00307 }
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.
Definition at line 340 of file qofdate.c.
00341 { 00342 QofDateEntry *d; 00343 00344 g_return_val_if_fail (QofDateInit, FALSE); 00345 if (df < DATE_FORMAT_LAST) 00346 { 00347 DEBUG (" Prevented attempt to override a default format"); 00348 return FALSE; 00349 } 00350 if (g_ascii_isdigit (sep)) 00351 return FALSE; 00352 d = g_hash_table_lookup (DateFormatTable, GINT_TO_POINTER (df)); 00353 if (!d) 00354 { 00355 PERR (" unknown format: '%d'", df); 00356 return FALSE; 00357 } 00358 d->separator = sep; 00359 g_hash_table_insert (DateFormatTable, GINT_TO_POINTER (df), d); 00360 return TRUE; 00361 }
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.
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 |
Definition at line 269 of file qofdate.c.
00270 { 00271 QofDateEntry *d; 00272 00273 g_return_val_if_fail (QofDateInit, FALSE); 00274 if (format <= DATE_FORMAT_LAST) 00275 return FALSE; 00276 d = g_hash_table_lookup (DateFormatTable, GINT_TO_POINTER (format)); 00277 if (!d) 00278 { 00279 PERR (" unknown format: '%d'", format); 00280 return FALSE; 00281 } 00282 d->name = name; 00283 g_hash_table_insert (DateFormatTable, GINT_TO_POINTER (format), d); 00284 return TRUE; 00285 }
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.
format | The QofDateFormat to lookup. |
Definition at line 254 of file qofdate.c.
00255 { 00256 QofDateEntry *d; 00257 00258 g_return_val_if_fail (QofDateInit, NULL); 00259 d = g_hash_table_lookup (DateFormatTable, GINT_TO_POINTER (format)); 00260 if (!d) 00261 { 00262 PERR (" unknown format: '%d'", format); 00263 return NULL; 00264 } 00265 return d->name; 00266 }
void qof_date_free | ( | QofDate * | date | ) |
QofDate* qof_date_from_gdate | ( | const GDate * | gd | ) |
Create a QofDate from a GDate.
A GDate is always within the range of a QofDate.
gd | A valid GDate. |
Definition at line 775 of file qofdate.c.
00776 { 00777 QofDate * qd; 00778 00779 g_return_val_if_fail (g_date_valid (date), NULL); 00780 qd = qof_date_new (); 00781 qd->qd_year = g_date_get_year (date); 00782 qd->qd_mon = g_date_get_month (date); 00783 qd->qd_mday = g_date_get_day (date); 00784 qd = date_normalise (qd); 00785 return qd; 00786 }
Return a QofDate in UTC from a QofTime.
Definition at line 875 of file qofdate.c.
00876 { 00877 QofDate *qd; 00878 gint leap_extra_secs; 00879 00880 /* may not want to create a new time or date - it 00881 complicates memory management. */ 00882 g_return_val_if_fail (qt, NULL); 00883 g_return_val_if_fail (qof_time_is_valid (qt), NULL); 00884 qd = qof_date_new (); 00885 leap_extra_secs = 0; 00886 setenv ("TZ", "GMT", 1); 00887 tzset(); 00888 leap_extra_secs = extract_interval (qt); 00889 qof_date_offset (qt, leap_extra_secs, qd); 00890 qd->qd_nanosecs = qof_time_get_nanosecs (qt); 00891 qd->qd_is_dst = 0; 00892 qd->qd_zone = "GMT"; 00893 qd->qd_gmt_off = 0L; 00894 if (!qof_date_valid(qd)) 00895 return NULL; 00896 return qd; 00897 }
QofDate* qof_date_from_struct_tm | ( | const struct tm * | stm | ) |
Convert a struct tm to a QofDate.
stm | A pointer to a valid struct tm. |
Definition at line 704 of file qofdate.c.
00705 { 00706 QofDate *d; 00707 00708 g_return_val_if_fail (stm, NULL); 00709 d = g_new0 (QofDate, 1); 00710 d->qd_sec = stm->tm_sec; 00711 d->qd_min = stm->tm_min; 00712 d->qd_hour = stm->tm_hour; 00713 d->qd_mday = stm->tm_mday; 00714 d->qd_mon = stm->tm_mon + 1; 00715 d->qd_year = stm->tm_year + 1900; 00716 d->qd_wday = stm->tm_wday; 00717 d->qd_yday = stm->tm_yday; 00718 d->qd_is_dst = stm->tm_isdst; 00719 d->qd_gmt_off = stm->tm_gmtoff; 00720 d->qd_zone = stm->tm_zone; 00721 d->qd_valid = TRUE; 00722 d = date_normalise(d); 00723 return d; 00724 }
QofDate* qof_date_get_current | ( | void | ) |
create a new QofDate for the current date and time.
Definition at line 607 of file qofdate.c.
00608 { 00609 QofTime *qt; 00610 QofDate *qd; 00611 00612 qt = qof_time_get_current (); 00613 qd = qof_date_from_qtime (qt); 00614 qof_time_free (qt); 00615 return qd; 00616 }
guint8 qof_date_get_mday | ( | gint | month, | |
gint64 | year | |||
) |
full range version of g_date_get_days_in_month
month | Any valid QofDate qd_mon, 1 to 12. | |
year | Any valid QofDate qd_year. |
Definition at line 183 of file qofdate.c.
00184 { 00185 g_return_val_if_fail (month != 0, 0); 00186 g_return_val_if_fail (month <= 12, 0); 00187 g_return_val_if_fail (month >= 1, 0); 00188 g_return_val_if_fail (year != 0, 0); 00189 return days_in_months[qof_date_isleap (year)][month]; 00190 }
guint16 qof_date_get_yday | ( | gint | mday, | |
gint | month, | |||
gint64 | year | |||
) |
full range version of g_date_get_day_of_year
mday | Any valid QofDate qd_mday, 1 to 31. | |
month | Any valid QofDate qd_mon, 1 to 12. | |
year | Any valid QofDate qd_year. |
Definition at line 167 of file qofdate.c.
00168 { 00169 guint8 leap; 00170 00171 g_return_val_if_fail (mday != 0, 0); 00172 g_return_val_if_fail (month != 0, 0); 00173 g_return_val_if_fail (month <= 12, 0); 00174 g_return_val_if_fail (month >= 1, 0); 00175 g_return_val_if_fail (year != 0, 0); 00176 leap = qof_date_isleap (year); 00177 g_return_val_if_fail (mday <= 00178 qof_date_get_mday (month, year), 0); 00179 return days_in_year[leap][month] + mday; 00180 }
gboolean qof_date_is_last_mday | ( | const QofDate * | qd | ) |
Checks if QofDate the last day of the month.
qd | A valid QofDate. |
Definition at line 193 of file qofdate.c.
00194 { 00195 g_return_val_if_fail (qd, FALSE); 00196 g_return_val_if_fail (qd->qd_valid, FALSE); 00197 return (qd->qd_mday == 00198 qof_date_get_mday (qd->qd_mon, qd->qd_year)); 00199 }
QofDate* qof_date_new | ( | void | ) |
QofDate* qof_date_new_dmy | ( | gint | day, | |
gint | month, | |||
gint64 | year | |||
) |
create a new QofDate from basic calendar data.
Definition at line 619 of file qofdate.c.
00620 { 00621 QofDate *qd; 00622 00623 qd = g_new0 (QofDate, 1); 00624 qd->qd_mday = day; 00625 qd->qd_mon = month; 00626 qd->qd_year = year; 00627 if(!qof_date_valid (qd)) 00628 return NULL; 00629 return qd; 00630 }
QofDate* qof_date_parse | ( | const gchar * | str, | |
QofDateFormat | df | |||
) |
Convert a timestamp to a QofTime.
Safe for all dates within the range of QofDate.
str | a timestamp created with one of the registered QofDateFormat formats. | |
df | The registered QofDateFormat that produced the string. |
Definition at line 549 of file qofdate.c.
00550 { 00551 const gchar *format; 00552 QofDateError error; 00553 QofDate *date; 00554 gchar *check; 00555 00556 check = NULL; 00557 error = ERR_NO_ERROR; 00558 date = qof_date_new (); 00559 format = qof_date_format_get_format (df); 00560 check = strptime_internal (str, format, date, &error); 00561 if (error != ERR_NO_ERROR) 00562 { 00563 qof_date_free (date); 00564 return NULL; 00565 } 00566 00567 date = date_normalise (date); 00568 return date; 00569 }
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.
date | A valid QofDate. | |
df | a registered QofDateFormat to use to create the string. |
Definition at line 572 of file qofdate.c.
00573 { 00574 size_t result; 00575 gchar temp[MAX_DATE_BUFFER]; 00576 QofDateEntry *d; 00577 00578 g_return_val_if_fail (QofDateInit, NULL); 00579 g_return_val_if_fail (date, NULL); 00580 g_return_val_if_fail (date->qd_valid, NULL); 00581 d = g_hash_table_lookup (DateFormatTable, 00582 GINT_TO_POINTER (df)); 00583 g_return_val_if_fail (d, NULL); 00584 temp[0] = '\1'; 00585 result = strftime_case (FALSE, temp, MAX_DATE_BUFFER, 00586 d->format, date, 1, date->qd_nanosecs); 00587 if (result == 0 && temp[0] != '\0') 00588 { 00589 PERR (" qof extended strftime failed"); 00590 return NULL; 00591 } 00592 return g_strndup(temp, result); 00593 }
Calculate the QofTime between two QofDates
Definition at line 950 of file qofdate.c.
00952 { 00953 gint64 days; 00954 QofTime *secs; 00955 00956 secs = qof_time_new (); 00957 days = days_between (date1->qd_year, date2->qd_year); 00958 qof_time_add_secs(secs, QOF_DAYS_TO_SEC(days)); 00959 if (days >= 0) 00960 { 00961 /* positive value, add date2 secs, subtract date1 */ 00962 qof_time_add_secs(secs, -1 * 00963 (QOF_HOUR_TO_SEC(date1->qd_hour) - 00964 QOF_MIN_TO_SEC(date1->qd_min) - 00965 (date1->qd_sec))); 00966 qof_time_add_secs(secs, 00967 QOF_HOUR_TO_SEC(date2->qd_hour) + 00968 QOF_MIN_TO_SEC(date2->qd_min) + 00969 (date2->qd_sec)); 00970 qof_time_set_nanosecs(secs, 00971 (date1->qd_nanosecs - date2->qd_nanosecs)); 00972 } 00973 if (days < 0) 00974 { 00975 /* negative value*/ 00976 qof_time_add_secs (secs, 00977 QOF_HOUR_TO_SEC(date1->qd_hour) - 00978 QOF_MIN_TO_SEC(date1->qd_min) - 00979 (date1->qd_sec)); 00980 qof_time_add_secs (secs, -1 * 00981 (QOF_HOUR_TO_SEC(date2->qd_hour) + 00982 QOF_MIN_TO_SEC(date2->qd_min) + 00983 (date2->qd_sec))); 00984 qof_time_set_nanosecs(secs, 00985 (date2->qd_nanosecs - date1->qd_nanosecs)); 00986 } 00987 return secs; 00988 }
gboolean qof_date_to_gdate | ( | const QofDate * | qd, | |
GDate * | gd | |||
) |
Convert a QofDate to a GDate.
qd | a valid QofDate | |
gd | a new GDate to store the converted value. |
Definition at line 755 of file qofdate.c.
00756 { 00757 g_return_val_if_fail (qd, FALSE); 00758 g_return_val_if_fail (gd, FALSE); 00759 g_return_val_if_fail (qd->qd_valid, FALSE); 00760 if (qd->qd_year >= G_MAXUINT16) 00761 { 00762 PERR (" QofDate out of range of GDate"); 00763 return FALSE; 00764 } 00765 if (!g_date_valid_dmy (qd->qd_mday, qd->qd_mon, qd->qd_year)) 00766 { 00767 PERR (" GDate failed to allow day, month and/or year"); 00768 return FALSE; 00769 } 00770 g_date_set_dmy (gd, qd->qd_mday, qd->qd_mon, qd->qd_year); 00771 return TRUE; 00772 }
Return a valid QofTime from a valid QofDate.
Definition at line 917 of file qofdate.c.
00918 { 00919 QofTime *qt; 00920 QofTimeSecs c; 00921 00922 g_return_val_if_fail (qd, NULL); 00923 g_return_val_if_fail (qd->qd_valid, NULL); 00924 c = 0; 00925 qt = NULL; 00926 if (qd->qd_year < 1970) 00927 { 00928 c = qd->qd_sec; 00929 c += QOF_MIN_TO_SEC(qd->qd_min); 00930 c += QOF_HOUR_TO_SEC(qd->qd_hour); 00931 c += QOF_DAYS_TO_SEC(qd->qd_yday); 00932 c -= QOF_DAYS_TO_SEC(days_between (1970, qd->qd_year)); 00933 c -= qd->qd_gmt_off; 00934 qt = qof_time_set (c, qd->qd_nanosecs); 00935 } 00936 if (qd->qd_year >= 1970) 00937 { 00938 c = qd->qd_sec; 00939 c += QOF_MIN_TO_SEC(qd->qd_min); 00940 c += QOF_HOUR_TO_SEC(qd->qd_hour); 00941 c += QOF_DAYS_TO_SEC(qd->qd_yday); 00942 c += QOF_DAYS_TO_SEC(days_between (1970, qd->qd_year)); 00943 c -= qd->qd_gmt_off; 00944 qt = qof_time_set (c, qd->qd_nanosecs); 00945 } 00946 return qt; 00947 }
gboolean qof_date_to_struct_tm | ( | const QofDate * | qt, | |
struct tm * | stm, | |||
glong * | nanosecs | |||
) |
Convert a QofDate to a struct tm.
qt | A valid QofDate. | |
stm | Pointer to a struct tm to store the result. | |
nanosecs | Pointer to a glong to store the nanoseconds. |
Definition at line 727 of file qofdate.c.
00729 { 00730 g_return_val_if_fail (qd, FALSE); 00731 g_return_val_if_fail (stm, FALSE); 00732 g_return_val_if_fail (qd->qd_valid, FALSE); 00733 if ((qd->qd_year > G_MAXINT) || (qd->qd_year < 1900)) 00734 { 00735 PERR (" date too large for struct tm"); 00736 return FALSE; 00737 } 00738 stm->tm_sec = qd->qd_sec; 00739 stm->tm_min = qd->qd_min; 00740 stm->tm_hour = qd->qd_hour; 00741 stm->tm_mday = qd->qd_mday; 00742 stm->tm_mon = qd->qd_mon - 1; 00743 stm->tm_year = qd->qd_year - 1900; 00744 stm->tm_wday = qd->qd_wday; 00745 stm->tm_yday = qd->qd_yday; 00746 stm->tm_isdst = qd->qd_is_dst; 00747 stm->tm_gmtoff = qd->qd_gmt_off; 00748 stm->tm_zone = qd->qd_zone; 00749 if (nanosecs != NULL) 00750 *nanosecs = qd->qd_nanosecs; 00751 return TRUE; 00752 }
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:
Definition at line 641 of file qofdate.c.
00642 { 00643 g_return_val_if_fail (date, FALSE); 00644 date = date_normalise (date); 00645 if (date->qd_valid == FALSE) 00646 { 00647 PERR (" unknown QofDate error"); 00648 return FALSE; 00649 } 00650 return TRUE; 00651 }