16 #ifndef INCLUDE_NN_NLIB_DATETIME_H_ 17 #define INCLUDE_NN_NLIB_DATETIME_H_ 21 #ifdef NLIB_CXX11_STDLIB_CHRONO 31 NLIB_EINVAL_IFNULL(t);
36 *t = time / 10000 - (10957LL * 24LL * 60LL * 60LL * 1000LL);
44 return static_cast<uint64_t
>(t / 10000);
63 if (tick < 0) tick = -tick;
73 return lhs.tick == rhs.tick;
76 return lhs.tick < rhs.tick;
104 NLIB_CEXPR const int64_t tick_1d = (10LL * 1000 * 1000 * 60 * 60 * 24);
111 : value_(static_cast<int64_t>(days) * tick_1d) {}
113 : value_(days* tick_1d + seconds*(10LL * 1000 * 1000)) {}
117 : value_(days* tick_1d + seconds*(10LL * 1000 * 1000) + milliseconds*(10LL * 1000) +
118 microseconds * 10LL) {}
127 return static_cast<int>(value_.tick / (10LL * 1000 * 1000 * 60 * 60 * 24));
130 return static_cast<int>(value_.tick / (10LL * 1000 * 1000 * 60 * 60));
133 return value_.tick / (10 * 1000 * 1000 * 60);
136 return value_.tick / (10 * 1000 * 1000);
139 return value_.tick / (10 * 1000);
142 return value_.tick / (10);
144 template <
class TIMEVAL>
145 void ToTimeVal(TIMEVAL* tv)
const NLIB_NOEXCEPT {
146 int64_t usec = ToMicroSeconds();
147 int64_t sec = usec / (1000 * 1000);
148 tv->tv_sec =
static_cast<time_t
>(sec);
149 tv->tv_usec =
static_cast<int32_t
>(usec - sec * (1000 * 1000));
151 explicit TimeSpan(
const struct timespec* tm) NLIB_NOEXCEPT {
152 NLIB_FROM_TIMESPEC(tm, value_.tick);
155 NLIB_TO_TIMESPEC(tm, value_.tick);
157 #ifdef NLIB_CXX11_STDLIB_CHRONO 158 template <
class Rep,
class Period>
159 TimeSpan(
const std::chrono::duration<Rep, Period>& rhs) {
160 auto tmp = std::chrono::duration_cast<std::chrono::microseconds>(rhs);
165 auto tmp = std::chrono::microseconds(value_.tick / 10);
166 return std::chrono::duration_cast<T>(tmp);
172 value_ += rhs.value_;
176 value_ -= rhs.value_;
184 value_.tick =
static_cast<int64_t
>(value_.tick * d);
187 void Abs() NLIB_NOEXCEPT { value_.Abs(); }
191 return value_ == rhs.value_;
194 return value_ != rhs.value_;
197 return value_ < rhs.value_;
200 return value_ > rhs.value_;
203 return value_ <= rhs.value_;
206 return value_ >= rhs.value_;
273 WEEK_SUNDAY = kWeekSunday,
274 WEEK_MONDAY = kWeekMonday,
275 WEEK_TUESDAY = kWeekTuesday,
276 WEEK_WEDNESDAY = kWeekWednesday,
277 WEEK_THURSDAY = kWeekThursday,
278 WEEK_FRIDAY = kWeekFriday,
279 WEEK_SATURDAY = kWeekSaturday,
286 errno_t Init(
int year,
int month,
int day,
int hour = 0,
287 int min = 0,
int sec = 0,
int msec = 0,
293 return IsValid() ? 0 : EINVAL;
341 char (&str)[32])
const NLIB_NOEXCEPT {
350 char (&str)[32])
const NLIB_NOEXCEPT {
364 return value_ == rhs.value_;
367 return value_ != rhs.value_;
370 return value_ < rhs.value_;
373 return value_ > rhs.value_;
376 return value_ <= rhs.value_;
379 return value_ >= rhs.value_;
382 explicit DateTime(
const struct timespec* tm) NLIB_NOEXCEPT {
383 NLIB_FROM_TIMESPEC(tm, value_.tick);
386 NLIB_TO_TIMESPEC(tm, value_.tick);
388 #ifdef NLIB_CXX11_STDLIB_CHRONO 389 template <
class Clock,
class Duration>
390 errno_t Init(
const std::chrono::time_point<Clock, Duration>& rhs) {
391 auto tmp = std::chrono::duration_cast<std::chrono::microseconds>(rhs.time_since_epoch());
397 auto tmp = std::chrono::microseconds(value_.tick / 10);
404 return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
408 static int GetDaysInMonth(
int year,
int month)
NLIB_NOEXCEPT;
420 return this->Init(rhs.year, rhs.month, rhs.day, rhs.hour, rhs.min, rhs.sec, rhs.msec, rhs.usec);
425 return IsValid() ? 0 : ERANGE;
428 inline errno_t DateTime::AddDays(
double value) NLIB_NOEXCEPT {
434 inline errno_t DateTime::AddHours(
double value) NLIB_NOEXCEPT {
440 inline errno_t DateTime::AddMinutes(
double value) NLIB_NOEXCEPT {
446 inline errno_t DateTime::AddSeconds(
double value) NLIB_NOEXCEPT {
452 inline errno_t DateTime::AddMilliSeconds(
double value) NLIB_NOEXCEPT {
458 inline errno_t DateTime::AddMicroSeconds(
double value) NLIB_NOEXCEPT {
492 #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を返します。 ...