pandorafms/extras/anytermd/libpbe/include/DateTime.hh

119 lines
2.8 KiB
C++

// src/DateTime.hh
// This file is part of libpbe; see http://decimail.org
// (C) 2006 Philip Endecott
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#ifndef libpbe_DateTime_hh
#define libpbe_DateTime_hh
#include <iostream>
#include <time.h>
#include "Date.hh"
#include "Time.hh"
#include "Exception.hh"
namespace pbe {
struct DateTime {
Date date;
Time time;
DateTime() {}
DateTime(int year, int month, int day,
int hour=0, int minute=0, int second=0):
date(year,month,day),
time(hour,minute,second) {}
DateTime(time_t t) {
struct tm b;
localtime_r(&t, &b); // Or gmtime_r() ???
date.year = b.tm_year + 1900;
date.month = b.tm_mon + 1;
date.day = b.tm_mday;
time.hour = b.tm_hour;
time.minute = b.tm_min;
time.second = b.tm_sec;
}
DateTime(Date date_):
date(date_), time(0,0,0) {}
DateTime(Date date_, Time time_):
date(date_), time(time_) {}
bool operator<(const DateTime& rhs) const {
return (date<rhs.date)
|| (date==rhs.date && time<rhs.time);
}
void to_struct_tm(struct tm& b) const {
b.tm_year = date.year - 1900;
b.tm_mon = date.month - 1;
b.tm_mday = date.day;
b.tm_hour = time.hour;
b.tm_min = time.minute;
b.tm_sec = time.second;
}
time_t to_time_t(void) const {
struct tm b;
to_struct_tm(b);
time_t t = mktime(&b);
if (t==-1) {
throw pbe::StrException("mktime() input is invalid or out of range");
}
return t;
}
time_t utc_to_time_t(void) const {
struct tm b;
to_struct_tm(b);
time_t t = timegm(&b);
if (t==-1) {
throw pbe::StrException("mktime() input is invalid or out of range");
}
return t;
}
int day_of_week(void) const {
struct tm b;
to_struct_tm(b);
time_t t = timegm(&b);
if (t==-1) {
throw pbe::StrException("mktime() input is invalid or out of range");
}
return b.tm_wday+1;
}
};
inline std::ostream& operator<<(std::ostream& strm, const DateTime& dt) {
strm << dt.date << " " << dt.time;
return strm;
}
}
#endif