13#include "QuantityValue.h"
17 using Years = std::chrono::duration<BigNumber, std::ratio<31556952>>;
18 using Months = std::chrono::duration<BigNumber, std::ratio<2629746>>;
19 using Weeks = std::chrono::duration<BigNumber, std::ratio<604800>>;
20 using Days = std::chrono::duration<BigNumber, std::ratio<86400>>;
21 using Hours = std::chrono::duration<BigNumber, std::ratio<3600>>;
22 using Minutes = std::chrono::duration<BigNumber, std::ratio<60>>;
23 using Seconds = std::chrono::duration<BigNumber>;
24 using MilliSeconds = std::chrono::duration<BigNumber, std::milli>;
25 using NanoSeconds = std::chrono::duration<BigNumber, std::nano>;
33 template<
intmax_t _Num,
intmax_t _Den>
34 struct is_ratio<std::ratio<_Num, _Den>> : std::true_type
41 Timestamp(NanoSeconds _ns) : m_ns_since_unix_epoch(_ns) {}
43 Timestamp() : m_ns_since_unix_epoch(BigNumber::zero()) {}
46 bool isValid()
const {
return m_ns_since_unix_epoch.count() > 0; }
47 cres_qresult<QDateTime> toQDateTime()
const;
55 cres_qresult<QString> toRdfLiteral()
const;
56 static cres_qresult<Timestamp> fromRdfLiteral(
const QString& _literal);
58 template<
typename _unit_>
59 cres_qresult<_unit_> toLocal()
const;
64 template<
typename _unit_>
67 bool operator<(
const Timestamp& _rhs)
const;
68 bool operator<=(
const Timestamp& _rhs)
const;
69 bool operator==(
const Timestamp& _rhs)
const;
70 bool operator!=(
const Timestamp& _rhs)
const;
71 bool operator>(
const Timestamp& _rhs)
const;
72 bool operator>=(
const Timestamp& _rhs)
const;
79 template<
typename _unit_>
84 template<
typename _unit_>
96 template<
typename _unit_>
97 static cres_qresult<Timestamp> fromLocal(_unit_ _value);
98 template<
typename _Period_>
101 template<
typename _Rep_,
typename _Period_>
102 requires(not std::is_same_v<_Rep_, knowCore::BigNumber>
105 template<
typename _unit_>
107 template<
typename _unit_>
109 static Timestamp from(
const QDateTime& _time);
111 static cres_qresult<NanoSeconds> localToEpoch(NanoSeconds _time);
112 static cres_qresult<NanoSeconds> epochToLocal(NanoSeconds _time);
113 static Unit nanoSECUnit();
115 NanoSeconds m_ns_since_unix_epoch;
124 template<
typename _unit_>
125 inline cres_qresult<Timestamp> Timestamp::fromLocal(_unit_ _value)
127 cres_try(NanoSeconds lte,
128 localToEpoch(std::chrono::duration_cast<NanoSeconds>(_unit_(_value))));
131 template<
typename _Period_>
132 requires details::is_ratio<_Period_>::value
135 return Timestamp(std::chrono::duration_cast<NanoSeconds>(_value));
137 template<
typename _Rep_,
typename _Period_>
138 requires(not std::is_same_v<_Rep_, knowCore::BigNumber> and details::is_ratio<_Period_>::value)
141 return fromEpoch<_Period_>(
142 std::chrono::duration<knowCore::BigNumber, _Period_>(_value.count()));
144 template<
typename _unit_>
149 template<
typename _unit_>
154 template<
typename _unit_>
155 inline cres_qresult<_unit_> Timestamp::toLocal()
const
157 cres_try(NanoSeconds etl, epochToLocal(m_ns_since_unix_epoch));
158 return std::chrono::duration_cast<_unit_>(etl);
160 template<
typename _unit_>
163 return std::chrono::duration_cast<_unit_>(m_ns_since_unix_epoch);
166 inline bool Timestamp::operator<(
const Timestamp& _rhs)
const
168 return m_ns_since_unix_epoch < _rhs.m_ns_since_unix_epoch;
170 inline bool Timestamp::operator<=(
const Timestamp& _rhs)
const
172 return m_ns_since_unix_epoch <= _rhs.m_ns_since_unix_epoch;
174 inline bool Timestamp::operator==(
const Timestamp& _rhs)
const
176 return m_ns_since_unix_epoch == _rhs.m_ns_since_unix_epoch;
178 inline bool Timestamp::operator!=(
const Timestamp& _rhs)
const
180 return m_ns_since_unix_epoch != _rhs.m_ns_since_unix_epoch;
182 inline bool Timestamp::operator>(
const Timestamp& _rhs)
const
184 return m_ns_since_unix_epoch > _rhs.m_ns_since_unix_epoch;
186 inline bool Timestamp::operator>=(
const Timestamp& _rhs)
const
188 return m_ns_since_unix_epoch >= _rhs.m_ns_since_unix_epoch;
191 inline Timestamp Timestamp::operator+(
const Timestamp& _rhs)
const
193 return Timestamp(m_ns_since_unix_epoch + _rhs.m_ns_since_unix_epoch);
195 inline Timestamp& Timestamp::operator+=(
const Timestamp& _rhs)
197 m_ns_since_unix_epoch = m_ns_since_unix_epoch + _rhs.m_ns_since_unix_epoch;
201 inline Timestamp Timestamp::operator-(
const Timestamp& _rhs)
const
203 return Timestamp(m_ns_since_unix_epoch - _rhs.m_ns_since_unix_epoch);
207 return Timestamp(m_ns_since_unix_epoch * _rhs);
210 template<
typename _unit_>
211 Timestamp Timestamp::add(_unit_ _unit)
const
213 return Timestamp(m_ns_since_unix_epoch + std::chrono::duration_cast<NanoSeconds>(_unit));
216 template<
typename _unit_>
224KNOWCORE_DECLARE_FULL_METATYPE(knowCore, Timestamp);
231#include "Formatter.h"
234 auto const& [s, v, e] = p.toQDateTime();
237 return format_to(ctx.out(),
"{}", v.value());
241 return format_to(ctx.out(),
"{}ns", p.toEpoch<knowCore::NanoSeconds>().count());
Class that can contains large numeric value.
Definition BigNumber.h:51
Definition QuantityValue.h:22
Definition Timestamp.h:39
_unit_ intervalTo(const Timestamp &_time) const
Definition Timestamp.h:217
static cres_qresult< Timestamp > fromEpoch(const QuantityNumber &_quantity)
Definition Timestamp.cpp:78
_unit_ toEpoch() const
Definition Timestamp.h:161
static Timestamp endOfTime()
Definition Timestamp.cpp:128
static Timestamp originOfTime()
Definition Timestamp.cpp:135
Definition Timestamp.h:30