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
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...