1 #include "hmbdc/Copyright.hpp" 4 #include "hmbdc/Endian.hpp" 12 namespace hmbdc {
namespace time {
16 SysTime() : nsecSinceEpoch_(0){}
18 explicit SysTime(int64_t sec, int64_t usec = 0, int64_t nsec = 0) {
19 nsecSinceEpoch_ = sec * 1000000000l + usec*1000l + nsec;
24 clock_gettime(CLOCK_REALTIME, &spec);
25 return SysTime(spec.tv_sec, 0, spec.tv_nsec);
28 int64_t nsecSinceEpoch()
const {
return nsecSinceEpoch_; }
29 int64_t usecSinceEpoch()
const {
return nsecSinceEpoch_ / 1000l; }
30 Duration sinceMidnight()
const;
31 SysTime previousMidnight()
const;
33 bool operator < (SysTime
const& other)
const {
34 return nsecSinceEpoch_ < other.nsecSinceEpoch_;
37 bool operator <= (SysTime
const& other)
const {
38 return nsecSinceEpoch_ <= other.nsecSinceEpoch_;
41 bool operator > (SysTime
const& other)
const {
42 return nsecSinceEpoch_ > other.nsecSinceEpoch_;
45 bool operator >= (SysTime
const& other)
const {
46 return nsecSinceEpoch_ >= other.nsecSinceEpoch_;
48 bool operator == (SysTime
const& other)
const {
49 return nsecSinceEpoch_ == other.nsecSinceEpoch_;
52 bool operator != (SysTime
const& other)
const {
53 return nsecSinceEpoch_ != other.nsecSinceEpoch_;
56 Duration operator - (SysTime
const&)
const;
57 SysTime operator + (Duration
const&)
const;
58 SysTime operator - (Duration
const&)
const;
60 explicit operator bool()
const {
61 return nsecSinceEpoch_;
66 fromYYYYMMDDhhmmSSmmmUtc(int64_t v) {
68 v_tm.tm_year =
static_cast<int>(v/10000000000000l);
71 v_tm.tm_mon =
static_cast<int>(v/100000000000l);
74 v_tm.tm_mday =
static_cast<int>(v/1000000000l);
76 v_tm.tm_hour =
static_cast<int>(v/10000000l);
78 v_tm.tm_min =
static_cast<int>(v/100000l);
80 v_tm.tm_sec =
static_cast<int>(v/1000l);
83 return SysTime(timegm(&v_tm), v * 1000l);
88 fromYYYYMMDDhhmmSSmmm(int64_t v) {
90 v_tm.tm_year =
static_cast<int>(v/10000000000000l);
93 v_tm.tm_mon =
static_cast<int>(v/100000000000l);
96 v_tm.tm_mday =
static_cast<int>(v/1000000000l);
98 v_tm.tm_hour =
static_cast<int>(v/10000000l);
100 v_tm.tm_min =
static_cast<int>(v/100000l);
102 v_tm.tm_sec =
static_cast<int>(v/1000l);
105 return SysTime(mktime(&v_tm), v * 1000l);
108 void toXmitEndian() {
109 nsecSinceEpoch_ = Endian::toXmit(nsecSinceEpoch_);
112 void toNativeEndian() {
117 int64_t nsecSinceEpoch_;
118 friend std::ostream& operator << (std::ostream& os, SysTime
const& t);
122 std::ostream& operator << (std::ostream& os, SysTime
const& t) {
126 time_t sec = (time_t)(t.nsecSinceEpoch_ / 1000000000ll);
127 localtime_r(&sec, &ts);
128 strftime(buf,
sizeof(buf),
"%Y%m%d%H%M%S.", &ts);
129 sprintf(buf2,
"%09lld", t.nsecSinceEpoch_ % 1000000000ll);
138 static Duration milliseconds(int64_t msec) {
return Duration(0, msec * 1000);}
144 explicit Duration(int64_t sec, int64_t usec = 0, int64_t nsec = 0) {
145 nsec_ = sec * 1000000000l + usec * 1000l + nsec;}
147 int64_t milliseconds()
const {
return nsec_ / 1000000l; }
148 int64_t microseconds()
const {
return nsec_ / 1000l; }
149 int64_t nanoseconds()
const {
return nsec_; }
151 explicit operator bool()
const {
155 explicit operator double()
const {
156 return (
double)nsec_ / 1000000000.0;
159 bool operator < (
Duration const& other)
const {
return nsec_ < other.nsec_; }
160 bool operator > (
Duration const& other)
const {
return nsec_ > other.nsec_; }
161 bool operator == (
Duration const& other)
const {
return nsec_ == other.nsec_; }
162 bool operator != (
Duration const& other)
const {
return nsec_ != other.nsec_; }
163 bool operator >= (
Duration const& other)
const {
return nsec_ >= other.nsec_; }
164 bool operator <= (
Duration const& other)
const {
return nsec_ <= other.nsec_; }
167 nsec_ += other.nsec_;
172 return nanoseconds(-nsec_);
176 return nanoseconds(nsec_ - other.nsec_);
180 return nanoseconds(nsec_ + other.nsec_);
184 nsec_ -= other.nsec_;
187 double operator / (
Duration const& other)
const {
188 return (
double)nsec_ / other.nsec_;
191 Duration operator * (int64_t m)
const {
195 Duration operator / (int64_t
const& d)
const {
200 return Duration(0, 0, nsec_ % d.nsec_);
203 void toXmitEndian() {
204 nsec_ = Endian::toXmit(nsec_);
207 void toNativeEndian() {
213 friend std::ostream&
operator <<
214 (std::ostream& os,
Duration const& d);
215 friend std::istream&
operator >>
224 operator - (
SysTime const& b)
const {
225 return Duration::nanoseconds(nsecSinceEpoch_
226 - b.nsecSinceEpoch_);
232 operator + (Duration
const& d)
const {
233 return SysTime(0, 0, nsecSinceEpoch_ + d.nsec_);
239 operator - (Duration
const& d)
const {
240 return SysTime(0, 0, nsecSinceEpoch_ - d.nsec_);
246 sinceMidnight()
const {
247 return *
this - previousMidnight();
253 previousMidnight()
const {
255 time_t sec = (time_t)(nsecSinceEpoch_ / 1000000000l);
256 localtime_r(&sec, &ts);
257 return SysTime(sec) - Duration(ts.tm_hour * 3600 + ts.tm_min * 60 + ts.tm_sec);
262 operator += (SysTime & t, Duration
const& d) {
269 operator -= (SysTime & t, Duration
const& d) {
276 operator << (std::ostream& os, Duration
const& d) {
279 sprintf(buf,
"%09lld", d.nsec_ % 1000000000ll);
280 os << d.nsec_ / 1000000000l <<
'.' << buf;
282 sprintf(buf,
"%09lld", (-d.nsec_) % 1000000000ll);
283 os <<
'-' << (-d.nsec_) / 1000000000l <<
'.' << buf;
292 operator >> (std::istream& is, Duration& d) {
295 d.nsec_ = (int64_t)(t * 1000000000l);
303 struct numeric_limits<
hmbdc::time::Duration> : numeric_limits<int64_t> {
306 {
return hmbdc::time::Duration::nanoseconds(numeric_limits<int64_t>::min());}
308 {
return hmbdc::time::Duration::nanoseconds(numeric_limits<int64_t>::max());}
Definition: TypedString.hpp:84
SysTime(int64_t sec, int64_t usec=0, int64_t nsec=0)
UTC as input.
Definition: Time.hpp:18