DateTime.h
Go to the documentation of this file.
1 /*
2  DateTime.h - Arduino library for date and time functions
3  Copyright (c) Michael Margolis. All right reserved.
4 
5 
6  This library is distributed in the hope that it will be useful,
7  but WITHOUT ANY WARRANTY; without even the implied warranty of
8  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
9 
11  Heavily rewritten for Sming Framework
12 */
13 
17 #pragma once
18 
19 #include <time.h>
20 #include <WString.h>
21 #include "SmingLocale.h"
22 #include <sming_attr.h>
23 
24 /* Useful Constants */
25 #define SECS_PER_MIN (60UL)
26 #define SECS_PER_HOUR (3600UL)
27 #define SECS_PER_DAY (SECS_PER_HOUR * 24L)
28 #define DAYS_PER_WEEK (7L)
29 #define SECS_PER_WEEK (SECS_PER_DAY * DAYS_PER_WEEK)
30 #define SECS_PER_YEAR (SECS_PER_WEEK * 52L)
31 #define SECS_YR_2000 (946681200UL)
32 
35 enum dtDays_t {
43 };
44 
47 enum dtMonth_t {
60 };
61 
62 /* Useful functions for getting elapsed time */
63 
65 inline constexpr uint8_t numberOfSeconds(time_t time)
66 {
67  return time % SECS_PER_MIN;
68 }
69 
71 inline constexpr uint8_t numberOfMinutes(time_t time)
72 {
73  return (time / SECS_PER_MIN) % SECS_PER_MIN;
74 }
75 
77 inline constexpr uint8_t numberOfHours(time_t time)
78 {
79  return (time % SECS_PER_DAY) / SECS_PER_HOUR;
80 }
81 
83 inline constexpr dtDays_t dayOfWeek(time_t time)
84 {
85  return dtDays_t((time / SECS_PER_DAY + 4) % DAYS_PER_WEEK);
86 }
87 
89 inline constexpr uint8_t elapsedDays(time_t time)
90 {
91  return time / SECS_PER_DAY;
92 }
93 
95 inline constexpr unsigned elapsedSecsToday(time_t time)
96 {
97  return time % SECS_PER_DAY;
98 }
99 
101 inline constexpr time_t previousMidnight(time_t time)
102 {
103  return (time / SECS_PER_DAY) * SECS_PER_DAY;
104 }
105 
107 inline constexpr time_t nextMidnight(time_t time)
108 {
110 }
111 
113 inline constexpr unsigned elapsedSecsThisWeek(time_t time)
114 {
116 }
117 
135 class DateTime
136 {
137 public:
141  {
142  }
143 
147  DateTime(time_t time)
148  {
149  setTime(time);
150  }
151 
155  operator time_t()
156  {
157  return toUnixTime();
158  }
159 
163  void setTime(time_t time);
164 
173  void setTime(uint8_t sec, uint8_t min, uint8_t hour, uint8_t day, uint8_t month, uint16_t year)
174  {
175  Second = sec;
176  Minute = min;
177  Hour = hour;
178  Day = day;
179  Month = month;
180  Year = year;
181  Milliseconds = 0;
182  calcDayOfYear();
183  }
184 
191  bool fromHttpDate(const String& httpDate);
192 
214  bool fromISO8601(const String& datetime);
215 
219  bool isNull() const;
220 
225  time_t toUnixTime() const;
226 
231 
236  String toShortTimeString(bool includeSeconds = false) const;
237 
242 
246  String toISO8601() const;
247 
252 
256  void addMilliseconds(long add);
257 
258  // functions to convert to and from time components (hrs, secs, days, years etc) to time_t
275  static void fromUnixTime(time_t timep, uint8_t* psec, uint8_t* pmin, uint8_t* phour, uint8_t* pday, uint8_t* pwday,
276  uint8_t* pmonth, uint16_t* pyear);
277 
278  // functions to convert to and from time components (hrs, secs, days, years etc) to time_t
279 
292  static time_t toUnixTime(int sec, int min, int hour, int day, uint8_t month, uint16_t year);
293 
337  String format(const char* formatString) const;
338 
344  String format(const String& formatString) const
345  {
346  return format(formatString.c_str());
347  }
348 
349  static bool isLeapYear(uint16_t year);
350  static uint8_t getMonthDays(uint8_t month, uint16_t year);
351  static String getLocaleDayName(uint8_t day);
352  static String getLocaleMonthName(uint8_t month);
353  static String getIsoDayName(uint8_t day);
354  static String getIsoMonthName(uint8_t month);
355  static uint16_t getDaysInYear(uint16_t year);
356 
357 private:
358  // Helper methods
359  void calcDayOfYear(); // Calculate day of year
360  uint8_t calcWeek(uint8_t firstDay) const; // Calculate week number based on firstDay of week
361 
362 public:
363  uint8_t Hour = 0;
364  uint8_t Minute = 0;
365  uint8_t Second = 0;
366  uint16_t Milliseconds = 0;
367  uint8_t Day = 0;
368  uint8_t DayofWeek = 0;
369  uint16_t DayofYear = 0;
370  uint8_t Month = 0;
371  uint16_t Year = 0;
372 };
373 
Date and time class.
Definition: DateTime.h:136
time_t toUnixTime() const
Get Unix time.
bool fromISO8601(const String &datetime)
Parse an ISO8601 date/time string.
uint8_t Minute
Minute (0-59)
Definition: DateTime.h:364
String format(const char *formatString) const
Create string formatted with time and date placeholders.
uint8_t Hour
Hour (0-23)
Definition: DateTime.h:363
bool isNull() const
Check if time date object is initialised.
DateTime(time_t time)
Instantiate a date and time object from a Unix timestamp.
Definition: DateTime.h:147
DateTime()
Instantiate an uninitialised date and time object.
Definition: DateTime.h:140
uint8_t Second
Second (0-59)
Definition: DateTime.h:365
uint16_t DayofYear
Day of year (0-365)
Definition: DateTime.h:369
uint16_t Milliseconds
Milliseconds (0-999)
Definition: DateTime.h:366
void addMilliseconds(long add)
Add time to date time object.
String toFullDateTimeString() const
Get human readable date and time.
String format(const String &formatString) const
Create string formatted with time and date placeholders.
Definition: DateTime.h:344
String toHTTPDate() const
Get human readable date and time.
void setTime(time_t time)
Set time using Unix timestamp.
static uint8_t getMonthDays(uint8_t month, uint16_t year)
static String getIsoMonthName(uint8_t month)
static String getIsoDayName(uint8_t day)
uint8_t DayofWeek
Day of week (0-6 Sunday is day 0)
Definition: DateTime.h:368
String toISO8601() const
Get human readable date and time.
static time_t toUnixTime(int sec, int min, int hour, int day, uint8_t month, uint16_t year)
Convert from individual time components to Unix time.
bool fromHttpDate(const String &httpDate)
Parse a HTTP full date and set time and date.
String toShortTimeString(bool includeSeconds=false) const
Get human readable time.
static bool isLeapYear(uint16_t year)
void setTime(uint8_t sec, uint8_t min, uint8_t hour, uint8_t day, uint8_t month, uint16_t year)
Set time using time and date component values.
Definition: DateTime.h:173
static void fromUnixTime(time_t timep, uint8_t *psec, uint8_t *pmin, uint8_t *phour, uint8_t *pday, uint8_t *pwday, uint8_t *pmonth, uint16_t *pyear)
Convert from Unix time to individual time components.
static String getLocaleMonthName(uint8_t month)
static String getLocaleDayName(uint8_t day)
uint16_t Year
Full Year number.
Definition: DateTime.h:371
String toShortDateString() const
Get human readable date.
uint8_t Day
Day of month (1-31)
Definition: DateTime.h:367
static uint16_t getDaysInYear(uint16_t year)
uint8_t Month
Month (0-11 Jan is month 0)
Definition: DateTime.h:370
The String class.
Definition: WString.h:137
const char * c_str() const
Get a constant (un-modifiable) pointer to String content.
Definition: WString.h:616
#define SECS_PER_HOUR
Definition: DateTime.h:26
constexpr time_t previousMidnight(time_t time)
Definition: DateTime.h:101
constexpr uint8_t numberOfHours(time_t time)
Definition: DateTime.h:77
dtMonth_t
Months.
Definition: DateTime.h:47
#define SECS_PER_MIN
Definition: DateTime.h:25
constexpr dtDays_t dayOfWeek(time_t time)
Definition: DateTime.h:83
dtDays_t
Days of week.
Definition: DateTime.h:35
constexpr uint8_t elapsedDays(time_t time)
Definition: DateTime.h:89
constexpr time_t nextMidnight(time_t time)
Definition: DateTime.h:107
constexpr unsigned elapsedSecsToday(time_t time)
Definition: DateTime.h:95
#define DAYS_PER_WEEK
Definition: DateTime.h:28
constexpr unsigned elapsedSecsThisWeek(time_t time)
Definition: DateTime.h:113
constexpr uint8_t numberOfMinutes(time_t time)
Definition: DateTime.h:71
#define SECS_PER_DAY
Definition: DateTime.h:27
constexpr uint8_t numberOfSeconds(time_t time)
Definition: DateTime.h:65
@ dtMarch
Definition: DateTime.h:50
@ dtJanuary
Definition: DateTime.h:48
@ dtFebruary
Definition: DateTime.h:49
@ dtOctober
Definition: DateTime.h:57
@ dtJune
Definition: DateTime.h:53
@ dtMay
Definition: DateTime.h:52
@ dtApril
Definition: DateTime.h:51
@ dtJuly
Definition: DateTime.h:54
@ dtNovember
Definition: DateTime.h:58
@ dtAugust
Definition: DateTime.h:55
@ dtSeptember
Definition: DateTime.h:56
@ dtDecember
Definition: DateTime.h:59
@ dtWednesday
Definition: DateTime.h:39
@ dtMonday
Definition: DateTime.h:37
@ dtTuesday
Definition: DateTime.h:38
@ dtSunday
Definition: DateTime.h:36
@ dtFriday
Definition: DateTime.h:41
@ dtThursday
Definition: DateTime.h:40
@ dtSaturday
Definition: DateTime.h:42
Time< T > time(Unit unit, T value)
Helper function to create a Time and deduce the type.
Definition: NanoTime.h:423