]> pilppa.org Git - lib1wire.git/blob - src/Date.cc
Use pointers in date comparison functions.
[lib1wire.git] / src / Date.cc
1 /*
2  * Date.cc
3  *
4  *  Created on: Dec 7, 2010
5  *      Author: lamikr
6  */
7
8 #include <iostream>
9
10 #include <stdio.h>
11 #include <time.h>
12 #include <malloc.h>
13
14 #include <plp/log.h>
15
16 #include "Date.hh"
17
18 using namespace std;
19 using namespace plp;
20
21 static const int CONST__DAYS_PER_MONTH[]        = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
22
23 Date::Date() {
24         time_t          wtime;
25         struct tm       *ltime;
26
27         time(&wtime);
28         ltime   = localtime(&wtime);
29         year    = 1900 + ltime->tm_year;
30         month   = ltime->tm_mon + 1;    // ltime-month: values 0 - 11...
31         day     = ltime->tm_mday;
32         hour    = ltime->tm_hour;
33         min     = ltime->tm_min;
34         sec     = ltime->tm_sec;
35 }
36
37 Date::Date(int year_param,
38         int month_param,
39         int day_param,
40         int hour_param,
41         int min_param,
42         int sec_param) {
43         year    = year_param;
44         month   = month_param;
45         day     = day_param;
46         hour    = hour_param;
47         min     = min_param;
48         sec     = sec_param;
49 }
50
51 Date::~Date() {
52         // TODO Auto-generated destructor stub
53 }
54
55 bool Date::is_leap_year() {
56         bool    ret_val;
57
58         ret_val = false;
59         if ((year % 4 == 0) &&
60             ((year % 400 == 0) || (year % 100 != 0))) {
61                 ret_val = true;
62         }
63         return ret_val;
64 }
65
66 void Date::printout() {
67         log_debug("%d-%02d-%02d %02d:%02d:%02d\n", year, month, day, hour, min, sec);
68 }
69
70 Date *Date::clone() {
71         Date    *ret_val;
72
73         ret_val = new Date(year,
74                         month,
75                         day,
76                         hour,
77                         min,
78                         sec);
79         return ret_val;
80 }
81
82 void Date::copy(Date *date) {
83         year    = date->year;
84         month   = date->month;
85         day     = date->day;
86         hour    = date->hour;
87         min     = date->min;
88         sec     = date->sec;
89 }
90
91 bool Date::before(Date *date2) {
92         bool    ret_val;
93         string  s1;
94         string  s2;
95
96         ret_val = false;
97         if (date2 != NULL) {
98                 s1      = this->to_sortable_string();
99                 s2      = date2->to_sortable_string();
100                 if (s1.compare(s2) < 0) {
101                         ret_val = true;
102                 }
103         }
104         return ret_val;
105 }
106
107 bool Date::equals(Date *date2) {
108         bool ret_val;
109
110         ret_val = false;
111         if (date2 != NULL) {
112                 if ((this->sec == date2->sec) &&
113                     (this->min == date2->min) &&
114                     (this->hour == date2->hour) &&
115                     (this->day == date2->day) &&
116                     (this->month == date2->month) &&
117                     (this->year == date2->year)) {
118                         ret_val = true;
119                 }
120         }
121         return ret_val;
122 }
123
124 void Date::tomorrow() {
125         if ((month > 0) &&
126             (month <= 12)) {
127                 day++;
128                 if (day > CONST__DAYS_PER_MONTH[month - 1]) {
129                         if ((month == 2) &&
130                             (is_leap_year() == true) &&
131                             (day == 29)) {
132                                 // ok
133                         }
134                         else {
135                                 day     = 1;
136                                 month++;
137                                 if (month == 12) {
138                                         year++;
139                                         month   = 1;
140                                 }
141                         }
142                 }
143         }
144 }
145
146 void Date::next_hour() {
147         if ((hour >= 0) &&
148             (hour <= 24)) {
149                 hour++;
150                 if (hour > 24) {
151                         hour    = 0;
152                         tomorrow();
153                 }
154         }
155 }
156
157 void Date::inc_minutes(int minutes) {
158         int     day_c;
159         int     hour_c;
160         int     ii;
161
162         day_c   = minutes / 1440;
163         minutes = minutes - day_c * 1440;
164         hour_c  = minutes / 60;
165         minutes = minutes - hour_c * 60;
166         for (ii = 0; ii < day_c; ii++) {
167                 tomorrow();
168         }
169         for (ii = 0; ii < hour_c; ii++) {
170                 hour++;
171                 if (hour > 24) {
172                         hour    = 0;
173                         tomorrow();
174                 }
175         }
176         min     = min + minutes;
177         if (min >= 60) {
178                 min     = min % 60;
179                 hour++;
180                 if (hour > 24) {
181                         hour    = 0;
182                         tomorrow();
183                 }
184         }
185 }
186
187 void Date::inc_seconds(int seconds) {
188         int     min_c;
189
190         min_c   = seconds / 60;
191         seconds = seconds - min_c * 60;
192         inc_minutes(min_c);
193         sec     = sec + seconds;
194         if (sec >= 60) {
195                 sec     = sec % 60;
196                 inc_minutes(1);
197         }
198 }
199
200 string Date::to_sortable_string() {
201         char    buffer[30];
202         string  ret_val;
203
204         sprintf(buffer, "%016d%02d%02d%02d%02d%02d", year, month, day, hour, min, sec);
205         ret_val = buffer;
206         return ret_val;
207 }
208
209 string Date::to_string() {
210         char    buffer[30];
211         string  ret_val;
212
213         sprintf(buffer, "%04d-%02d-%02d %02d:%02d:%02d", year, month, day, hour, min, sec);
214         ret_val = buffer;
215         return ret_val;
216 }