3 #ifndef INCLUDE_NN_NLIB_DATETIME_H_ 4 #define INCLUDE_NN_NLIB_DATETIME_H_ 8 #ifdef NLIB_CXX11_STDLIB_CHRONO 18 NLIB_EINVAL_IFNULL(t);
23 *t = time / 10000 - (10957LL * 24LL * 60LL * 60LL * 1000LL);
31 return static_cast<uint64_t
>(t / 10000);
50 if (tick < 0) tick = -tick;
60 return lhs.tick == rhs.tick;
63 return lhs.tick < rhs.tick;
91 NLIB_CEXPR const int64_t tick_1d = (10LL * 1000 * 1000 * 60 * 60 * 24);
98 : value_(static_cast<int64_t>(days) * tick_1d) {}
100 : value_(days* tick_1d + seconds*(10LL * 1000 * 1000)) {}
104 : value_(days* tick_1d + seconds*(10LL * 1000 * 1000) + milliseconds*(10LL * 1000) +
105 microseconds * 10LL) {}
114 return static_cast<int>(value_.tick / (10LL * 1000 * 1000 * 60 * 60 * 24));
117 return static_cast<int>(value_.tick / (10LL * 1000 * 1000 * 60 * 60));
120 return value_.tick / (10 * 1000 * 1000 * 60);
123 return value_.tick / (10 * 1000 * 1000);
126 return value_.tick / (10 * 1000);
129 return value_.tick / (10);
131 template <
class TIMEVAL>
132 void ToTimeVal(TIMEVAL* tv)
const NLIB_NOEXCEPT {
133 int64_t usec = ToMicroSeconds();
134 int64_t sec = usec / (1000 * 1000);
135 tv->tv_sec =
static_cast<time_t
>(sec);
136 tv->tv_usec =
static_cast<int32_t
>(usec - sec * (1000 * 1000));
138 explicit TimeSpan(
const struct timespec* tm) NLIB_NOEXCEPT {
139 NLIB_FROM_TIMESPEC(tm, value_.tick);
142 NLIB_TO_TIMESPEC(tm, value_.tick);
144 #ifdef NLIB_CXX11_STDLIB_CHRONO 145 template <
class Rep,
class Period>
146 TimeSpan(
const std::chrono::duration<Rep, Period>& rhs) {
147 auto tmp = std::chrono::duration_cast<std::chrono::microseconds>(rhs);
152 auto tmp = std::chrono::microseconds(value_.tick / 10);
153 return std::chrono::duration_cast<T>(tmp);
159 value_ += rhs.value_;
163 value_ -= rhs.value_;
171 value_.tick =
static_cast<int64_t
>(value_.tick * d);
174 void Abs() NLIB_NOEXCEPT { value_.Abs(); }
178 return value_ == rhs.value_;
181 return value_ != rhs.value_;
184 return value_ < rhs.value_;
187 return value_ > rhs.value_;
190 return value_ <= rhs.value_;
193 return value_ >= rhs.value_;
265 errno_t Init(
int year,
int month,
int day,
int hour = 0,
266 int min = 0,
int sec = 0,
int msec = 0,
272 return IsValid() ? 0 : EINVAL;
320 char (&str)[32]) const NLIB_NOEXCEPT {
329 char (&str)[32]) const NLIB_NOEXCEPT {
343 return value_ == rhs.value_;
346 return value_ != rhs.value_;
349 return value_ < rhs.value_;
352 return value_ > rhs.value_;
355 return value_ <= rhs.value_;
358 return value_ >= rhs.value_;
361 explicit DateTime(
const struct timespec* tm) NLIB_NOEXCEPT {
362 NLIB_FROM_TIMESPEC(tm, value_.tick);
365 NLIB_TO_TIMESPEC(tm, value_.tick);
367 #ifdef NLIB_CXX11_STDLIB_CHRONO 368 template <
class Clock,
class Duration>
369 errno_t Init(
const std::chrono::time_point<Clock, Duration>& rhs) {
370 auto tmp = std::chrono::duration_cast<std::chrono::microseconds>(rhs.time_since_epoch());
376 auto tmp = std::chrono::microseconds(value_.tick / 10);
383 return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
387 static int GetDaysInMonth(
int year,
int month)
NLIB_NOEXCEPT;
399 return this->Init(rhs.year, rhs.month, rhs.day, rhs.hour, rhs.min, rhs.sec, rhs.msec, rhs.usec);
404 return IsValid() ? 0 : ERANGE;
407 inline errno_t DateTime::AddDays(
double value) NLIB_NOEXCEPT {
413 inline errno_t DateTime::AddHours(
double value) NLIB_NOEXCEPT {
419 inline errno_t DateTime::AddMinutes(
double value) NLIB_NOEXCEPT {
425 inline errno_t DateTime::AddSeconds(
double value) NLIB_NOEXCEPT {
431 inline errno_t DateTime::AddMilliSeconds(
double value) NLIB_NOEXCEPT {
437 inline errno_t DateTime::AddMicroSeconds(
double value) NLIB_NOEXCEPT {
471 #endif // INCLUDE_NN_NLIB_DATETIME_H_ bool operator<(const TimeValue &lhs, const TimeValue &rhs) noexcept
比較演算子です。
int64_t tick
nlib_time, nlib_durationとして利用することができます。
TimeSpan & operator*=(int i) noexcept
時間をi で乗算します。
TimeValue ToTimeValue() const noexcept
TimeValueオブジェクトに変換します。
bool operator>(const DateTime &rhs) const noexcept
rhs より未来の時刻ならtrueを返します。
bool operator==(const TimeSpan &rhs) const noexcept
同じ時間ならばtrueを返します。
int64_t ToMilliSeconds() const noexcept
時間をミリ秒数にして返します。端数は切り捨てられます。
TimeSpan & operator-=(const TimeSpan &rhs) noexcept
時間を減算します。
static bool IsLeapYear(int year) noexcept
閏年かどうかをチェックします。
bool operator<=(const TimeSpan &rhs) const noexcept
rhs と同じかより小さければtrueを返します。
errno_t ToW3cDtf(char(&str)[32]) const noexcept
ToW3cDtf(str, TimeSpan()) を呼び出します。
#define NLIB_SAFE_BOOL(class_name, exp)
クラス内に安全なoperator bool()を定義します。 可能であればC++11のexplicit boolを利用します。 ...
int64_t ToSeconds() const noexcept
時間を秒数にして返します。端数は切り捨てられます。
TimeSpan & operator+=(const TimeSpan &rhs) noexcept
時間を加算します。
TimeSpan operator*(const TimeSpan &lhs, double d) noexcept
rhs を d 倍します。
int ToHours() const noexcept
時間を一時間単位の値として返します。端数は切り捨てられます。
bool operator<=(const TimeValue &lhs, const TimeValue &rhs) noexcept
比較演算子です。
bool operator==(const HeapHash &rhs, const HeapHash &lhs)
2つのサマリを比較して等価ならば、trueを返します。
bool operator!=(const HeapHash &rhs, const HeapHash &lhs)
2つのサマリを比較して等価でなければ、trueを返します。
bool operator>=(const TimeSpan &rhs) const noexcept
rhs と同じかより大きければtrueを返します。
errno_t ToRfc2822(char(&str)[32]) const noexcept
ToRfc2822(str, TimeSpan()) を呼び出します。
DateTime operator+(const DateTime &lhs, const TimeSpan &rhs) noexcept
lhs から rhs だけ未来の時刻を返します。
void ToTimeSpec(struct timespec *tm) const noexcept
timespec構造体の値に変換します。
uint64_t GetTickTime() noexcept
システムを起動した後の経過時間をミリ秒単位で返します。
TimeSpan(const struct timespec *tm) noexcept
timespec構造体からオブジェクトを構築します。
bool operator>=(const DateTime &rhs) const noexcept
rhs と同じかより未来の時刻ならtrueを返します。
TimeValue operator+() const noexcept
単項演算子です。
bool operator!=(const TimeSpan &rhs) const noexcept
異なる時間ならばtrueを返します。
bool operator>(const TimeSpan &rhs) const noexcept
rhs より大きければtrueを返します。
TimeValue operator-() const noexcept
単項演算子です。
constexpr TimeSpan() noexcept
時間を 0 で初期化するコンストラクタです。
int ToDays() const noexcept
時間を日数にして返します。端数は切り捨てられます。
void ToTimeSpec(struct timespec *tm) const noexcept
timespec構造体の値に変換します。
日時情報をDateTimeに設定したりDateTimeから取得するための構造体です。
TimeSpan operator-(const DateTime &lhs, const DateTime &rhs) noexcept
時刻rhs から時刻lhs までの時間を返します。
errno_t GetNintendoTime(int64_t *t) noexcept
2000/01/01を起点とした経過時間をミリ秒単位で返します。
bool operator>=(const TimeValue &lhs, const TimeValue &rhs) noexcept
比較演算子です。
TimeSpan operator+() const noexcept
単項演算子です。
bool operator<=(const DateTime &rhs) const noexcept
rhs と同じかより過去の時刻ならtrueを返します。
#define NLIB_NOEXCEPT
環境に合わせてnoexcept 又は同等の定義がされます。
#define NLIB_CEXPR
利用可能であればconstexprが定義されます。そうでない場合は空文字列です。
TimeSpan operator-() const noexcept
単項演算子です。
bool operator==(const DateTime &rhs) const noexcept
rhs と同一時刻ならばtrueを返します。
bool operator>(const TimeValue &lhs, const TimeValue &rhs) noexcept
比較演算子です。
constexpr TimeSpan(int days) noexcept
期間として日数を指定して初期化します。
bool operator<(const TimeSpan &rhs) const noexcept
rhs より小さければtrueを返します。
TimeSpan(const TimeValue &rhs) noexcept
TimeValue オブジェクトを用いて初期化します。
TimeValue ToTimeValue() const noexcept
TimeValueオブジェクトを返します。
#define NLIB_FINAL
利用可能であればfinalが定義されます。そうでない場合は空文字列です。
constexpr DateTime() noexcept
デフォルトコンストラクタです。無効な時刻で初期化します。
bool operator!=(const DateTime &rhs) const noexcept
rhs と同一時刻でないならtrueを返します。
constexpr TimeSpan(int days, int seconds) noexcept
期間として日数と秒を指定して初期化します。
constexpr TimeValue() noexcept
デフォルトコンストラクタです。
int64_t ToMicroSeconds() const noexcept
時間をマイクロ秒数にして返します。端数は切り捨てられます。
constexpr TimeValue(int64_t tick_) noexcept
nlib_time, nlib_durationの値を引数にして初期化します。
TimeSpan & operator*=(double d) noexcept
時間をd で乗算します。
constexpr TimeSpan(int days, int seconds, int milliseconds, int microseconds=0) noexcept
期間として日数,秒,ミリ秒,マイクロ秒を指定して初期化します。
bool operator<(const DateTime &rhs) const noexcept
rhs より過去の時刻ならtrueを返します。
TimeValue & operator-=(const TimeValue &rhs) noexcept
減算します。
DateTime(const struct timespec *tm) noexcept
timespec構造体からオブジェクトを構築します。
int64_t ToMinutes() const noexcept
時間を分数にして返します。端数は切り捨てられます。
TimeValue & operator+=(const TimeValue &rhs) noexcept
加算します。
errno_t Init(const TimeValue &tv) noexcept
TimeValue構造体を用いて日時を初期化します。無効な日時が与えられた場合はEINVALを返します。 ...