Consolidate all the functions that convert time values to be the

beginning, middle, or end of a day.


git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@8088 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
David Hampton
2003-03-16 22:48:27 +00:00
parent 1b90a6d09c
commit d417ccb041
11 changed files with 196 additions and 201 deletions

View File

@@ -1,3 +1,18 @@
2003-03-16 David Hampton <hampton@employees.org>
* src/business/business-ledger/gncEntryLedgerLoad.c:
* src/engine/date.c:
* src/engine/date.h:
* src/gnome/gnc-split-reg.c:
* src/gnome/window-register.c:
* src/gnome-utils/gnc-date-edit.c:
* src/register/ledger-core/gnc-ledger-display.c:
* src/register/ledger-core/split-register-load.c:
* src/register/ledger-core/split-register-util.c:
* src/register/register-gnome/datecell-gnome.c:
Consolidate all the functions that convert time values to be the
beginning, middle, or end of a day.
2003-03-15 David Hampton <hampton@employees.org> 2003-03-15 David Hampton <hampton@employees.org>
* src/gnome-utils/gnc-date-edit.c: Fix the keypress handlers so * src/gnome-utils/gnc-date-edit.c: Fix the keypress handlers so

View File

@@ -409,20 +409,7 @@ void gnc_entry_ledger_load (GncEntryLedger *ledger, GList *entry_list)
vcell_loc.virt_row++; vcell_loc.virt_row++;
/* get the current time and reset the dividing row */ /* get the current time and reset the dividing row */
{ present = gnc_timet_get_today_end ();
struct tm *tm;
present = time (NULL);
tm = localtime (&present);
tm->tm_sec = 59;
tm->tm_min = 59;
tm->tm_hour = 23;
tm->tm_isdst = -1;
present = mktime (tm);
}
table->model->dividing_row = -1; table->model->dividing_row = -1;
cursor = gnc_table_layout_get_cursor (table->layout, "cursor"); cursor = gnc_table_layout_get_cursor (table->layout, "cursor");

View File

@@ -161,10 +161,7 @@ timespecCanonicalDayTime(Timespec t)
time_t t_secs = t.tv_sec + (t.tv_nsec / NANOS_PER_SECOND); time_t t_secs = t.tv_sec + (t.tv_nsec / NANOS_PER_SECOND);
result = localtime(&t_secs); result = localtime(&t_secs);
tm = *result; tm = *result;
tm.tm_sec = 0; gnc_tm_set_day_middle(&tm);
tm.tm_min = 0;
tm.tm_hour = 12;
tm.tm_isdst = -1;
retval.tv_sec = mktime(&tm); retval.tv_sec = mktime(&tm);
retval.tv_nsec = 0; retval.tv_nsec = 0;
return retval; return retval;
@@ -375,11 +372,8 @@ printDate (char * buff, int day, int month, int year)
tm_str.tm_mon = month - 1; /* tm_mon = 0 through 11 */ tm_str.tm_mon = month - 1; /* tm_mon = 0 through 11 */
tm_str.tm_year = year - 1900; /* this is what the standard tm_str.tm_year = year - 1900; /* this is what the standard
* says, it's not a Y2K thing */ * says, it's not a Y2K thing */
tm_str.tm_hour = 0;
tm_str.tm_min = 0;
tm_str.tm_sec = 0;
tm_str.tm_isdst = -1;
gnc_tm_set_day_start (&tm_str);
strftime (buff, MAX_DATE_LENGTH, GNC_D_FMT, &tm_str); strftime (buff, MAX_DATE_LENGTH, GNC_D_FMT, &tm_str);
} }
break; break;
@@ -849,10 +843,7 @@ xaccDMYToSec (int day, int month, int year)
stm.tm_year = year - 1900; stm.tm_year = year - 1900;
stm.tm_mon = month - 1; stm.tm_mon = month - 1;
stm.tm_mday = day; stm.tm_mday = day;
stm.tm_hour = 0; gnc_tm_set_day_start(&stm);
stm.tm_min = 0;
stm.tm_sec = 0;
stm.tm_isdst = -1;
/* compute number of seconds */ /* compute number of seconds */
secs = mktime (&stm); secs = mktime (&stm);
@@ -897,19 +888,9 @@ gnc_dmy2timespec_internal (int day, int month, int year, gboolean start_of_day)
date.tm_mday = day; date.tm_mday = day;
if (start_of_day) if (start_of_day)
{ gnc_tm_set_day_start(&date);
date.tm_hour = 0;
date.tm_min = 0;
date.tm_sec = 0;
}
else else
{ gnc_tm_set_day_end(&date);
date.tm_hour = 23;
date.tm_min = 59;
date.tm_sec = 59;
}
date.tm_isdst = -1;
/* compute number of seconds */ /* compute number of seconds */
secs = mktime (&date); secs = mktime (&date);
@@ -968,5 +949,69 @@ timespecToTime_t (Timespec ts)
return ts.tv_sec; return ts.tv_sec;
} }
void
gnc_tm_get_day_start (struct tm *tm, time_t time_val)
{
/* Get the equivalent time structure */
tm = localtime_r(&time_val, tm);
gnc_tm_set_day_start(tm);
}
void
gnc_tm_get_day_end (struct tm *tm, time_t time_val)
{
/* Get the equivalent time structure */
tm = localtime_r(&time_val, tm);
gnc_tm_set_day_end(tm);
}
time_t
gnc_timet_get_day_start (time_t time_val)
{
struct tm tm;
gnc_tm_get_day_start(&tm, time_val);
return mktime(&tm);
}
time_t
gnc_timet_get_day_end (time_t time_val)
{
struct tm tm;
gnc_tm_get_day_end(&tm, time_val);
return mktime(&tm);
}
void
gnc_tm_get_today_start (struct tm *tm)
{
gnc_tm_get_day_start(tm, time(NULL));
}
void
gnc_tm_get_today_end (struct tm *tm)
{
gnc_tm_get_day_end(tm, time(NULL));
}
time_t
gnc_timet_get_today_start (void)
{
struct tm tm;
gnc_tm_get_day_start(&tm, time(NULL));
return mktime(&tm);
}
time_t
gnc_timet_get_today_end (void)
{
struct tm tm;
gnc_tm_get_day_end(&tm, time(NULL));
return mktime(&tm);
}
/********************** END OF FILE *********************************\ /********************** END OF FILE *********************************\
\********************************************************************/ \********************************************************************/

View File

@@ -28,6 +28,14 @@
* If a file-io thing needs date handling, it should do it itself, * If a file-io thing needs date handling, it should do it itself,
* instead of depending on the routines here. */ * instead of depending on the routines here. */
/** @addtogroup Date
@{ */
/** @file date.h
@brief Date handling routines
@author Copyright (C) 1997 Robin D. Clark
@author Copyright (C) 1999,1999,2000 Linas Vepstas <linas@linas.org>
*/
#ifndef XACC_DATE_H #ifndef XACC_DATE_H
#define XACC_DATE_H #define XACC_DATE_H
@@ -237,4 +245,87 @@ char * gnc_timespec_to_iso8601_buff (Timespec ts, char * buff);
*/ */
long int gnc_timezone (struct tm *tm); long int gnc_timezone (struct tm *tm);
/** @name Date Start/End Adjustment routines
* Given a time value, adjust it to be the beginning or end of that day.
*/
/** @{ */
/** The gnc_tm_set_day_start() inline routine will set the appropriate
* fields in the struct tm to indicate the first second of that day.
* This routine assumes that the contents of the data structure is
* already in normalized form. */
static inline
void gnc_tm_set_day_start (struct tm *tm)
{
/* First second of the day */
tm->tm_hour = 0;
tm->tm_min = 0;
tm->tm_sec = 0;
tm->tm_isdst = -1;
}
/** The gnc_tm_set_day_start() inline routine will set the appropriate
* fields in the struct tm to indicate noon of that day. This
* routine assumes that the contents of the data structure is already
* in normalized form.*/
static inline
void gnc_tm_set_day_middle (struct tm *tm)
{
/* First second of the day */
tm->tm_hour = 12;
tm->tm_min = 0;
tm->tm_sec = 0;
tm->tm_isdst = -1;
}
/** The gnc_tm_set_day_start() inline routine will set the appropriate
* fields in the struct tm to indicate the last second of that day.
* This routine assumes that the contents of the data structure is
* already in normalized form.*/
static inline
void gnc_tm_set_day_end (struct tm *tm)
{
/* Last second of the day */
tm->tm_hour = 23;
tm->tm_min = 59;
tm->tm_sec = 59;
tm->tm_isdst = -1;
}
/** The gnc_tm_get_day_start() routine will convert the given time in
* seconds to the struct tm format, and then adjust it to the
* first second of that day. */
void gnc_tm_get_day_start(struct tm *tm, time_t time_val);
/** The gnc_tm_get_day_end() routine will convert the given time in
* seconds to the struct tm format, and then adjust it to the
* last second of that day. */
void gnc_tm_get_day_end(struct tm *tm, time_t time_val);
/** The gnc_timet_get_day_start() routine will take the given time in
* seconds and first it to the last second of that day. */
time_t gnc_timet_get_day_start(time_t time_val);
/** The gnc_timet_get_day_end() routine will take the given time in
* seconds and adjust it to the last second of that day. */
time_t gnc_timet_get_day_end(time_t time_val);
/** The gnc_tm_get_today_start() routine takes a pointer to a struct
* tm and fills it in with the first second of the today. */
void gnc_tm_get_today_start(struct tm *tm);
/** The gnc_tm_get_today_end() routine takes a pointer to a struct
* tm and fills it in with the last second of the today. */
void gnc_tm_get_today_end(struct tm *tm);
/** The gnc_timet_get_today_start() routine returns a time_t value
* corresponding to the first second of today. */
time_t gnc_timet_get_today_start(void);
/** The gnc_timet_get_today_end() routine returns a time_t value
* corresponding to the last second of today. */
time_t gnc_timet_get_today_end(void);
/** @} */
#endif /* XACC_DATE_H */ #endif /* XACC_DATE_H */
/** @} */

View File

@@ -252,21 +252,10 @@ select_clicked (GtkWidget *widget, GNCDateEdit *gde)
if (mtm.tm_year >= 1900) if (mtm.tm_year >= 1900)
mtm.tm_year -= 1900; mtm.tm_year -= 1900;
mtm.tm_sec = 0; gnc_tm_set_day_start(&mtm);
mtm.tm_min = 0;
mtm.tm_hour = 0;
mtm.tm_isdst = -1;
if (mktime (&mtm) == -1) if (mktime (&mtm) == -1)
{ {
time_t secs = time (NULL); gnc_tm_get_today_start (&mtm);
mtm = *localtime (&secs);
mtm.tm_sec = 0;
mtm.tm_min = 0;
mtm.tm_hour = 0;
mtm.tm_isdst = -1;
gnc_date_edit_set_time (gde, mktime (&mtm)); gnc_date_edit_set_time (gde, mktime (&mtm));
} }
@@ -549,16 +538,7 @@ date_accel_key_press(GtkWidget *widget, GdkEventKey *event, gpointer data)
return FALSE; return FALSE;
if (mktime (&tm) == -1) if (mktime (&tm) == -1)
{ gnc_tm_get_today_start (&tm);
time_t secs = time (NULL);
tm = *localtime (&secs);
tm.tm_sec = 0;
tm.tm_min = 0;
tm.tm_hour = 0;
tm.tm_isdst = -1;
}
gnc_date_edit_set_time (gde, mktime (&tm)); gnc_date_edit_set_time (gde, mktime (&tm));
gtk_calendar_select_day (GTK_CALENDAR (gde->calendar), 1); gtk_calendar_select_day (GTK_CALENDAR (gde->calendar), 1);
@@ -796,9 +776,7 @@ gnc_date_edit_get_date_internal (GNCDateEdit *gde)
} }
else else
{ {
tm.tm_hour = 0; gnc_tm_set_day_start(&tm);
tm.tm_min = 0;
tm.tm_sec = 0;
} }
tm.tm_isdst = -1; tm.tm_isdst = -1;
@@ -823,16 +801,7 @@ gnc_date_edit_get_date (GNCDateEdit *gde)
tm = gnc_date_edit_get_date_internal (gde); tm = gnc_date_edit_get_date_internal (gde);
if (mktime (&tm) == -1) if (mktime (&tm) == -1)
{ return gnc_timet_get_today_start();
time_t secs = time (NULL);
tm = *localtime (&secs);
tm.tm_sec = 0;
tm.tm_min = 0;
tm.tm_hour = 0;
tm.tm_isdst = -1;
}
return mktime (&tm); return mktime (&tm);
} }
@@ -862,22 +831,10 @@ gnc_date_edit_get_date_end (GNCDateEdit *gde)
g_return_val_if_fail (GNC_IS_DATE_EDIT (gde), 0); g_return_val_if_fail (GNC_IS_DATE_EDIT (gde), 0);
tm = gnc_date_edit_get_date_internal (gde); tm = gnc_date_edit_get_date_internal (gde);
gnc_tm_set_day_end(&tm);
tm.tm_hour = 23;
tm.tm_min = 59;
tm.tm_sec = 59;
if (mktime (&tm) == -1) if (mktime (&tm) == -1)
{ return gnc_timet_get_today_end();
time_t secs = time (NULL);
tm = *localtime (&secs);
tm.tm_sec = 23;
tm.tm_min = 59;
tm.tm_hour = 59;
tm.tm_isdst = -1;
}
return mktime (&tm); return mktime (&tm);
} }

View File

@@ -2077,19 +2077,11 @@ gsr_account_present_balance (Account *account)
GList *list; GList *list;
GList *node; GList *node;
time_t today; time_t today;
struct tm *tm;
if (!account) if (!account)
return gnc_numeric_zero (); return gnc_numeric_zero ();
today = time (NULL); today = gnc_timet_get_today_end();
tm = localtime (&today);
tm->tm_hour = 23;
tm->tm_min = 59;
tm->tm_sec = 59;
tm->tm_isdst = -1;
today = mktime (tm);
list = xaccAccountGetSplitList (account); list = xaccAccountGetSplitList (account);
for (node = g_list_last (list); node; node = node->prev) for (node = g_list_last (list); node; node = node->prev)
{ {
@@ -2113,21 +2105,13 @@ gsr_account_projectedminimum_balance (Account *account)
GList *list; GList *list;
GList *node; GList *node;
time_t today; time_t today;
struct tm *tm;
gnc_numeric lowest = gnc_numeric_zero (); gnc_numeric lowest = gnc_numeric_zero ();
int seen_a_transaction = 0; int seen_a_transaction = 0;
if (!account) if (!account)
return gnc_numeric_zero (); return gnc_numeric_zero ();
today = time (NULL); today = gnc_timet_get_today_end();
tm = localtime (&today);
tm->tm_hour = 23;
tm->tm_min = 59;
tm->tm_sec = 59;
tm->tm_isdst = -1;
today = mktime (tm);
list = xaccAccountGetSplitList (account); list = xaccAccountGetSplitList (account);
for (node = g_list_last (list); node; node = node->prev) for (node = g_list_last (list); node; node = node->prev)
{ {

View File

@@ -266,38 +266,6 @@ gnc_register_raise (RegWindow *regData)
gtk_window_present( GTK_WINDOW(regData->window) ); gtk_window_present( GTK_WINDOW(regData->window) );
} }
static time_t
gnc_register_min_day_time(time_t time_val)
{
struct tm *time_struct;
/* Get the equivalent time structure */
time_struct = localtime(&time_val);
/* First second of the day */
time_struct->tm_sec = 0;
time_struct->tm_min = 0;
time_struct->tm_hour = 0;
return mktime(time_struct);
}
static time_t
gnc_register_max_day_time(time_t time_val)
{
struct tm *time_struct;
/* Get the equivalent time structure */
time_struct = localtime(&time_val);
/* Last second of the day */
time_struct->tm_sec = 59;
time_struct->tm_min = 59;
time_struct->tm_hour = 23;
return mktime(time_struct);
}
static void static void
gnc_date_range_set_sensitivities(RegWindow *regData) gnc_date_range_set_sensitivities(RegWindow *regData)
{ {
@@ -445,7 +413,7 @@ gnc_register_set_date_range(RegWindow *regData)
time_t start; time_t start;
start = gnc_date_edit_get_date(GNC_DATE_EDIT(regDateData->start_date)); start = gnc_date_edit_get_date(GNC_DATE_EDIT(regDateData->start_date));
start = gnc_register_min_day_time(start); start = gnc_timet_get_day_start(start);
xaccQueryAddDateMatchTT(query, xaccQueryAddDateMatchTT(query,
TRUE, start, TRUE, start,
@@ -459,7 +427,7 @@ gnc_register_set_date_range(RegWindow *regData)
time_t end; time_t end;
end = gnc_date_edit_get_date(GNC_DATE_EDIT(regDateData->end_date)); end = gnc_date_edit_get_date(GNC_DATE_EDIT(regDateData->end_date));
end = gnc_register_max_day_time(end); end = gnc_timet_get_day_end(end);
xaccQueryAddDateMatchTT(query, xaccQueryAddDateMatchTT(query,
FALSE, 0, FALSE, 0,

View File

@@ -418,7 +418,7 @@ gnc_ledger_display_gl (void)
{ {
Query *query; Query *query;
time_t start; time_t start;
struct tm *tm; struct tm tm;
query = xaccMallocQuery (); query = xaccMallocQuery ();
@@ -442,14 +442,9 @@ gnc_ledger_display_gl (void)
tAG = NULL; tAG = NULL;
} }
start = time (NULL); gnc_tm_get_today_start(&tm);
tm = localtime (&start); tm.tm_mon--; /* Default the register to the last month's worth of transactions. */
tm->tm_mon--; start = mktime (&tm);
tm->tm_hour = 0;
tm->tm_min = 0;
tm->tm_sec = 0;
tm->tm_isdst = -1;
start = mktime (tm);
xaccQueryAddDateMatchTT (query, xaccQueryAddDateMatchTT (query,
TRUE, start, TRUE, start,
FALSE, 0, FALSE, 0,

View File

@@ -275,20 +275,7 @@ gnc_split_register_load (SplitRegister *reg, GList * slist,
vcell_loc.virt_row++; vcell_loc.virt_row++;
/* get the current time and reset the dividing row */ /* get the current time and reset the dividing row */
{ present = gnc_timet_get_today_end ();
struct tm *tm;
present = time (NULL);
tm = localtime (&present);
tm->tm_sec = 59;
tm->tm_min = 59;
tm->tm_hour = 23;
tm->tm_isdst = -1;
present = mktime (tm);
}
if (info->first_pass) if (info->first_pass)
{ {
if (default_account) if (default_account)

View File

@@ -34,24 +34,6 @@
static short module = MOD_LEDGER; static short module = MOD_LEDGER;
static time_t
gnc_get_today_midnight (void)
{
time_t present;
struct tm tm;
present = time (NULL);
tm = *localtime (&present);
tm.tm_sec = 0;
tm.tm_min = 0;
tm.tm_hour = 0;
tm.tm_isdst = -1;
return mktime (&tm);
}
/* The routines below create, access, and destroy the SRInfo structure /* The routines below create, access, and destroy the SRInfo structure
* used by SplitLedger routines to store data for a particular register. * used by SplitLedger routines to store data for a particular register.
* This is the only code that should access the user_data member of a * This is the only code that should access the user_data member of a
@@ -72,7 +54,7 @@ gnc_split_register_init_info (SplitRegister *reg)
info->default_account = *xaccGUIDNULL (); info->default_account = *xaccGUIDNULL ();
info->template_account = *xaccGUIDNULL (); info->template_account = *xaccGUIDNULL ();
info->last_date_entered = gnc_get_today_midnight (); info->last_date_entered = gnc_timet_get_today_start ();
info->first_pass = TRUE; info->first_pass = TRUE;
info->full_refresh = TRUE; info->full_refresh = TRUE;

View File

@@ -104,23 +104,10 @@ gnc_parse_date (struct tm *parsed, const char * datestr)
parsed->tm_mday = day; parsed->tm_mday = day;
parsed->tm_mon = month - 1; parsed->tm_mon = month - 1;
parsed->tm_year = year - 1900; parsed->tm_year = year - 1900;
parsed->tm_sec = 0;
parsed->tm_min = 0;
parsed->tm_hour = 0;
parsed->tm_isdst = -1;
gnc_tm_set_day_start(parsed);
if (mktime (parsed) == -1) if (mktime (parsed) == -1)
{ gnc_tm_get_today_start (parsed);
time_t secs = time (NULL);
*parsed = *localtime (&secs);
parsed->tm_sec = 0;
parsed->tm_min = 0;
parsed->tm_hour = 0;
parsed->tm_isdst = -1;
}
mktime (parsed); mktime (parsed);
} }
@@ -351,11 +338,8 @@ gnc_date_cell_set_value (DateCell *cell, int day, int mon, int year)
dada.tm_mday = day; dada.tm_mday = day;
dada.tm_mon = mon - 1; dada.tm_mon = mon - 1;
dada.tm_year = year - 1900; dada.tm_year = year - 1900;
dada.tm_sec = 0;
dada.tm_min = 0;
dada.tm_hour = 0;
dada.tm_isdst = -1;
gnc_tm_set_day_start(&dada);
mktime (&dada); mktime (&dada);
box->date.tm_mday = dada.tm_mday; box->date.tm_mday = dada.tm_mday;