AceTime  1.7.2
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.
TimeOffset.h
1 /*
2  * MIT License
3  * Copyright (c) 2018 Brian T. Park
4  */
5 
6 #ifndef ACE_TIME_TIME_OFFSET_H
7 #define ACE_TIME_TIME_OFFSET_H
8 
9 #include <stdint.h>
10 
11 class Print;
12 
13 namespace ace_time {
14 
15 // These functions need to set the mMinutes and it seemed inefficient to
16 // go through the factory method and assignment operator, so I expose
17 // setMinutes() to them for efficiency.
18 class TimeOffset;
19 namespace time_offset_mutation {
20 void incrementHour(TimeOffset& offset);
21 void increment15Minutes(TimeOffset& offset);
22 }
23 
56 class TimeOffset {
57  public:
59  static const int16_t kErrorMinutes = INT16_MIN;
60 
65  static TimeOffset forHours(int8_t hours) {
66  return TimeOffset::forMinutes(hours * 60);
67  }
68 
77  static TimeOffset forHourMinute(int8_t hour, int8_t minute) {
78  int16_t minutes = hour * 60 + minute;
79  return TimeOffset(minutes);
80  }
81 
83  static TimeOffset forMinutes(int16_t minutes) {
84  return TimeOffset(minutes);
85  }
86 
92  static TimeOffset forOffsetString(const char* offsetString);
93 
102  static TimeOffset forOffsetStringChainable(const char*& offsetString);
103 
106 
108  explicit TimeOffset() {}
109 
111  int16_t toMinutes() const {
112  return mMinutes;
113  }
114 
116  int32_t toSeconds() const {
117  return (int32_t) 60 * toMinutes();
118  }
119 
125  void toHourMinute(int8_t& hour, int8_t& minute) const {
126  hour = mMinutes / 60;
127  minute = mMinutes % 60;
128  }
129 
135  bool isZero() const { return mMinutes == 0; }
136 
138  bool isError() const {
139  return mMinutes == kErrorMinutes;
140  }
141 
143  void printTo(Print& printer) const;
144 
145  // Use default copy constructor and assignment operator.
146  TimeOffset(const TimeOffset&) = default;
147  TimeOffset& operator=(const TimeOffset&) = default;
148 
149  private:
150  friend bool operator==(const TimeOffset& a, const TimeOffset& b);
151 
152  // Give access to setMinutes()
153  friend void time_offset_mutation::incrementHour(TimeOffset& offset);
154  friend void time_offset_mutation::increment15Minutes(TimeOffset& offset);
155 
157  static const uint8_t kTimeOffsetStringLength = 6;
158 
160  explicit TimeOffset(int16_t minutes):
161  mMinutes(minutes) {}
162 
164  void setMinutes(int16_t minutes) {
165  mMinutes = minutes;
166  }
167 
174  int16_t mMinutes = 0;
175 };
176 
177 inline bool operator==(const TimeOffset& a, const TimeOffset& b) {
178  return a.mMinutes == b.mMinutes;
179 }
180 
181 inline bool operator!=(const TimeOffset& a, const TimeOffset& b) {
182  return ! (a == b);
183 }
184 
185 }
186 
187 #endif
ace_time::TimeOffset::forError
static TimeOffset forError()
Return an error indicator.
Definition: TimeOffset.h:105
ace_time::TimeOffset::isError
bool isError() const
Return true if this TimeOffset represents an error.
Definition: TimeOffset.h:138
ace_time::TimeOffset::forOffsetStringChainable
static TimeOffset forOffsetStringChainable(const char *&offsetString)
Variant of forOffsetString() that updates the string pointer to the next unprocessed character.
Definition: TimeOffset.cpp:41
ace_time::TimeOffset::toSeconds
int32_t toSeconds() const
Return the time offset as seconds.
Definition: TimeOffset.h:116
ace_time::TimeOffset::forOffsetString
static TimeOffset forOffsetString(const char *offsetString)
Create from an offset string ("-07:00" or "+01:00").
Definition: TimeOffset.cpp:32
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::TimeOffset::printTo
void printTo(Print &printer) const
Print the human readable string.
Definition: TimeOffset.cpp:15
ace_time::TimeOffset::toMinutes
int16_t toMinutes() const
Return the time offset as minutes.
Definition: TimeOffset.h:111
ace_time::time_period_mutation::incrementHour
void incrementHour(TimePeriod &period, uint8_t limit)
Increment the hour by one, modulo 'limit'.
Definition: time_period_mutation.h:33
ace_time::TimeOffset::forHourMinute
static TimeOffset forHourMinute(int8_t hour, int8_t minute)
Create TimeOffset from (hour, minute) offset.
Definition: TimeOffset.h:77
ace_time::TimeOffset::forMinutes
static TimeOffset forMinutes(int16_t minutes)
Create TimeOffset from minutes from 00:00.
Definition: TimeOffset.h:83
ace_time::TimeOffset::toHourMinute
void toHourMinute(int8_t &hour, int8_t &minute) const
Extract hour and minute representation of the offset.
Definition: TimeOffset.h:125
ace_time::TimeOffset::kErrorMinutes
static const int16_t kErrorMinutes
Sentinel value that represents an error.
Definition: TimeOffset.h:59
ace_time::TimeOffset::forHours
static TimeOffset forHours(int8_t hours)
Create TimeOffset with the corresponding hour offset.
Definition: TimeOffset.h:65
ace_time::TimeOffset::isZero
bool isZero() const
Returns true if offset is 00:00.
Definition: TimeOffset.h:135
ace_time::time_offset_mutation::increment15Minutes
void increment15Minutes(TimeOffset &offset)
Increment the TimeOffset by 15 minute interval.
Definition: time_offset_mutation.h:36
ace_time::TimeOffset::TimeOffset
TimeOffset()
Constructor.
Definition: TimeOffset.h:108