00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "config.h"
00025 #include <glib.h>
00026 #include <time.h>
00027
00028 #include "gnc-gdate-utils.h"
00029
00030
00031 gboolean
00032 gnc_gdate_equal(gconstpointer gda, gconstpointer gdb)
00033 {
00034 return (g_date_compare( (GDate*)gda, (GDate*)gdb ) == 0 ? TRUE : FALSE);
00035 }
00036
00037 guint
00038 gnc_gdate_hash( gconstpointer gd )
00039 {
00040 gint val = (g_date_get_year( (GDate*)gd ) * 10000)
00041 + (g_date_get_month( (GDate*)gd ) * 100)
00042 + g_date_get_day( (GDate*)gd );
00043 return g_int_hash( &val );
00044 }
00045
00046
00047 time_t
00048 gnc_timet_get_day_start_gdate (GDate *date)
00049 {
00050 struct tm stm;
00051 time_t secs;
00052
00053
00054 g_date_to_struct_tm(date, &stm);
00055
00056
00057 secs = mktime (&stm);
00058 return secs;
00059 }
00060
00061 time_t
00062 gnc_timet_get_day_end_gdate (GDate *date)
00063 {
00064 struct tm stm;
00065 time_t secs;
00066
00067
00068 g_date_to_struct_tm(date, &stm);
00069
00070
00071 stm.tm_hour = 23;
00072 stm.tm_min = 59;
00073 stm.tm_sec = 59;
00074 stm.tm_isdst = -1;
00075
00076
00077 secs = mktime (&stm);
00078 return secs;
00079 }
00080
00081
00082 void
00083 gnc_gdate_set_month_start (GDate *date)
00084 {
00085 g_date_set_day(date, 1);
00086 }
00087
00088
00096 void
00097 gnc_gdate_set_month_end (GDate *date)
00098 {
00099
00100 g_date_set_day(date, 1);
00101 g_date_add_months(date, 1);
00102
00103
00104 g_date_subtract_days(date, 1);
00105 }
00106
00107
00115 void
00116 gnc_gdate_set_prev_month_start (GDate *date)
00117 {
00118 g_date_set_day(date, 1);
00119 g_date_subtract_months(date, 1);
00120 }
00121
00122
00130 void
00131 gnc_gdate_set_prev_month_end (GDate *date)
00132 {
00133
00134 g_date_set_day(date, 1);
00135 g_date_subtract_days(date, 1);
00136 }
00137
00138
00139
00140 void
00141 gnc_gdate_set_quarter_start (GDate *date)
00142 {
00143 gint months;
00144
00145
00146 g_date_set_day(date, 1);
00147
00148
00149 months = (g_date_get_month(date) - G_DATE_JANUARY) % 3;
00150 g_date_subtract_months(date, months);
00151 }
00152
00153
00154 void
00155 gnc_gdate_set_quarter_end (GDate *date)
00156 {
00157 gint months;
00158
00159
00160 g_date_set_day(date, 1);
00161
00162
00163 months = (g_date_get_month(date) - G_DATE_JANUARY) % 3;
00164 g_date_add_months(date, 3 - months);
00165
00166
00167 g_date_subtract_days(date, 1);
00168 }
00169
00170
00171 void
00172 gnc_gdate_set_prev_quarter_start (GDate *date)
00173 {
00174 gnc_gdate_set_quarter_start(date);
00175 g_date_subtract_months(date, 3);
00176 }
00177
00178
00179 void
00180 gnc_gdate_set_prev_quarter_end (GDate *date)
00181 {
00182 gnc_gdate_set_quarter_end(date);
00183 g_date_subtract_months(date, 3);
00184 }
00185
00186
00187
00188 void
00189 gnc_gdate_set_year_start (GDate *date)
00190 {
00191 g_date_set_month(date, G_DATE_JANUARY);
00192 g_date_set_day(date, 1);
00193 }
00194
00195
00196 void
00197 gnc_gdate_set_year_end (GDate *date)
00198 {
00199 g_date_set_month(date, G_DATE_DECEMBER);
00200 g_date_set_day(date, 31);
00201 }
00202
00203
00204 void
00205 gnc_gdate_set_prev_year_start (GDate *date)
00206 {
00207 gnc_gdate_set_year_start(date);
00208 g_date_subtract_years(date, 1);
00209 }
00210
00211
00212 void
00213 gnc_gdate_set_prev_year_end (GDate *date)
00214 {
00215 gnc_gdate_set_year_end(date);
00216 g_date_subtract_years(date, 1);
00217 }
00218
00219
00220
00221 void
00222 gnc_gdate_set_fiscal_year_start (GDate *date,
00223 const GDate *fy_end)
00224 {
00225 GDate temp;
00226 gboolean new_fy;
00227
00228 g_return_if_fail(date);
00229 g_return_if_fail(fy_end);
00230
00231
00232 temp = *fy_end;
00233 g_date_set_year(&temp, g_date_get_year(date));
00234
00235
00236 new_fy = (g_date_compare(date, &temp) > 0);
00237
00238
00239 *date = temp;
00240 g_date_add_days(date, 1);
00241 if (!new_fy)
00242 g_date_subtract_years(date, 1);
00243 }
00244
00245 void
00246 gnc_gdate_set_fiscal_year_end (GDate *date,
00247 const GDate *fy_end)
00248 {
00249 GDate temp;
00250 gboolean new_fy;
00251
00252 g_return_if_fail(date);
00253 g_return_if_fail(fy_end);
00254
00255
00256 temp = *fy_end;
00257 g_date_set_year(&temp, g_date_get_year(date));
00258
00259
00260 new_fy = (g_date_compare(date, &temp) > 0);
00261
00262
00263 *date = temp;
00264 if (new_fy)
00265 g_date_add_years(date, 1);
00266 }
00267
00268 void
00269 gnc_gdate_set_prev_fiscal_year_start (GDate *date,
00270 const GDate *fy_end)
00271 {
00272 g_return_if_fail(date);
00273 g_return_if_fail(fy_end);
00274
00275 gnc_gdate_set_fiscal_year_start(date, fy_end);
00276 g_date_subtract_years(date, 1);
00277 }
00278
00279 void
00280 gnc_gdate_set_prev_fiscal_year_end (GDate *date,
00281 const GDate *fy_end)
00282 {
00283 g_return_if_fail(date);
00284 g_return_if_fail(fy_end);
00285
00286 gnc_gdate_set_fiscal_year_end(date, fy_end);
00287 g_date_subtract_years(date, 1);
00288 }