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
A relational operator.
int64_t tick
These can be used for nlib_time and nlib_duration.
TimeSpan & operator*=(int i) noexcept
Multiplies the time by i.
TimeValue ToTimeValue() const noexcept
Converts to a TimeValue object.
bool operator>(const DateTime &rhs) const noexcept
Returns true if further in the future than rhs.
bool operator==(const TimeSpan &rhs) const noexcept
Returns true if the time is the same.
int64_t ToMilliSeconds() const noexcept
Returns the time in terms of a number of milliseconds. Fractions are truncated.
int min
The minute (0-59).
TimeSpan & operator-=(const TimeSpan &rhs) noexcept
Subtracts time.
static bool IsLeapYear(int year) noexcept
Checks whether the specified year is a leap year.
int year
The year (1-9999).
bool operator<=(const TimeSpan &rhs) const noexcept
Returns true if equal to or smaller than rhs.
errno_t ToW3cDtf(char(&str)[32]) const noexcept
Calls ToW3cDtf(str, TimeSpan()).
#define NLIB_SAFE_BOOL(class_name, exp)
Defines a safe operator bool function in the class. Uses the C++11 explicit bool if it is available f...
int64_t ToSeconds() const noexcept
Returns the time in terms of a number of seconds. Fractions are truncated.
TimeSpan & operator+=(const TimeSpan &rhs) noexcept
Adds time.
TimeSpan operator*(const TimeSpan &lhs, double d) noexcept
Increases rhs by a factor of d.
int ToHours() const noexcept
Returns the time span as a number of hours. Fractions are truncated.
int msec
The millisecond (0-999).
bool operator<=(const TimeValue &lhs, const TimeValue &rhs) noexcept
A relational operator.
bool operator==(const HeapHash &rhs, const HeapHash &lhs)
Returns true if the two compared summaries are equal.
bool operator!=(const HeapHash &rhs, const HeapHash &lhs)
Returns true if the two compared summaries are not equal.
bool operator>=(const TimeSpan &rhs) const noexcept
Returns true if equal to or larger than rhs.
errno_t ToRfc2822(char(&str)[32]) const noexcept
Calls ToRfc2822(str, TimeSpan()).
DateTime operator+(const DateTime &lhs, const TimeSpan &rhs) noexcept
Returns the time that is the rhs amount of time into the future from lhs.
The class for representing the date and time.
void ToTimeSpec(struct timespec *tm) const noexcept
Converts to a value of the timespec structure.
uint64_t GetTickTime() noexcept
Returns the time in units of milliseconds that has elapsed since the system started.
TimeSpan(const struct timespec *tm) noexcept
Instantiates the object from the timespec structure.
bool operator>=(const DateTime &rhs) const noexcept
Returns true if the same or further in the future than rhs.
TimeValue operator+() const noexcept
A unary operator.
bool operator!=(const TimeSpan &rhs) const noexcept
Returns true if the time is different.
bool operator>(const TimeSpan &rhs) const noexcept
Returns true if larger than rhs.
int sec
The second (0-59).
TimeValue operator-() const noexcept
A unary operator.
constexpr TimeSpan() noexcept
Instantiates the object and initializes the time to 0.
int ToDays() const noexcept
Returns the time in terms of a number of days. Fractions are truncated.
Week
Constants representing the days of the week.
void ToTimeSpec(struct timespec *tm) const noexcept
Converts to a value of the timespec structure.
The structure for setting date and time information in DateTime and for getting that information from...
TimeSpan operator-(const DateTime &lhs, const DateTime &rhs) noexcept
Returns the duration between the times of rhs and lhs.
errno_t GetNintendoTime(int64_t *t) noexcept
Returns the amount of time that has elapsed, in units of milliseconds, starting from 2000-01-01...
bool operator>=(const TimeValue &lhs, const TimeValue &rhs) noexcept
A relational operator.
TimeSpan operator+() const noexcept
A unary operator.
bool operator<=(const DateTime &rhs) const noexcept
Returns true if the same or further in the past than rhs.
#define NLIB_NOEXCEPT
Defines noexcept geared to the environment, or the equivalent.
#define NLIB_CEXPR
Defines constexpr if it is available for use. If not, holds an empty string.
A file that contains the configuration information for each development environment.
int usec
The microsecond (0-999).
TimeSpan operator-() const noexcept
A unary operator.
bool operator==(const DateTime &rhs) const noexcept
Returns true if the time is equal to rhs.
bool operator>(const TimeValue &lhs, const TimeValue &rhs) noexcept
A relational operator.
constexpr TimeSpan(int days) noexcept
Initializes the object with a number of days specified for the period of time.
int month
The month (1-12).
bool operator<(const TimeSpan &rhs) const noexcept
Returns true if smaller than rhs.
TimeSpan(const TimeValue &rhs) noexcept
Initializes using a TimeValue object.
TimeValue ToTimeValue() const noexcept
Returns a TimeValue object.
#define NLIB_FINAL
Defines final if it is available for use. If not, holds an empty string.
The class for representing the time.
constexpr DateTime() noexcept
Instantiates the object with default parameters (default constructor). Initializes with an invalid ti...
bool operator!=(const DateTime &rhs) const noexcept
Returns true if the time is not equal to rhs.
constexpr TimeSpan(int days, int seconds) noexcept
Initializes the object with a number of days and a number of seconds specified for the period of time...
constexpr TimeValue() noexcept
Instantiates the object with default parameters (default constructor).
int64_t ToMicroSeconds() const noexcept
Returns the time in terms of a number of microseconds. Fractions are truncated.
constexpr TimeValue(int64_t tick_) noexcept
Initializes with the values of nlib_time and nlib_duration taken as the arguments.
TimeSpan & operator*=(double d) noexcept
Multiplies the time by d.
constexpr TimeSpan(int days, int seconds, int milliseconds, int microseconds=0) noexcept
Initializes the object with a number of days, seconds, milliseconds, and microseconds specified for t...
The class that wraps 64-bit signed integers.
bool operator<(const DateTime &rhs) const noexcept
Returns true if further in the past than rhs.
TimeValue & operator-=(const TimeValue &rhs) noexcept
Subtracts.
DateTime(const struct timespec *tm) noexcept
Instantiates the object from the timespec structure.
int64_t ToMinutes() const noexcept
Returns the time as a number of minutes. Fractions are truncated.
TimeValue & operator+=(const TimeValue &rhs) noexcept
Adds.
errno_t Init(const TimeValue &tv) noexcept
Initializes the date and time using the TimeValue structure. Returns EINVAL if given an invalid date...