2011-10-07 12:20:49 -07:00
|
|
|
/*
|
|
|
|
* Copyright 2008 Free Software Foundation, Inc.
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* This software is distributed under the terms of the GNU Affero Public License.
|
|
|
|
* See the COPYING file in the main directory for details.
|
|
|
|
*
|
|
|
|
* This use of this software may be subject to additional restrictions.
|
|
|
|
* See the LEGAL file in the main directory for details.
|
|
|
|
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU Affero General Public License as published by
|
|
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
|
|
(at your option) 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 Affero General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU Affero General Public License
|
|
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-04-18 01:55:44 -07:00
|
|
|
#include <cstdio>
|
2011-10-07 12:20:49 -07:00
|
|
|
#include "Timeval.h"
|
|
|
|
|
2014-03-31 03:17:26 -07:00
|
|
|
using namespace std;
|
|
|
|
|
2014-03-24 14:57:31 -07:00
|
|
|
void Timeval::future(unsigned offset) // In msecs
|
2011-10-07 12:20:49 -07:00
|
|
|
{
|
|
|
|
now();
|
|
|
|
unsigned sec = offset/1000;
|
|
|
|
unsigned msec = offset%1000;
|
|
|
|
mTimeval.tv_usec += msec*1000;
|
|
|
|
mTimeval.tv_sec += sec;
|
|
|
|
if (mTimeval.tv_usec>1000000) {
|
|
|
|
mTimeval.tv_usec -= 1000000;
|
|
|
|
mTimeval.tv_sec += 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
struct timespec Timeval::timespec() const
|
|
|
|
{
|
|
|
|
struct timespec retVal;
|
|
|
|
retVal.tv_sec = mTimeval.tv_sec;
|
|
|
|
retVal.tv_nsec = 1000 * (long)mTimeval.tv_usec;
|
|
|
|
return retVal;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool Timeval::passed() const
|
|
|
|
{
|
|
|
|
Timeval nowTime;
|
|
|
|
if (nowTime.mTimeval.tv_sec < mTimeval.tv_sec) return false;
|
|
|
|
if (nowTime.mTimeval.tv_sec > mTimeval.tv_sec) return true;
|
|
|
|
if (nowTime.mTimeval.tv_usec > mTimeval.tv_usec) return true;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
double Timeval::seconds() const
|
|
|
|
{
|
|
|
|
return ((double)mTimeval.tv_sec) + 1e-6*((double)mTimeval.tv_usec);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
long Timeval::delta(const Timeval& other) const
|
|
|
|
{
|
|
|
|
// 2^31 milliseconds is just over 4 years.
|
2013-05-31 14:47:42 -07:00
|
|
|
int32_t deltaS = other.sec() - sec();
|
|
|
|
int32_t deltaUs = other.usec() - usec();
|
2011-10-07 12:20:49 -07:00
|
|
|
return 1000*deltaS + deltaUs/1000;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-03-31 03:17:26 -07:00
|
|
|
ostream& operator<<(ostream& os, const Timeval& tv)
|
2011-10-07 12:20:49 -07:00
|
|
|
{
|
2014-03-31 03:17:26 -07:00
|
|
|
os.setf( ios::fixed, ios::floatfield );
|
2011-10-07 12:20:49 -07:00
|
|
|
os << tv.seconds();
|
|
|
|
return os;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2014-03-31 03:17:26 -07:00
|
|
|
ostream& operator<<(ostream& os, const struct timespec& ts)
|
2011-10-07 12:20:49 -07:00
|
|
|
{
|
|
|
|
os << ts.tv_sec << "," << ts.tv_nsec;
|
|
|
|
return os;
|
|
|
|
}
|
|
|
|
|
2014-04-18 01:55:44 -07:00
|
|
|
void Timeval::isoTime(time_t t, std::string &result, bool isLocal)
|
|
|
|
{
|
|
|
|
char buf[BUFSIZ];
|
|
|
|
struct tm tBuf;
|
|
|
|
if (isLocal)
|
|
|
|
localtime_r(&t, &tBuf);
|
|
|
|
else
|
|
|
|
gmtime_r(&t, &tBuf);
|
|
|
|
snprintf(buf, sizeof(buf)-1, "%04d-%02d-%02dT%02d:%02d:%02d%s",
|
|
|
|
tBuf.tm_year + 1900, tBuf.tm_mon + 1, tBuf.tm_mday,
|
|
|
|
tBuf.tm_hour, tBuf.tm_min, tBuf.tm_sec,
|
|
|
|
isLocal == false ? "Z" : "");
|
|
|
|
result = buf;
|
|
|
|
}
|
|
|
|
|
2011-10-07 12:20:49 -07:00
|
|
|
|
|
|
|
|
|
|
|
// vim: ts=4 sw=4
|