GRASS 8 Programmer's Manual  8.5.0dev(2025)-c070206eb1
local.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 1995. Bill Brown <brown@gis.uiuc.edu> & Michael Shapiro
3  *
4  * This program is free software under the GPL (>=v2)
5  * Read the file GPL.TXT coming with GRASS for details.
6  */
7 #include <time.h>
8 #include <grass/datetime.h>
9 
10 /*
11  ** NOTE: the extern variable "timezone" seems to be treated
12  ** differently by different OS, and the tm_zone element of struct tm
13  ** is missing in some OS (IRIX), so we're converting localtime() and
14  ** gmtime() structures to datetimes, then doing a difference to get the
15  ** timezone offset. -Bill Brown 5/31/95
16  */
17 
18 /*!
19  * \brief
20  *
21  * Returns:
22  * 0 OK
23  * -1 local timezone info not available
24  *
25  * \param minutes
26  * \return int
27  */
28 int datetime_get_local_timezone(int *minutes)
29 {
30  struct tm *local, *gm;
31  time_t clock;
32  DateTime dtl, dtg, dtdiff;
33 
34  time(&clock);
35 
36  local = localtime(&clock);
37 
39  0);
40 
41  /* now put current {year,month,day,hour,minute,second} into local */
42  datetime_set_year(&dtl, (int)local->tm_year + 1900);
43  datetime_set_month(&dtl, (int)local->tm_mon + 1);
44  datetime_set_day(&dtl, (int)local->tm_mday);
45  datetime_set_hour(&dtl, (int)local->tm_hour);
46  datetime_set_minute(&dtl, (int)local->tm_min);
47  datetime_set_second(&dtl, (double)local->tm_sec);
48 
49  gm = gmtime(&clock);
50 
52  0);
53 
54  /* now put current {year,month,day,hour,minute,second} into gmt */
55  datetime_set_year(&dtg, (int)gm->tm_year + 1900);
56  datetime_set_month(&dtg, (int)gm->tm_mon + 1);
57  datetime_set_day(&dtg, (int)gm->tm_mday);
58  datetime_set_hour(&dtg, (int)gm->tm_hour);
59  datetime_set_minute(&dtg, (int)gm->tm_min);
60  datetime_set_second(&dtg, (double)gm->tm_sec);
61 
63  0);
64  datetime_difference(&dtl, &dtg, &dtdiff);
66 
67  *minutes = dtdiff.positive ? dtdiff.minute : -dtdiff.minute;
68  return 0;
69 }
70 
71 /*!
72  * \brief
73  *
74  * set mode/from/to ABSOLUTE/YEAR/SECOND
75  * set the local time into 'dt' does not set timezone.
76  *
77  * \param dt
78  * \return void
79  */
81 {
82  time_t clock;
83  struct tm *local;
84 
85  /* first set dt to absolute full date */
87 
88  /* get the current date/time */
89  time(&clock);
90  local = localtime(&clock);
91 
92  /* now put current {year,month,day,hour,minute,second} into dt */
93  datetime_set_year(dt, (int)local->tm_year + 1900);
94  datetime_set_month(dt, (int)local->tm_mon + 1);
95  datetime_set_day(dt, (int)local->tm_mday);
96  datetime_set_hour(dt, (int)local->tm_hour);
97  datetime_set_minute(dt, (int)local->tm_min);
98  datetime_set_second(dt, (double)local->tm_sec);
99 }
#define DATETIME_ABSOLUTE
Definition: datetime.h:4
#define DATETIME_DAY
Definition: datetime.h:12
#define DATETIME_SECOND
Definition: datetime.h:15
#define DATETIME_MINUTE
Definition: datetime.h:14
#define DATETIME_RELATIVE
Definition: datetime.h:5
#define DATETIME_YEAR
Definition: datetime.h:10
int datetime_difference(const DateTime *a, const DateTime *b, DateTime *result)
This performs the formula: result = a - b;.
Definition: diff.c:78
int datetime_set_day(DateTime *dt, int day)
if dt.mode = ABSOLUTE, then the dt.year, dt.month:
Definition: values.c:327
int datetime_set_month(DateTime *dt, int month)
if dt.mode = ABSOLUTE, this also sets dt.day = 0
Definition: values.c:277
int datetime_set_type(DateTime *dt, int mode, int from, int to, int fracsec)
Definition: datetime/type.c:36
int datetime_set_hour(DateTime *dt, int hour)
returns 0 on success or negative value on error
Definition: values.c:367
int datetime_set_year(DateTime *dt, int year)
if dt.mode = ABSOLUTE, this also sets dt.day = 0
Definition: values.c:232
int datetime_set_second(DateTime *dt, double second)
returns 0 on success or negative value on error
Definition: values.c:447
int datetime_change_from_to(DateTime *dt, int from, int to, int round)
Changes the from/to of the type for dt. The 'from/to' must be legal values for the mode of dt; (if th...
Definition: change.c:53
int datetime_set_minute(DateTime *dt, int minute)
returns 0 on success or negative value on error
Definition: values.c:407
void datetime_get_local_time(DateTime *dt)
set mode/from/to ABSOLUTE/YEAR/SECOND set the local time into 'dt' does not set timezone.
Definition: local.c:80
int datetime_get_local_timezone(int *minutes)
Returns: 0 OK -1 local timezone info not available.
Definition: local.c:28
int positive
Definition: datetime.h:24
int minute
Definition: datetime.h:22