16 #ifndef INCLUDE_NN_NLIB_DATETIME_H_ 17 #define INCLUDE_NN_NLIB_DATETIME_H_ 22 #ifdef NLIB_CXX11_STDLIB_CHRONO 32 NLIB_EINVAL_IFNULL(t);
37 *t = time / 10000 - (10957LL * 24LL * 60LL * 60LL * 1000LL);
45 return static_cast<uint64_t
>(t / 10000);
64 if (tick < 0) tick = -tick;
74 return lhs.tick == rhs.tick;
77 return lhs.tick < rhs.tick;
95 NLIB_CEXPR const int64_t tick_1d = (10LL * 1000 * 1000 * 60 * 60 * 24);
102 : value_(static_cast<int64_t>(days) * tick_1d) {}
104 : value_(days* tick_1d + seconds*(10LL * 1000 * 1000)) {}
108 : value_(days* tick_1d + seconds*(10LL * 1000 * 1000) + milliseconds*(10LL * 1000) +
109 microseconds * 10LL) {}
118 return static_cast<int>(value_.tick / (10LL * 1000 * 1000 * 60 * 60 * 24));
121 return static_cast<int>(value_.tick / (10LL * 1000 * 1000 * 60 * 60));
124 return value_.tick / (10 * 1000 * 1000 * 60);
127 return value_.tick / (10 * 1000 * 1000);
130 return value_.tick / (10 * 1000);
133 return value_.tick / (10);
135 template <
class TIMEVAL>
136 void ToTimeVal(TIMEVAL* tv)
const NLIB_NOEXCEPT {
137 int64_t usec = ToMicroSeconds();
138 int64_t sec = usec / (1000 * 1000);
139 tv->tv_sec =
static_cast<time_t
>(sec);
140 tv->tv_usec =
static_cast<int32_t
>(usec - sec * (1000 * 1000));
142 explicit TimeSpan(
const struct timespec* tm) NLIB_NOEXCEPT {
143 NLIB_FROM_TIMESPEC(tm, value_.tick);
146 NLIB_TO_TIMESPEC(tm, value_.tick);
148 #ifdef NLIB_CXX11_STDLIB_CHRONO 149 template <
class Rep,
class Period>
150 TimeSpan(
const std::chrono::duration<Rep, Period>& rhs) {
151 auto tmp = std::chrono::duration_cast<std::chrono::microseconds>(rhs);
156 auto tmp = std::chrono::microseconds(value_.tick / 10);
157 return std::chrono::duration_cast<T>(tmp);
163 value_ += rhs.value_;
167 value_ -= rhs.value_;
175 value_.tick =
static_cast<int64_t
>(value_.tick * d);
178 void Abs() NLIB_NOEXCEPT { value_.Abs(); }
189 return lhs.value_ == rhs.value_;
193 return lhs.value_ < rhs.value_;
258 WEEK_SUNDAY = kWeekSunday,
259 WEEK_MONDAY = kWeekMonday,
260 WEEK_TUESDAY = kWeekTuesday,
261 WEEK_WEDNESDAY = kWeekWednesday,
262 WEEK_THURSDAY = kWeekThursday,
263 WEEK_FRIDAY = kWeekFriday,
264 WEEK_SATURDAY = kWeekSaturday,
271 errno_t Init(
int year,
int month,
int day,
int hour = 0,
272 int min = 0,
int sec = 0,
int msec = 0,
278 return IsValid() ? 0 : EINVAL;
326 char (&str)[32])
const NLIB_NOEXCEPT {
335 char (&str)[32])
const NLIB_NOEXCEPT {
348 explicit DateTime(
const struct timespec* tm) NLIB_NOEXCEPT {
349 NLIB_FROM_TIMESPEC(tm, value_.tick);
352 NLIB_TO_TIMESPEC(tm, value_.tick);
354 #ifdef NLIB_CXX11_STDLIB_CHRONO 355 template <
class Clock,
class Duration>
356 errno_t Init(
const std::chrono::time_point<Clock, Duration>& rhs) {
357 auto tmp = std::chrono::duration_cast<std::chrono::microseconds>(rhs.time_since_epoch());
363 auto tmp = std::chrono::microseconds(value_.tick / 10);
370 return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
374 static int GetDaysInMonth(
int year,
int month)
NLIB_NOEXCEPT;
376 static std::pair<const char*, errno_t> Parse(
383 std::pair<const char*, errno_t> r = Parse(str, last, dt, delta);
384 return (r.second == 0) ? ((r.first == last) ? 0 : EILSEQ) : r.second;
398 return lhs.value_ == rhs.value_;
402 return lhs.value_ < rhs.value_;
407 return this->Init(rhs.year, rhs.month, rhs.day, rhs.hour, rhs.min, rhs.sec, rhs.msec, rhs.usec);
411 value_ += rhs.ToTimeValue();
412 return IsValid() ? 0 : ERANGE;
474 return TimeSpan(lhs.ToTimeValue() - rhs.ToTimeValue());
479 #endif // INCLUDE_NN_NLIB_DATETIME_H_ int64_t tick
nlib_time, nlib_durationとして利用することができます。
TimeSpan & operator*=(int i) noexcept
時間をi で乗算します。
TimeValue ToTimeValue() const noexcept
TimeValueオブジェクトに変換します。
int64_t ToMilliSeconds() const noexcept
時間をミリ秒数にして返します。端数は切り捨てられます。
TimeSpan & operator-=(const TimeSpan &rhs) noexcept
時間を減算します。
static constexpr bool IsLeapYear(int year) noexcept
閏年かどうかをチェックします。
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 HeapHash &rhs, const HeapHash &lhs)
2つのサマリを比較して等価ならば、trueを返します。
errno_t ToRfc2822(char(&str)[32]) const noexcept
ToRfc2822(str, TimeSpan()) を呼び出します。
DateTime operator+(const DateTime &lhs, const TimeSpan &rhs) noexcept
lhs から rhs だけ未来の時刻を返します。
static bool IsRfc3339(const nlib_utf8_t *str) noexcept
IsRfc3339(str, str + strlen(str))を実行します。
void ToTimeSpec(struct timespec *tm) const noexcept
timespec構造体の値に変換します。
uint64_t GetTickTime() noexcept
システムを起動した後の経過時間をミリ秒単位で返します。
TimeSpan(const struct timespec *tm) noexcept
timespec構造体からオブジェクトを構築します。
TimeValue operator+() const noexcept
単項演算子です。
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を起点とした経過時間をミリ秒単位で返します。
TimeSpan operator+() const noexcept
単項演算子です。
bool operator<(const DateTime &lhs, const DateTime &rhs) noexcept
lhsがrhsより過去の時刻ならtrueを返します。
static errno_t Parse(const char *str, DateTime *dt, TimeSpan *delta)
ヌル終端する文字列をパースします。ヌル終端する前にパースされない文字に到達した場合へエラーになります...
#define NLIB_NOEXCEPT
環境に合わせてnoexcept 又は同等の定義がされます。
#define NLIB_CEXPR
利用可能であればconstexprが定義されます。そうでない場合は空文字列です。
TimeSpan operator-() const noexcept
単項演算子です。
constexpr TimeSpan(int days) noexcept
期間として日数を指定して初期化します。
TimeSpan(const TimeValue &rhs) noexcept
TimeValue オブジェクトを用いて初期化します。
TimeValue ToTimeValue() const noexcept
TimeValueオブジェクトを返します。
#define NLIB_FINAL
利用可能であればfinalが定義されます。そうでない場合は空文字列です。
constexpr DateTime() noexcept
デフォルトコンストラクタです。無効な時刻で初期化します。
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
期間として日数,秒,ミリ秒,マイクロ秒を指定して初期化します。
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を返します。 ...