This library takes the current time (which must be set to UTC, e.g. via an NTP call), and applies a timezone definition (loaded at startup) to calculate the local time. This includes the handling of daylight saving. See http://mbed.org/users/hlipka/notebook/time-zone-handling/ for more information (esp. how to get a time zone definition file).

Dependents:   CubiScan 000-FIN_youcef 005_ESSAI_youcef

Committer:
hlipka
Date:
Tue Feb 01 21:16:05 2011 +0000
Revision:
6:f4693f2d03e6
Parent:
5:fde01b92a384
Child:
7:0c7207d674d3
added support for day handling (stored as time=00:00:00)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hlipka 4:c84afcfbac84 1 #ifndef __TIME_H_
hlipka 4:c84afcfbac84 2 #define __TIME_H_
hlipka 4:c84afcfbac84 3
hlipka 4:c84afcfbac84 4 #include <time.h>
hlipka 4:c84afcfbac84 5 #include "stdio.h"
hlipka 4:c84afcfbac84 6 #include "string.h"
hlipka 4:c84afcfbac84 7 #include <list>
hlipka 4:c84afcfbac84 8
hlipka 4:c84afcfbac84 9 class Time;
hlipka 4:c84afcfbac84 10
hlipka 4:c84afcfbac84 11 /**
hlipka 4:c84afcfbac84 12 This class encapsulates a point in time - which means it will not change after it has been created.
hlipka 4:c84afcfbac84 13 */
hlipka 4:c84afcfbac84 14 class TimeStamp {
hlipka 4:c84afcfbac84 15 friend class Time;
hlipka 4:c84afcfbac84 16 public:
hlipka 4:c84afcfbac84 17 /**
hlipka 4:c84afcfbac84 18 @returns the year of the time stamp
hlipka 4:c84afcfbac84 19 */
hlipka 4:c84afcfbac84 20 int getYear() {
hlipka 4:c84afcfbac84 21 return _year+1900;
hlipka 4:c84afcfbac84 22 };
hlipka 4:c84afcfbac84 23
hlipka 4:c84afcfbac84 24 /**
hlipka 4:c84afcfbac84 25 @returns the month of the time stamp (January is 1)
hlipka 4:c84afcfbac84 26 */
hlipka 4:c84afcfbac84 27 int getMonth() {
hlipka 4:c84afcfbac84 28 return _mon+1;
hlipka 4:c84afcfbac84 29 };
hlipka 4:c84afcfbac84 30
hlipka 4:c84afcfbac84 31 int getDay() {
hlipka 4:c84afcfbac84 32 /**
hlipka 4:c84afcfbac84 33 @returns the day-of-the-month of the time stamp (starting with 1)
hlipka 4:c84afcfbac84 34 */
hlipka 4:c84afcfbac84 35 return _mday;
hlipka 4:c84afcfbac84 36 };
hlipka 4:c84afcfbac84 37
hlipka 4:c84afcfbac84 38 /**
hlipka 4:c84afcfbac84 39 @returns the hour of the time stamp (0-23)
hlipka 4:c84afcfbac84 40 */
hlipka 4:c84afcfbac84 41 int getHour() {
hlipka 4:c84afcfbac84 42 return _hour;
hlipka 4:c84afcfbac84 43 };
hlipka 4:c84afcfbac84 44
hlipka 4:c84afcfbac84 45 /**
hlipka 4:c84afcfbac84 46 @returns the minute of the time stamp (0-59)
hlipka 4:c84afcfbac84 47 */
hlipka 4:c84afcfbac84 48 int getMinute() {
hlipka 4:c84afcfbac84 49 return _min;
hlipka 4:c84afcfbac84 50 };
hlipka 4:c84afcfbac84 51
hlipka 4:c84afcfbac84 52 /**
hlipka 4:c84afcfbac84 53 @returns the second of the time stamp (0-59)
hlipka 4:c84afcfbac84 54 */
hlipka 4:c84afcfbac84 55 int getSecond() {
hlipka 4:c84afcfbac84 56 return _sec;
hlipka 4:c84afcfbac84 57 };
hlipka 4:c84afcfbac84 58
hlipka 4:c84afcfbac84 59 /**
hlipka 4:c84afcfbac84 60 get the day of the week - monday is 0
hlipka 4:c84afcfbac84 61 @returns the day-of-the-week of the time stamp
hlipka 4:c84afcfbac84 62 */
hlipka 4:c84afcfbac84 63 int getDayOfWeek() {
hlipka 4:c84afcfbac84 64 int dow=_wday;
hlipka 4:c84afcfbac84 65 dow--;
hlipka 4:c84afcfbac84 66 if (dow==-1)
hlipka 4:c84afcfbac84 67 dow=6;
hlipka 4:c84afcfbac84 68 return dow;
hlipka 4:c84afcfbac84 69 };
hlipka 4:c84afcfbac84 70
hlipka 4:c84afcfbac84 71 /**
hlipka 4:c84afcfbac84 72 @returns the day-of-the-year of the time stamp
hlipka 4:c84afcfbac84 73 */
hlipka 4:c84afcfbac84 74 /*
hlipka 4:c84afcfbac84 75 int getDayOfYear() {
hlipka 4:c84afcfbac84 76 return _yday;
hlipka 4:c84afcfbac84 77 };
hlipka 4:c84afcfbac84 78 */
hlipka 4:c84afcfbac84 79 /**
hlipka 4:c84afcfbac84 80 creates a new time stamp based on the UNIX time stamp (seconds since 1970)
hlipka 4:c84afcfbac84 81 */
hlipka 4:c84afcfbac84 82 TimeStamp(time_t unixTime) {
hlipka 4:c84afcfbac84 83 updateTime(unixTime);
hlipka 4:c84afcfbac84 84 };
hlipka 4:c84afcfbac84 85
hlipka 6:f4693f2d03e6 86 TimeStamp(int year, int mon, int day, int hour, int min, int sec, int wday)
hlipka 6:f4693f2d03e6 87 {
hlipka 6:f4693f2d03e6 88 _year=(char)(year-1900);
hlipka 6:f4693f2d03e6 89 _mon=(char)(mon-1);
hlipka 6:f4693f2d03e6 90 _mday=(char)day;
hlipka 6:f4693f2d03e6 91 _hour=(char)hour;
hlipka 6:f4693f2d03e6 92 _min=(char)min;
hlipka 6:f4693f2d03e6 93 _sec=(char)sec;
hlipka 6:f4693f2d03e6 94 _wday=(char)wday;
hlipka 6:f4693f2d03e6 95 }
hlipka 4:c84afcfbac84 96 ~TimeStamp() {
hlipka 4:c84afcfbac84 97 };
hlipka 4:c84afcfbac84 98
hlipka 4:c84afcfbac84 99 /**
hlipka 4:c84afcfbac84 100 @param ts the time stamp to compare to
hlipka 4:c84afcfbac84 101 @returns true when both timestamp are the same point in time
hlipka 4:c84afcfbac84 102 */
hlipka 4:c84afcfbac84 103 bool isSame(TimeStamp* ts);
hlipka 4:c84afcfbac84 104
hlipka 4:c84afcfbac84 105 /**
hlipka 4:c84afcfbac84 106 @param ts the time stamp to compare to
hlipka 4:c84afcfbac84 107 @return true when the current time stamp is before the given time stamp
hlipka 4:c84afcfbac84 108 */
hlipka 4:c84afcfbac84 109 bool isBefore(TimeStamp* ts);
hlipka 4:c84afcfbac84 110
hlipka 4:c84afcfbac84 111 /**
hlipka 4:c84afcfbac84 112 @returns time stamp transformed to ASCII (done by asctime() - but transformed to local time)
hlipka 4:c84afcfbac84 113 */
hlipka 4:c84afcfbac84 114 char *asChar() { struct tm * time=getTm();char *s=asctime(time); delete time;return s;};
hlipka 4:c84afcfbac84 115
hlipka 4:c84afcfbac84 116 /**
hlipka 4:c84afcfbac84 117 @param ts the time stamp to compare to
hlipka 4:c84afcfbac84 118 @return true when the current time stamp is after the given time stamp
hlipka 4:c84afcfbac84 119 */
hlipka 4:c84afcfbac84 120 bool isAfter(TimeStamp* ts);
hlipka 6:f4693f2d03e6 121 int getStartOfDay()
hlipka 6:f4693f2d03e6 122 {
hlipka 6:f4693f2d03e6 123 tm* t=getTm();
hlipka 6:f4693f2d03e6 124 t->tm_hour=0;
hlipka 6:f4693f2d03e6 125 t->tm_min=0;
hlipka 6:f4693f2d03e6 126 t->tm_sec=0;
hlipka 6:f4693f2d03e6 127 return mktime(t);
hlipka 6:f4693f2d03e6 128 }
hlipka 4:c84afcfbac84 129 private:
hlipka 4:c84afcfbac84 130 tm *getTm()
hlipka 4:c84afcfbac84 131 {
hlipka 4:c84afcfbac84 132 tm *time=new tm();
hlipka 4:c84afcfbac84 133
hlipka 4:c84afcfbac84 134 time->tm_year=_year;
hlipka 4:c84afcfbac84 135 time->tm_mon=_mon;
hlipka 4:c84afcfbac84 136 time->tm_mday=_mday;
hlipka 4:c84afcfbac84 137 time->tm_hour=_hour;
hlipka 4:c84afcfbac84 138 time->tm_min=_min;
hlipka 4:c84afcfbac84 139 time->tm_sec=_sec;
hlipka 4:c84afcfbac84 140 time->tm_wday=_wday;
hlipka 4:c84afcfbac84 141
hlipka 4:c84afcfbac84 142 return time;
hlipka 4:c84afcfbac84 143 }
hlipka 4:c84afcfbac84 144 void updateTime(time_t unixTime) {
hlipka 4:c84afcfbac84 145 struct tm *time;
hlipka 4:c84afcfbac84 146 time=localtime(&unixTime);
hlipka 4:c84afcfbac84 147 _year=time->tm_year;
hlipka 4:c84afcfbac84 148 _mon=time->tm_mon;
hlipka 4:c84afcfbac84 149 _mday=time->tm_mday;
hlipka 4:c84afcfbac84 150 _hour=time->tm_hour;
hlipka 4:c84afcfbac84 151 _min=time->tm_min;
hlipka 4:c84afcfbac84 152 _sec=time->tm_sec;
hlipka 4:c84afcfbac84 153 _wday=time->tm_wday;
hlipka 4:c84afcfbac84 154 }
hlipka 4:c84afcfbac84 155 void print()
hlipka 4:c84afcfbac84 156 {
hlipka 4:c84afcfbac84 157 printf("ts=%i.%i.%i %i:%i.%i\n",_mday,_mon+1,_year+1900,_hour,_min,_sec);
hlipka 4:c84afcfbac84 158 }
hlipka 4:c84afcfbac84 159 // make sure this structure needs only 7 bytes - otherwise it's 48 bytes...
hlipka 4:c84afcfbac84 160 char __packed _year;
hlipka 4:c84afcfbac84 161 char __packed _mon;
hlipka 4:c84afcfbac84 162 char __packed _mday;
hlipka 4:c84afcfbac84 163 char __packed _hour;
hlipka 4:c84afcfbac84 164 char __packed _min;
hlipka 4:c84afcfbac84 165 char __packed _sec;
hlipka 4:c84afcfbac84 166 char __packed _wday;
hlipka 4:c84afcfbac84 167 };
hlipka 4:c84afcfbac84 168
hlipka 4:c84afcfbac84 169 class TimeZoneEntry;
hlipka 4:c84afcfbac84 170
hlipka 4:c84afcfbac84 171 /**
hlipka 4:c84afcfbac84 172 This class handles the time zone calculation, and is used for creating time stamp objects.
hlipka 4:c84afcfbac84 173 */
hlipka 4:c84afcfbac84 174 class Time {
hlipka 4:c84afcfbac84 175 public:
hlipka 4:c84afcfbac84 176 /**
hlipka 4:c84afcfbac84 177 creates a new Time instance. On the first call, it reads the file 'timezone.csv' from the USB disk (local file system).
hlipka 4:c84afcfbac84 178 */
hlipka 4:c84afcfbac84 179 Time();
hlipka 4:c84afcfbac84 180 ~Time();
hlipka 4:c84afcfbac84 181 /**
hlipka 4:c84afcfbac84 182 creates a new TimeStamp instance. The caller is responsible for deleting it afterwards!
hlipka 4:c84afcfbac84 183 @returns the time stamp
hlipka 4:c84afcfbac84 184 */
hlipka 4:c84afcfbac84 185 TimeStamp* getTime();
hlipka 4:c84afcfbac84 186 /**
hlipka 4:c84afcfbac84 187 @returns the current time stamp (UTC) in UNIX format, without time zone correction.
hlipka 4:c84afcfbac84 188 */
hlipka 4:c84afcfbac84 189 long getUnixTime();
hlipka 4:c84afcfbac84 190 private:
hlipka 4:c84afcfbac84 191 static TimeZoneEntry* _timeZoneEntries;
hlipka 5:fde01b92a384 192 static void readTimeZones();
hlipka 5:fde01b92a384 193 static int getTimeOffset(TimeStamp* ts);
hlipka 4:c84afcfbac84 194 };
hlipka 4:c84afcfbac84 195
hlipka 0:ab93db24fcc8 196 #endif