gint g_date_compare (GDate *lhs, GDate *rhs) { g_return_val_if_fail (lhs != NULL, 0); g_return_val_if_fail (rhs != NULL, 0); g_return_val_if_fail (g_date_valid (lhs), 0); g_return_val_if_fail (g_date_valid (rhs), 0); /* Remember the self-comparison case! I think it works right now. */ while (TRUE) { if (lhs->julian && rhs->julian) { if (lhs->julian_days < rhs->julian_days) return -1; else if (lhs->julian_days > rhs->julian_days) return 1; else return 0; } else if (lhs->dmy && rhs->dmy) { if (lhs->year < rhs->year) return -1; else if (lhs->year > rhs->year) return 1; else { if (lhs->month < rhs->month) return -1; else if (lhs->month > rhs->month) return 1; else { if (lhs->day < rhs->day) return -1; else if (lhs->day > rhs->day) return 1; else return 0; } } } else { if (!lhs->julian) g_date_update_julian (lhs); if (!rhs->julian) g_date_update_julian (rhs); g_return_val_if_fail (lhs->julian, 0); g_return_val_if_fail (rhs->julian, 0); } } return 0; /* warnings */ }
guint32 g_date_get_julian (const GDate *d) { g_return_val_if_fail (g_date_valid (d), G_DATE_BAD_JULIAN); if (!d->julian) g_date_update_julian (d); g_return_val_if_fail (d->julian, G_DATE_BAD_JULIAN); return d->julian_days; }
GDateWeekday g_date_get_weekday (const GDate *d) { g_return_val_if_fail (g_date_valid (d), G_DATE_BAD_WEEKDAY); if (!d->julian) g_date_update_julian (d); g_return_val_if_fail (d->julian, G_DATE_BAD_WEEKDAY); return ((d->julian_days - 1) % 7) + 1; }
void g_date_add_days (GDate *d, guint ndays) { g_return_if_fail (g_date_valid (d)); if (!d->julian) g_date_update_julian (d); g_return_if_fail (d->julian); d->julian_days += ndays; d->dmy = FALSE; }
guint32 g_date_julian (GDate *d) { g_return_val_if_fail (d != NULL, G_DATE_BAD_JULIAN); g_return_val_if_fail (g_date_valid (d), G_DATE_BAD_JULIAN); if (!d->julian) { g_date_update_julian (d); } g_return_val_if_fail (d->julian, G_DATE_BAD_JULIAN); return d->julian_days; }
void g_date_subtract_days (GDate *d, guint ndays) { g_return_if_fail (d != NULL); g_return_if_fail (g_date_valid (d)); if (!d->julian) { g_date_update_julian (d); } g_return_if_fail (d->julian); g_return_if_fail (d->julian_days > ndays); d->julian_days -= ndays; d->dmy = FALSE; }
/** * g_date_get_iso8601_week_of_year: * @date: a valid #GDate * * Returns the week of the year, where weeks are interpreted according * to ISO 8601. * * Returns: ISO 8601 week number of the year. * * Since: 2.6 **/ guint g_date_get_iso8601_week_of_year (const GDate *d) { guint j, d4, L, d1, w; g_return_val_if_fail (g_date_valid (d), 0); if (!d->julian) g_date_update_julian (d); g_return_val_if_fail (d->julian, 0); /* Formula taken from the Calendar FAQ; the formula was for the * Julian Period which starts on 1 January 4713 BC, so we add * 1,721,425 to the number of days before doing the formula. */ j = d->julian_days + 1721425; d4 = (j + 31741 - (j % 7)) % 146097 % 36524 % 1461; L = d4 / 1460; d1 = ((d4 - L) % 365) + L; w = d1 / 7 + 1; return w; }