119 lines
2.8 KiB
C++
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
|