NAP
datetime.h
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2  * License, v. 2.0. If a copy of the MPL was not distributed with this
3  * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4 
5 #pragma once
6 
7 // External includes
8 #include <chrono>
9 #include <stdint.h>
10 #include <string>
11 #include <ctime>
12 #include <functional>
13 #include <utility/dllexport.h>
14 #include <rtti/typeinfo.h>
15 
16 namespace nap
17 {
18  // Typedefs
19  using SystemClock = std::chrono::system_clock;
20  using HighResolutionClock = std::chrono::high_resolution_clock;
21  using SteadyClock = std::chrono::steady_clock;
22  using Milliseconds = std::chrono::milliseconds;
23  using MicroSeconds = std::chrono::microseconds;
24  using NanoSeconds = std::chrono::nanoseconds;
25  using Seconds = std::chrono::seconds;
26  using Minutes = std::chrono::minutes;
27  using Hours = std::chrono::hours;
28  using SystemTimeStamp = std::chrono::time_point<SystemClock>;
29  using HighResTimeStamp = std::chrono::time_point<HighResolutionClock>;
30  using SteadyTimeStamp = std::chrono::time_point<SteadyClock>;
31 
32  // Forward declares
33  class DateTime;
34 
35 
37  // Utility
39 
45 
52 
58  NAPAPI void getCurrentDateTime(DateTime& outDateTime);
59 
67  NAPAPI std::string timeFormat(const SystemTimeStamp& time, const std::string& format = "%Y-%m-%d %H:%M:%S.%ms");
68 
81  NAPAPI SystemTimeStamp createTimestamp(int year, int month, int day, int hour, int minute, int second=0, int millisecond=0, bool daylightSaving = true);
82 
83 
85  // Day
87 
92  enum class EDay : int
93  {
94  Monday = 1,
95  Tuesday = 2,
96  Wednesday = 3,
97  Thursday = 4,
98  Friday = 5,
99  Saturday = 6,
100  Sunday = 0,
101  Unknown = -1
102  };
103 
107  NAPAPI const std::array<EDay,7>& getDaysInWeek();
108 
114  NAPAPI std::string toString(EDay day);
115 
121  NAPAPI EDay toDay(const std::string& string);
122 
123 
125  // Month
127 
132  enum class EMonth : int
133  {
134  January = 1,
135  February = 2,
136  March = 3,
137  April = 4,
138  May = 5,
139  June = 6,
140  July = 7,
141  August = 8,
142  September = 9,
143  October = 10,
144  November = 11,
145  December = 12,
146  Unknown = -1
147  };
148 
154  NAPAPI std::string toString(EMonth month);
155 
161  NAPAPI EMonth toMonth(const std::string& string);
162 
163 
165  // DateTime
167 
173  class NAPAPI DateTime final
174  {
175  public:
176 
180  enum class ConversionMode : int
181  {
182  Local = 0,
183  GMT = 1
184  };
185 
186  public:
190  DateTime();
191 
196  DateTime(const SystemTimeStamp& timeStamp, ConversionMode mode);
197 
202  DateTime(const SystemTimeStamp& timeStamp);
203 
204  // Default destructor
205  ~DateTime() = default;
206 
210  int getYear() const;
211 
215  EMonth getMonth() const;
216 
220  int getWeek() const;
221 
225  int getDayInTheMonth() const;
226 
230  int getDayInTheYear() const;
231 
235  EDay getDay() const;
236 
240  int getHour() const;
241 
245  int getMinute() const;
246 
250  int getSecond() const;
251 
255  int getMilliSecond() const;
256 
260  bool isDaylightSaving() const;
261 
265  std::string toString() const;
266 
271  void setTimeStamp(const SystemTimeStamp& timeStamp);
272 
276  const SystemTimeStamp& getTimeStamp() const { return mTimeStamp; }
277 
278  // Allows for DateTime to be compared
279  bool operator<(const DateTime& other) const { return this->mTimeStamp < other.mTimeStamp; }
280  bool operator==(const DateTime& other) const { return this->mTimeStamp == other.mTimeStamp; }
281  bool operator!=(const DateTime& other) const { return this->mTimeStamp != other.mTimeStamp; }
282  bool operator<=(const DateTime& other) const { return this->mTimeStamp <= other.mTimeStamp; }
283  bool operator>=(const DateTime& other) const { return this->mTimeStamp >= other.mTimeStamp; }
284 
285  private:
286 
287  SystemTimeStamp mTimeStamp = SystemClock::now();
288  std::tm mTimeStruct;
289  ConversionMode mMode = ConversionMode::Local;
290  };
291 
292 
294  // Date
296 
302  class NAPAPI Date final
303  {
304  RTTI_ENABLE()
305  public:
309  Date() = default;
310 
314  Date(int year, EMonth month, int day);
315 
320  Date(const SystemTimeStamp& systemTime);
321 
326  void fromSystemTime(const SystemTimeStamp& systemTime);
327 
331  SystemTimeStamp toSystemTime() const;
332 
340  static bool exists(int year, EMonth month, int day);
341 
346  bool valid() const;
347 
349  int mDay = 1;
350  int mYear = 1970;
351  };
352 
353 
355  // Timestamp
357 
364  class NAPAPI TimeStamp final
365  {
366  RTTI_ENABLE()
367  public:
371  TimeStamp() = default;
372 
377  TimeStamp(int64_t timeStamp) : mTimeStamp(timeStamp) { }
378 
383  TimeStamp(const SystemTimeStamp& systemTime);
384 
389  void fromSystemTime(const SystemTimeStamp& systemTime);
390 
394  SystemTimeStamp toSystemTime() const;
395 
399  inline bool isValid() const { return mTimeStamp >= 0; }
400 
401  int64_t mTimeStamp = -1;
402  };
403 }
404 
405 
407 // Hashes
409 
410 namespace std
411 {
412  template <>
413  struct hash<nap::EDay>
414  {
415  size_t operator()(const nap::EDay& v) const
416  {
417  return std::hash<int>()(static_cast<int>(v));
418  }
419  };
420 
421  template <>
422  struct hash<nap::EMonth>
423  {
424  size_t operator()(const nap::EMonth& v) const
425  {
426  return std::hash<int>()(static_cast<int>(v));
427  }
428  };
429 }
nap::TimeStamp::TimeStamp
TimeStamp(int64_t timeStamp)
Definition: datetime.h:377
nap::EMonth::May
@ May
May.
nap::toString
NAPAPI std::string toString(EDay day)
nap::Milliseconds
std::chrono::milliseconds Milliseconds
Milliseconds type definition.
Definition: datetime.h:22
nap::EMonth::July
@ July
July.
nap::HighResTimeStamp
std::chrono::time_point< HighResolutionClock > HighResTimeStamp
Point in time associated with the HighResolutionClock.
Definition: datetime.h:29
nap::Minutes
std::chrono::minutes Minutes
Minutes type definition.
Definition: datetime.h:26
nap::DateTime::operator<
bool operator<(const DateTime &other) const
Definition: datetime.h:279
nap::EDay::Thursday
@ Thursday
Thursday.
nap::Seconds
std::chrono::seconds Seconds
Seconds type definition.
Definition: datetime.h:25
nap::HighResolutionClock
std::chrono::high_resolution_clock HighResolutionClock
High resolution clock, works with the highest possible precision. Can't convert time points in to day...
Definition: datetime.h:20
nap::SystemTimeStamp
std::chrono::time_point< SystemClock > SystemTimeStamp
Point in time associated with the SystemClock.
Definition: datetime.h:28
nap::EDay::Friday
@ Friday
Friday.
nap::SystemClock
std::chrono::system_clock SystemClock
System clock, able to convert time points in to days, seconds etc.
Definition: datetime.h:19
nap::EDay::Wednesday
@ Wednesday
Wednesday.
nap::createTimestamp
NAPAPI SystemTimeStamp createTimestamp(int year, int month, int day, int hour, int minute, int second=0, int millisecond=0, bool daylightSaving=true)
nap::EDay::Unknown
@ Unknown
Unknown.
nap::getCurrentTime
NAPAPI SystemTimeStamp getCurrentTime()
nap::DateTime
Definition: datetime.h:173
nap::DateTime::operator>=
bool operator>=(const DateTime &other) const
Definition: datetime.h:283
nap::EMonth::Unknown
@ Unknown
Unknown.
nap::EMonth::April
@ April
April.
nap::TimeStamp
Definition: datetime.h:364
nap::EDay::Saturday
@ Saturday
Saturday.
nap::EMonth
EMonth
Definition: datetime.h:132
nap::Date
Definition: datetime.h:302
nap::DateTime::ConversionMode
ConversionMode
Definition: datetime.h:180
nap::EDay::Monday
@ Monday
Monday.
nap::NanoSeconds
std::chrono::nanoseconds NanoSeconds
Nanoseconds type definition.
Definition: datetime.h:24
nap::EMonth::December
@ December
December.
nap::timeFormat
NAPAPI std::string timeFormat(const SystemTimeStamp &time, const std::string &format="%Y-%m-%d %H:%M:%S.%ms")
nap::EMonth::March
@ March
March.
nap::EMonth::February
@ February
February.
nap::EMonth::June
@ June
June.
nap::EDay::Sunday
@ Sunday
Sunday.
nap::DateTime::getTimeStamp
const SystemTimeStamp & getTimeStamp() const
Definition: datetime.h:276
nap::MicroSeconds
std::chrono::microseconds MicroSeconds
Microseconds type definition.
Definition: datetime.h:23
nap::toDay
NAPAPI EDay toDay(const std::string &string)
nap::getCurrentDateTime
NAPAPI DateTime getCurrentDateTime()
nap::EMonth::September
@ September
September.
nap::EDay
EDay
Definition: datetime.h:92
nap::EMonth::October
@ October
October.
nap::EMonth::January
@ January
January.
nap::EMonth::November
@ November
November.
nap::getDaysInWeek
const NAPAPI std::array< EDay, 7 > & getDaysInWeek()
nap
Definition: templateapp.h:17
nap::TimeStamp::isValid
bool isValid() const
Definition: datetime.h:399
nap::EMonth::August
@ August
August.
nap::Hours
std::chrono::hours Hours
Hours type definition.
Definition: datetime.h:27
nap::EDay::Tuesday
@ Tuesday
Tuesday.
nap::DateTime::operator!=
bool operator!=(const DateTime &other) const
Definition: datetime.h:281
nap::toMonth
NAPAPI EMonth toMonth(const std::string &string)
nap::DateTime::operator==
bool operator==(const DateTime &other) const
Definition: datetime.h:280
nap::SteadyClock
std::chrono::steady_clock SteadyClock
Monotonic clock. The time points of this clock cannot decrease as time moves forward and the time bet...
Definition: datetime.h:21
nap::DateTime::operator<=
bool operator<=(const DateTime &other) const
Definition: datetime.h:282
nap::SteadyTimeStamp
std::chrono::time_point< SteadyClock > SteadyTimeStamp
Point in time associated with the SteadyClock.
Definition: datetime.h:30