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 60
26 #define SECS_PER_HOUR 3600
27 #define SECS_PER_DAY (SECS_PER_HOUR * 24)
28 #define MINS_PER_HOUR 60
29 #define DAYS_PER_WEEK 7
30 #define SECS_PER_WEEK (SECS_PER_DAY * DAYS_PER_WEEK)
31 #define SECS_PER_YEAR (SECS_PER_WEEK * 52)
32 #define SECS_YR_2000 946681200
33 
36 enum dtDays_t {
44 };
45 
48 enum dtMonth_t {
61 };
62 
63 /* Useful functions for getting elapsed time */
64 
66 inline constexpr uint8_t numberOfSeconds(time_t time)
67 {
68  return time % SECS_PER_MIN;
69 }
70 
72 inline constexpr uint8_t numberOfMinutes(time_t time)
73 {
74  return (time / SECS_PER_MIN) % SECS_PER_MIN;
75 }
76 
78 inline constexpr uint8_t numberOfHours(time_t time)
79 {
80  return (time % SECS_PER_DAY) / SECS_PER_HOUR;
81 }
82 
84 inline constexpr dtDays_t dayOfWeek(time_t time)
85 {
86  return dtDays_t((time / SECS_PER_DAY + 4) % DAYS_PER_WEEK);
87 }
88 
90 inline constexpr uint8_t elapsedDays(time_t time)
91 {
92  return time / SECS_PER_DAY;
93 }
94 
96 inline constexpr unsigned elapsedSecsToday(time_t time)
97 {
98  return time % SECS_PER_DAY;
99 }
100 
102 inline constexpr time_t previousMidnight(time_t time)
103 {
104  return (time / SECS_PER_DAY) * SECS_PER_DAY;
105 }
106 
108 inline constexpr time_t nextMidnight(time_t time)
109 {
111 }
112 
114 inline constexpr unsigned elapsedSecsThisWeek(time_t time)
115 {
117 }
118 
138 class DateTime
139 {
140 public:
144  struct ZoneInfo {
148  struct Tag {
149  static constexpr size_t maxSize = 5;
150  char value[maxSize + 1];
151 
156  static Tag fromString(const char* s);
157  static Tag fromString(const char* s, size_t len);
160  operator const char*() const
161  {
162  return value;
163  }
164  };
165 
166  Tag tag{};
167  int16_t offsetMins{0};
168  bool isDst{false};
169 
173  int offsetSecs() const
174  {
175  return int(offsetMins) * SECS_PER_MIN;
176  }
177 
181  String getOffsetString(char sep) const;
182  };
183 
186  DateTime() = default;
187 
191  DateTime(time_t time)
192  {
193  setTime(time);
194  }
195 
199  operator time_t()
200  {
201  return toUnixTime();
202  }
203 
207  void setTime(time_t time);
208 
217  void setTime(uint8_t sec, uint8_t min, uint8_t hour, uint8_t day, uint8_t month, uint16_t year)
218  {
219  setTime(toUnixTime(sec, min, hour, day, month, year));
220  }
221 
227  bool fromHttpDate(const String& httpDate);
228 
236  static bool fromHttpDate(const String& httpDate, time_t& time);
237 
245  bool fromISO8601(const String& datetime, ZoneInfo* zone = nullptr);
246 
278  static bool fromISO8601(const String& datetime, time_t& time, uint16_t& milliseconds, int16_t& offsetMins);
279 
283  bool isNull() const;
284 
289  time_t toUnixTime() const;
290 
295 
300  String toShortTimeString(bool includeSeconds = false) const;
301 
306 
313  String toISO8601(const ZoneInfo* zone = nullptr) const;
314 
319 
324  void addMilliseconds(long add);
325 
340  static void fromUnixTime(time_t timep, uint8_t* psec, uint8_t* pmin, uint8_t* phour, uint8_t* pday, uint8_t* pwday,
341  uint8_t* pmonth, uint16_t* pyear);
342 
355  static time_t toUnixTime(int sec, int min, int hour, int day, uint8_t month, uint16_t year);
356 
406  String format(const char* formatString, const ZoneInfo* zone = nullptr) const;
407 
414  String format(const String& formatString, const ZoneInfo* zone = nullptr) const
415  {
416  return format(formatString.c_str(), zone);
417  }
418 
423  static bool isLeapYear(uint16_t year);
424  static uint8_t getMonthDays(uint8_t month, uint16_t year);
425  static String getLocaleDayName(uint8_t day);
426  static String getLocaleMonthName(uint8_t month);
427  static String getIsoDayName(uint8_t day);
428  static String getIsoMonthName(uint8_t month);
429  static uint16_t getDaysInYear(uint16_t year);
432 private:
433  // Helper methods
434  void calcDayOfYear();
435 
436  // Calculate week number based on firstDay of week
437  uint8_t getWeekOfYear(dtDays_t firstDay) const;
438 
439 public:
440  uint16_t Year = 0;
441  uint16_t DayofYear = 0;
442  uint8_t DayofWeek = 0;
443  uint8_t Month = 0;
444  uint8_t Day = 0;
445  uint8_t Hour = 0;
446  uint8_t Minute = 0;
447  uint8_t Second = 0;
448  uint16_t Milliseconds = 0;
449 };
450 
Date and time class.
Definition: DateTime.h:139
time_t toUnixTime() const
Get Unix time.
uint8_t Minute
Minute (0-59)
Definition: DateTime.h:446
uint8_t Hour
Hour (0-23)
Definition: DateTime.h:445
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:191
uint8_t Second
Second (0-59)
Definition: DateTime.h:447
uint16_t DayofYear
Day of year (0-365)
Definition: DateTime.h:441
String toISO8601(const ZoneInfo *zone=nullptr) const
Get human readable date and time.
uint16_t Milliseconds
Milliseconds (0-999)
Definition: DateTime.h:448
void addMilliseconds(long add)
Add time to date time object.
String toFullDateTimeString() const
Get human readable date and time.
String format(const char *formatString, const ZoneInfo *zone=nullptr) const
Create string formatted with time and date placeholders.
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:442
bool fromISO8601(const String &datetime, ZoneInfo *zone=nullptr)
Parse an ISO8601 date/time string.
static bool fromHttpDate(const String &httpDate, time_t &time)
Parse a HTTP full date string and return the time_t value.
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.
static bool fromISO8601(const String &datetime, time_t &time, uint16_t &milliseconds, int16_t &offsetMins)
Parse an ISO8601 date/time string and return discrete components.
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:217
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:440
String format(const String &formatString, const ZoneInfo *zone=nullptr) const
Create string formatted with time and date placeholders.
Definition: DateTime.h:414
String toShortDateString() const
Get human readable date.
DateTime()=default
Instantiate an uninitialised date and time object.
uint8_t Day
Day of month (1-31)
Definition: DateTime.h:444
static uint16_t getDaysInYear(uint16_t year)
uint8_t Month
Month (0-11 Jan is month 0)
Definition: DateTime.h:443
The String class.
Definition: WString.h:133
const char * c_str() const
Get a constant (un-modifiable) pointer to String content.
Definition: WString.h:609
#define SECS_PER_HOUR
Definition: DateTime.h:26
constexpr time_t previousMidnight(time_t time)
Definition: DateTime.h:102
constexpr uint8_t numberOfHours(time_t time)
Definition: DateTime.h:78
dtMonth_t
Months.
Definition: DateTime.h:48
#define SECS_PER_MIN
Definition: DateTime.h:25
constexpr dtDays_t dayOfWeek(time_t time)
Definition: DateTime.h:84
dtDays_t
Days of week.
Definition: DateTime.h:36
constexpr uint8_t elapsedDays(time_t time)
Definition: DateTime.h:90
constexpr time_t nextMidnight(time_t time)
Definition: DateTime.h:108
constexpr unsigned elapsedSecsToday(time_t time)
Definition: DateTime.h:96
#define DAYS_PER_WEEK
Definition: DateTime.h:29
constexpr unsigned elapsedSecsThisWeek(time_t time)
Definition: DateTime.h:114
constexpr uint8_t numberOfMinutes(time_t time)
Definition: DateTime.h:72
#define SECS_PER_DAY
Definition: DateTime.h:27
constexpr uint8_t numberOfSeconds(time_t time)
Definition: DateTime.h:66
@ dtMarch
Definition: DateTime.h:51
@ dtJanuary
Definition: DateTime.h:49
@ dtFebruary
Definition: DateTime.h:50
@ dtOctober
Definition: DateTime.h:58
@ dtJune
Definition: DateTime.h:54
@ dtMay
Definition: DateTime.h:53
@ dtApril
Definition: DateTime.h:52
@ dtJuly
Definition: DateTime.h:55
@ dtNovember
Definition: DateTime.h:59
@ dtAugust
Definition: DateTime.h:56
@ dtSeptember
Definition: DateTime.h:57
@ dtDecember
Definition: DateTime.h:60
@ dtWednesday
Definition: DateTime.h:40
@ dtMonday
Definition: DateTime.h:38
@ dtTuesday
Definition: DateTime.h:39
@ dtSunday
Definition: DateTime.h:37
@ dtFriday
Definition: DateTime.h:42
@ dtThursday
Definition: DateTime.h:41
@ dtSaturday
Definition: DateTime.h:43
Time< T > time(Unit unit, T value)
Helper function to create a Time and deduce the type.
Definition: NanoTime.h:432
Type for timezone abbreviation such as "GMT", "EEST".
Definition: DateTime.h:148
static Tag fromString(const char *s)
char value[maxSize+1]
Definition: DateTime.h:150
static constexpr size_t maxSize
Definition: DateTime.h:149
static Tag fromString(const char *s, size_t len)
Basic information required when displaying or handling local times.
Definition: DateTime.h:144
int16_t offsetMins
Offset from UTC in minutes.
Definition: DateTime.h:167
bool isDst
True if daylight savings is in effect.
Definition: DateTime.h:168
String getOffsetString(char sep) const
Return offset in ISO8601 string format, e.g. +11:00.
int offsetSecs() const
Get the offset in seconds so it can be added/subtracted directly from a time_t value.
Definition: DateTime.h:173
Tag tag
Abbreviation such as "GMT", "EEST" shown after time.
Definition: DateTime.h:166