/* * Date.cc * * Created on: Dec 7, 2010 * Author: lamikr */ #include #include #include #include #include #include "Date.hh" using namespace std; using namespace plp; static const int CONST__DAYS_PER_MONTH[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; Date::Date() { time_t wtime; struct tm *ltime; time(&wtime); ltime = localtime(&wtime); year = 1900 + ltime->tm_year; month = ltime->tm_mon + 1; // ltime-month: values 0 - 11... day = ltime->tm_mday; hour = ltime->tm_hour; min = ltime->tm_min; sec = ltime->tm_sec; } Date::Date(int year_param, int month_param, int day_param, int hour_param, int min_param, int sec_param) { year = year_param; month = month_param; day = day_param; hour = hour_param; min = min_param; sec = sec_param; } Date::~Date() { // TODO Auto-generated destructor stub } bool Date::is_leap_year() { bool ret_val; ret_val = false; if ((year % 4 == 0) && ((year % 400 == 0) || (year % 100 != 0))) { ret_val = true; } return ret_val; } void Date::printout() { log_debug("%d-%02d-%02d %02d:%02d:%02d\n", year, month, day, hour, min, sec); } Date *Date::clone() { Date *ret_val; ret_val = new Date(year, month, day, hour, min, sec); return ret_val; } void Date::copy(Date *date) { year = date->year; month = date->month; day = date->day; hour = date->hour; min = date->min; sec = date->sec; } bool Date::before(Date *date2) { bool ret_val; string s1; string s2; ret_val = false; if (date2 != NULL) { s1 = this->to_sortable_string(); s2 = date2->to_sortable_string(); if (s1.compare(s2) < 0) { ret_val = true; } } return ret_val; } bool Date::equals(Date *date2) { bool ret_val; ret_val = false; if (date2 != NULL) { if ((this->sec == date2->sec) && (this->min == date2->min) && (this->hour == date2->hour) && (this->day == date2->day) && (this->month == date2->month) && (this->year == date2->year)) { ret_val = true; } } return ret_val; } void Date::tomorrow() { if ((month > 0) && (month <= 12)) { day++; if (day > CONST__DAYS_PER_MONTH[month - 1]) { if ((month == 2) && (is_leap_year() == true) && (day == 29)) { // ok } else { day = 1; month++; if (month == 12) { year++; month = 1; } } } } } void Date::next_hour() { if ((hour >= 0) && (hour <= 24)) { hour++; if (hour > 24) { hour = 0; tomorrow(); } } } void Date::inc_minutes(int minutes) { int day_c; int hour_c; int ii; day_c = minutes / 1440; minutes = minutes - day_c * 1440; hour_c = minutes / 60; minutes = minutes - hour_c * 60; for (ii = 0; ii < day_c; ii++) { tomorrow(); } for (ii = 0; ii < hour_c; ii++) { hour++; if (hour > 24) { hour = 0; tomorrow(); } } min = min + minutes; if (min >= 60) { min = min % 60; hour++; if (hour > 24) { hour = 0; tomorrow(); } } } void Date::inc_seconds(int seconds) { int min_c; min_c = seconds / 60; seconds = seconds - min_c * 60; inc_minutes(min_c); sec = sec + seconds; if (sec >= 60) { sec = sec % 60; inc_minutes(1); } } string Date::to_sortable_string() { char buffer[30]; string ret_val; sprintf(buffer, "%016d%02d%02d%02d%02d%02d", year, month, day, hour, min, sec); ret_val = buffer; return ret_val; } string Date::to_string() { char buffer[30]; string ret_val; sprintf(buffer, "%04d-%02d-%02d %02d:%02d:%02d", year, month, day, hour, min, sec); ret_val = buffer; return ret_val; }