AceTime  1.7.5
Date and time classes for Arduino that support timezones from the TZ Database, and a system clock that can synchronize from an NTP server or an RTC chip.
ZonedDateTime.h
1 /*
2  * MIT License
3  * Copyright (c) 2018 Brian T. Park
4  */
5 
6 #ifndef ACE_TIME_ZONED_DATE_TIME_H
7 #define ACE_TIME_ZONED_DATE_TIME_H
8 
9 #include <stdint.h>
10 #include "common/compat.h"
11 #include "OffsetDateTime.h"
12 #include "TimeZone.h"
13 
14 class Print;
15 
16 namespace ace_time {
17 
33  public:
50  static ZonedDateTime forComponents(int16_t year, uint8_t month, uint8_t day,
51  uint8_t hour, uint8_t minute, uint8_t second,
52  const TimeZone& timeZone) {
55  auto odt = timeZone.getOffsetDateTime(ldt);
56  return ZonedDateTime(odt, timeZone);
57  }
58 
70  static ZonedDateTime forEpochSeconds(acetime_t epochSeconds,
71  const TimeZone& timeZone) {
72  OffsetDateTime odt;
73  if (epochSeconds == LocalDate::kInvalidEpochSeconds) {
75  } else {
77  odt = OffsetDateTime::forEpochSeconds(epochSeconds, timeOffset);
78  }
79  return ZonedDateTime(odt, timeZone);
80  }
81 
91  static ZonedDateTime forUnixSeconds(acetime_t unixSeconds,
92  const TimeZone& timeZone) {
93  acetime_t epochSeconds = (unixSeconds == LocalDate::kInvalidEpochSeconds)
94  ? unixSeconds
95  : unixSeconds - LocalDate::kSecondsSinceUnixEpoch;
96  return forEpochSeconds(epochSeconds, timeZone);
97  }
98 
112  static ZonedDateTime forDateString(const char* dateString) {
115  }
116 
121  static ZonedDateTime forDateString(const __FlashStringHelper* dateString) {
124  }
125 
129  }
130 
132  explicit ZonedDateTime() {}
133 
135  bool isError() const { return mOffsetDateTime.isError(); }
136 
138  int16_t year() const { return mOffsetDateTime.year(); }
139 
141  void year(int16_t year) { mOffsetDateTime.year(year); }
142 
148  int8_t yearTiny() const { return mOffsetDateTime.yearTiny(); }
149 
155  void yearTiny(int8_t yearTiny) { mOffsetDateTime.yearTiny(yearTiny); }
156 
158  uint8_t month() const { return mOffsetDateTime.month(); }
159 
161  void month(uint8_t month) { mOffsetDateTime.month(month); }
162 
164  uint8_t day() const { return mOffsetDateTime.day(); }
165 
167  void day(uint8_t day) { mOffsetDateTime.day(day); }
168 
170  uint8_t hour() const { return mOffsetDateTime.hour(); }
171 
173  void hour(uint8_t hour) { mOffsetDateTime.hour(hour); }
174 
176  uint8_t minute() const { return mOffsetDateTime.minute(); }
177 
179  void minute(uint8_t minute) { mOffsetDateTime.minute(minute); }
180 
182  uint8_t second() const { return mOffsetDateTime.second(); }
183 
185  void second(uint8_t second) { mOffsetDateTime.second(second); }
186 
191  uint8_t dayOfWeek() const { return mOffsetDateTime.dayOfWeek(); }
192 
194  const TimeZone& timeZone() const { return mTimeZone; }
195 
200  void timeZone(const TimeZone& timeZone) { mTimeZone = timeZone; }
201 
203  TimeOffset timeOffset() const { return mOffsetDateTime.timeOffset(); }
204 
206  const LocalDateTime& localDateTime() const {
207  return mOffsetDateTime.localDateTime();
208  }
209 
226  void normalize() {
227  mOffsetDateTime = mTimeZone.getOffsetDateTime(localDateTime());
228  }
229 
235  acetime_t epochSeconds = toEpochSeconds();
236  return ZonedDateTime::forEpochSeconds(epochSeconds, timeZone);
237  }
238 
243  acetime_t toEpochDays() const {
244  return mOffsetDateTime.toEpochDays();
245  }
246 
248  acetime_t toUnixDays() const {
251  }
252 
261  acetime_t toEpochSeconds() const {
262  return mOffsetDateTime.toEpochSeconds();
263  }
264 
272  acetime_t toUnixSeconds() const {
273  return mOffsetDateTime.toUnixSeconds();
274  }
275 
292  int8_t compareTo(const ZonedDateTime& that) const {
293  return mOffsetDateTime.compareTo(that.mOffsetDateTime);
294  }
295 
301  void printTo(Print& printer) const;
302 
303  // Use default copy constructor and assignment operator.
304  ZonedDateTime(const ZonedDateTime&) = default;
305  ZonedDateTime& operator=(const ZonedDateTime&) = default;
306 
307  private:
309  static const uint8_t kDateStringLength = 25;
310 
311  friend bool operator==(const ZonedDateTime& a, const ZonedDateTime& b);
312 
314  ZonedDateTime(const OffsetDateTime& offsetDateTime, const TimeZone& tz):
315  mOffsetDateTime(offsetDateTime),
316  mTimeZone(tz) {}
317 
318  OffsetDateTime mOffsetDateTime;
319  TimeZone mTimeZone;
320 };
321 
329 inline bool operator==(const ZonedDateTime& a, const ZonedDateTime& b) {
330  return a.mOffsetDateTime == b.mOffsetDateTime
331  && a.mTimeZone == b.mTimeZone;
332 }
333 
335 inline bool operator!=(const ZonedDateTime& a, const ZonedDateTime& b) {
336  return ! (a == b);
337 }
338 
339 }
340 
341 #endif
ace_time::ZonedDateTime::second
uint8_t second() const
Return the second.
Definition: ZonedDateTime.h:182
ace_time::LocalDate::kSecondsSinceUnixEpoch
static const acetime_t kSecondsSinceUnixEpoch
Number of seconds from Unix epoch (1970-01-01 00:00:00Z) to the AceTime epoch (2000-01-01 00:00:00Z).
Definition: LocalDate.h:69
ace_time::OffsetDateTime::toUnixSeconds
acetime_t toUnixSeconds() const
Return the number of seconds from Unix epoch 1970-01-01 00:00:00Z.
Definition: OffsetDateTime.h:275
ace_time::OffsetDateTime::forDateString
static OffsetDateTime forDateString(const char *dateString)
Factory method.
Definition: OffsetDateTime.cpp:24
ace_time::LocalDate::kInvalidEpochSeconds
static const acetime_t kInvalidEpochSeconds
Sentinel epochSeconds which indicates an error.
Definition: LocalDate.h:63
ace_time::LocalDateTime
Class that holds the date-time as the components (year, month, day, hour, minute, second) without reg...
Definition: LocalDateTime.h:30
ace_time::ZonedDateTime::operator==
friend bool operator==(const ZonedDateTime &a, const ZonedDateTime &b)
Return true if two ZonedDateTime objects are equal in all components.
Definition: ZonedDateTime.h:329
ace_time::LocalDate::kInvalidEpochDays
static const acetime_t kInvalidEpochDays
Sentinel epochDays which indicates an error.
Definition: LocalDate.h:60
ace_time::OffsetDateTime::toEpochSeconds
acetime_t toEpochSeconds() const
Return seconds since AceTime epoch (2000-01-01 00:00:00Z), taking into account the offset zone.
Definition: OffsetDateTime.h:263
ace_time::OffsetDateTime::month
uint8_t month() const
Return the month with January=1, December=12.
Definition: OffsetDateTime.h:180
ace_time::TimeOffset
A thin wrapper that represents a time offset from a reference point, usually 00:00 at UTC,...
Definition: TimeOffset.h:56
ace_time::ZonedDateTime::timeZone
void timeZone(const TimeZone &timeZone)
Set the time zone.
Definition: ZonedDateTime.h:200
ace_time::ZonedDateTime::localDateTime
const LocalDateTime & localDateTime() const
Return the LocalDateTime of the components.
Definition: ZonedDateTime.h:206
ace_time::OffsetDateTime::forEpochSeconds
static OffsetDateTime forEpochSeconds(acetime_t epochSeconds, TimeOffset timeOffset)
Factory method.
Definition: OffsetDateTime.h:71
ace_time::OffsetDateTime::yearTiny
int8_t yearTiny() const
Return the single-byte year offset from year 2000.
Definition: OffsetDateTime.h:170
ace_time::ZonedDateTime::hour
uint8_t hour() const
Return the hour.
Definition: ZonedDateTime.h:170
ace_time::TimeZone::getUtcOffset
TimeOffset getUtcOffset(acetime_t epochSeconds) const
Return the total UTC offset at epochSeconds, including DST offset.
Definition: TimeZone.h:268
ace_time::ZonedDateTime::forEpochSeconds
static ZonedDateTime forEpochSeconds(acetime_t epochSeconds, const TimeZone &timeZone)
Factory method.
Definition: ZonedDateTime.h:70
ace_time::ZonedDateTime::compareTo
int8_t compareTo(const ZonedDateTime &that) const
Compare 'this' ZonedDateTime with 'that' ZonedDateTime, and return (<0, 0, >0) according to whether t...
Definition: ZonedDateTime.h:292
ace_time::ZonedDateTime::minute
void minute(uint8_t minute)
Set the minute.
Definition: ZonedDateTime.h:179
ace_time::OffsetDateTime::dayOfWeek
uint8_t dayOfWeek() const
Return the day of the week, Monday=1, Sunday=7 (per ISO 8601).
Definition: OffsetDateTime.h:210
ace_time::ZonedDateTime::toUnixSeconds
acetime_t toUnixSeconds() const
Return the number of seconds from Unix epoch 1970-01-01 00:00:00Z.
Definition: ZonedDateTime.h:272
ace_time::TimeZone::getOffsetDateTime
OffsetDateTime getOffsetDateTime(const LocalDateTime &ldt) const
Return the best estimate of the OffsetDateTime at the given LocalDateTime for the current TimeZone.
Definition: TimeZone.h:344
ace_time::LocalDateTime::forComponents
static LocalDateTime forComponents(int16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second)
Factory method using separated date and time components.
Definition: LocalDateTime.h:43
ace_time::OffsetDateTime
The date (year, month, day), time (hour, minute, second) and offset from UTC (timeOffset).
Definition: OffsetDateTime.h:33
compat.h
ace_time::ZonedDateTime::timeZone
const TimeZone & timeZone() const
Return the time zone of the ZonedDateTime.
Definition: ZonedDateTime.h:194
ace_time::ZonedDateTime::second
void second(uint8_t second)
Set the second.
Definition: ZonedDateTime.h:185
ace_time::OffsetDateTime::forError
static OffsetDateTime forError()
Factory method that returns an instance whose isError() is true.
Definition: OffsetDateTime.h:146
ace_time::ZonedDateTime::year
int16_t year() const
Return the year.
Definition: ZonedDateTime.h:138
ace_time::OffsetDateTime::second
uint8_t second() const
Return the second.
Definition: OffsetDateTime.h:204
ace_time::ZonedDateTime::forDateString
static ZonedDateTime forDateString(const char *dateString)
Factory method.
Definition: ZonedDateTime.h:112
ace_time::ZonedDateTime::forUnixSeconds
static ZonedDateTime forUnixSeconds(acetime_t unixSeconds, const TimeZone &timeZone)
Factory method to create a ZonedDateTime using the number of seconds from Unix epoch.
Definition: ZonedDateTime.h:91
ace_time::ZonedDateTime::printTo
void printTo(Print &printer) const
Print ZonedDateTime to 'printer'.
Definition: ZonedDateTime.cpp:12
ace_time::OffsetDateTime::compareTo
int8_t compareTo(const OffsetDateTime &that) const
Compare 'this' OffsetDateTime with 'that' OffsetDateTime, and return (<0, 0, >0) according to whether...
Definition: OffsetDateTime.h:296
ace_time::ZonedDateTime::forComponents
static ZonedDateTime forComponents(int16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second, const TimeZone &timeZone)
Factory method using separated date, time, and time zone fields.
Definition: ZonedDateTime.h:50
ace_time::ZonedDateTime::month
uint8_t month() const
Return the month with January=1, December=12.
Definition: ZonedDateTime.h:158
ace_time::ZonedDateTime::isError
bool isError() const
Return true if any component indicates an error condition.
Definition: ZonedDateTime.h:135
ace_time::ZonedDateTime::minute
uint8_t minute() const
Return the minute.
Definition: ZonedDateTime.h:176
ace_time::ZonedDateTime::toEpochSeconds
acetime_t toEpochSeconds() const
Return seconds since AceTime epoch (2000-01-01 00:00:00Z), taking into account the time zone.
Definition: ZonedDateTime.h:261
ace_time::OffsetDateTime::timeOffset
TimeOffset timeOffset() const
Return the offset zone of the OffsetDateTime.
Definition: OffsetDateTime.h:213
ace_time::ZonedDateTime
The date (year, month, day), time (hour, minute, second), and a timeZone representing an instant in t...
Definition: ZonedDateTime.h:32
ace_time::OffsetDateTime::day
uint8_t day() const
Return the day of the month.
Definition: OffsetDateTime.h:186
ace_time::ZonedDateTime::timeOffset
TimeOffset timeOffset() const
Return the offset zone of the OffsetDateTime.
Definition: ZonedDateTime.h:203
ace_time::OffsetDateTime::minute
uint8_t minute() const
Return the minute.
Definition: OffsetDateTime.h:198
ace_time::ZonedDateTime::forError
static ZonedDateTime forError()
Return an instance whose isError() returns true.
Definition: ZonedDateTime.h:127
ace_time::ZonedDateTime::toUnixDays
acetime_t toUnixDays() const
Return the number of days since Unix epoch (1970-01-01 00:00:00).
Definition: ZonedDateTime.h:248
ace_time::ZonedDateTime::day
void day(uint8_t day)
Set the day of the month.
Definition: ZonedDateTime.h:167
ace_time::ZonedDateTime::month
void month(uint8_t month)
Set the month.
Definition: ZonedDateTime.h:161
ace_time::ZonedDateTime::yearTiny
void yearTiny(int8_t yearTiny)
Set the single-byte year offset from year 2000.
Definition: ZonedDateTime.h:155
ace_time::OffsetDateTime::isError
bool isError() const
Return true if any component indicates an error condition.
Definition: OffsetDateTime.h:154
ace_time::OffsetDateTime::hour
uint8_t hour() const
Return the hour.
Definition: OffsetDateTime.h:192
ace_time::TimeZone
Class that describes a time zone.
Definition: TimeZone.h:85
ace_time::ZonedDateTime::toEpochDays
acetime_t toEpochDays() const
Return number of whole days since AceTime epoch (2000-01-01 00:00:00Z), taking into account the time ...
Definition: ZonedDateTime.h:243
ace_time::ZonedDateTime::convertToTimeZone
ZonedDateTime convertToTimeZone(const TimeZone &timeZone) const
Create a ZonedDateTime in a different time zone (with the same epochSeconds).
Definition: ZonedDateTime.h:234
ace_time::TimeZone::forTimeOffset
static TimeZone forTimeOffset(TimeOffset stdOffset, TimeOffset dstOffset=TimeOffset())
Factory method to create from a UTC offset and an optional DST offset.
Definition: TimeZone.h:114
ace_time::ZonedDateTime::dayOfWeek
uint8_t dayOfWeek() const
Return the day of the week using ISO 8601 numbering where Monday=1 and Sunday=7.
Definition: ZonedDateTime.h:191
ace_time::LocalDate::kDaysSinceUnixEpoch
static const acetime_t kDaysSinceUnixEpoch
Number of days from Unix epoch (1970-01-01 00:00:00Z) to the AceTime epoch (2000-01-01 00:00:00Z).
Definition: LocalDate.h:75
ace_time::OffsetDateTime::localDateTime
const LocalDateTime & localDateTime() const
Return the LocalDateTime.
Definition: OffsetDateTime.h:219
ace_time::ZonedDateTime::normalize
void normalize()
Normalize the ZonedDateTime after mutation.
Definition: ZonedDateTime.h:226
ace_time::ZonedDateTime::day
uint8_t day() const
Return the day of the month.
Definition: ZonedDateTime.h:164
ace_time::ZonedDateTime::hour
void hour(uint8_t hour)
Set the hour.
Definition: ZonedDateTime.h:173
ace_time::ZonedDateTime::year
void year(int16_t year)
Set the year given the full year.
Definition: ZonedDateTime.h:141
ace_time::ZonedDateTime::ZonedDateTime
ZonedDateTime()
Default constructor.
Definition: ZonedDateTime.h:132
ace_time::OffsetDateTime::year
int16_t year() const
Return the year.
Definition: OffsetDateTime.h:160
ace_time::OffsetDateTime::toEpochDays
acetime_t toEpochDays() const
Return number of whole days since AceTime epoch (2000-01-01 00:00:00Z), taking into account the offse...
Definition: OffsetDateTime.h:240
ace_time::ZonedDateTime::forDateString
static ZonedDateTime forDateString(const __FlashStringHelper *dateString)
Factory method.
Definition: ZonedDateTime.h:121
ace_time::ZonedDateTime::yearTiny
int8_t yearTiny() const
Return the single-byte year offset from year 2000.
Definition: ZonedDateTime.h:148