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:
Mon Jan 24 22:01:44 2011 +0000
Revision:
5:fde01b92a384
Parent:
4:c84afcfbac84
Child:
6:f4693f2d03e6
bugfix: read time zones correctly when no current is set

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 4:c84afcfbac84 86 ~TimeStamp() {
hlipka 4:c84afcfbac84 87 };
hlipka 4:c84afcfbac84 88
hlipka 4:c84afcfbac84 89 /**
hlipka 4:c84afcfbac84 90 @param ts the time stamp to compare to
hlipka 4:c84afcfbac84 91 @returns true when both timestamp are the same point in time
hlipka 4:c84afcfbac84 92 */
hlipka 4:c84afcfbac84 93 bool isSame(TimeStamp* ts);
hlipka 4:c84afcfbac84 94
hlipka 4:c84afcfbac84 95 /**
hlipka 4:c84afcfbac84 96 @param ts the time stamp to compare to
hlipka 4:c84afcfbac84 97 @return true when the current time stamp is before the given time stamp
hlipka 4:c84afcfbac84 98 */
hlipka 4:c84afcfbac84 99 bool isBefore(TimeStamp* ts);
hlipka 4:c84afcfbac84 100
hlipka 4:c84afcfbac84 101 /**
hlipka 4:c84afcfbac84 102 @returns time stamp transformed to ASCII (done by asctime() - but transformed to local time)
hlipka 4:c84afcfbac84 103 */
hlipka 4:c84afcfbac84 104 char *asChar() { struct tm * time=getTm();char *s=asctime(time); delete time;return s;};
hlipka 4:c84afcfbac84 105
hlipka 4:c84afcfbac84 106 /**
hlipka 4:c84afcfbac84 107 @param ts the time stamp to compare to
hlipka 4:c84afcfbac84 108 @return true when the current time stamp is after the given time stamp
hlipka 4:c84afcfbac84 109 */
hlipka 4:c84afcfbac84 110 bool isAfter(TimeStamp* ts);
hlipka 4:c84afcfbac84 111 private:
hlipka 4:c84afcfbac84 112 tm *getTm()
hlipka 4:c84afcfbac84 113 {
hlipka 4:c84afcfbac84 114 tm *time=new tm();
hlipka 4:c84afcfbac84 115
hlipka 4:c84afcfbac84 116 time->tm_year=_year;
hlipka 4:c84afcfbac84 117 time->tm_mon=_mon;
hlipka 4:c84afcfbac84 118 time->tm_mday=_mday;
hlipka 4:c84afcfbac84 119 time->tm_hour=_hour;
hlipka 4:c84afcfbac84 120 time->tm_min=_min;
hlipka 4:c84afcfbac84 121 time->tm_sec=_sec;
hlipka 4:c84afcfbac84 122 time->tm_wday=_wday;
hlipka 4:c84afcfbac84 123
hlipka 4:c84afcfbac84 124 return time;
hlipka 4:c84afcfbac84 125 }
hlipka 4:c84afcfbac84 126 void updateTime(time_t unixTime) {
hlipka 4:c84afcfbac84 127 struct tm *time;
hlipka 4:c84afcfbac84 128 time=localtime(&unixTime);
hlipka 4:c84afcfbac84 129 _year=time->tm_year;
hlipka 4:c84afcfbac84 130 _mon=time->tm_mon;
hlipka 4:c84afcfbac84 131 _mday=time->tm_mday;
hlipka 4:c84afcfbac84 132 _hour=time->tm_hour;
hlipka 4:c84afcfbac84 133 _min=time->tm_min;
hlipka 4:c84afcfbac84 134 _sec=time->tm_sec;
hlipka 4:c84afcfbac84 135 _wday=time->tm_wday;
hlipka 4:c84afcfbac84 136 }
hlipka 4:c84afcfbac84 137 TimeStamp(int year, int mon, int day, int hour, int min, int sec, int wday)
hlipka 4:c84afcfbac84 138 {
hlipka 4:c84afcfbac84 139 _year=(char)(year-1900);
hlipka 4:c84afcfbac84 140 _mon=(char)(mon-1);
hlipka 4:c84afcfbac84 141 _mday=(char)day;
hlipka 4:c84afcfbac84 142 _hour=(char)hour;
hlipka 4:c84afcfbac84 143 _min=(char)min;
hlipka 4:c84afcfbac84 144 _sec=(char)sec;
hlipka 4:c84afcfbac84 145 _wday=(char)wday;
hlipka 4:c84afcfbac84 146 }
hlipka 4:c84afcfbac84 147
hlipka 4:c84afcfbac84 148 void print()
hlipka 4:c84afcfbac84 149 {
hlipka 4:c84afcfbac84 150 printf("ts=%i.%i.%i %i:%i.%i\n",_mday,_mon+1,_year+1900,_hour,_min,_sec);
hlipka 4:c84afcfbac84 151 }
hlipka 4:c84afcfbac84 152 // make sure this structure needs only 7 bytes - otherwise it's 48 bytes...
hlipka 4:c84afcfbac84 153 char __packed _year;
hlipka 4:c84afcfbac84 154 char __packed _mon;
hlipka 4:c84afcfbac84 155 char __packed _mday;
hlipka 4:c84afcfbac84 156 char __packed _hour;
hlipka 4:c84afcfbac84 157 char __packed _min;
hlipka 4:c84afcfbac84 158 char __packed _sec;
hlipka 4:c84afcfbac84 159 char __packed _wday;
hlipka 4:c84afcfbac84 160 };
hlipka 4:c84afcfbac84 161
hlipka 4:c84afcfbac84 162 class TimeZoneEntry;
hlipka 4:c84afcfbac84 163
hlipka 4:c84afcfbac84 164 /**
hlipka 4:c84afcfbac84 165 This class handles the time zone calculation, and is used for creating time stamp objects.
hlipka 4:c84afcfbac84 166 */
hlipka 4:c84afcfbac84 167 class Time {
hlipka 4:c84afcfbac84 168 public:
hlipka 4:c84afcfbac84 169 /**
hlipka 4:c84afcfbac84 170 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 171 */
hlipka 4:c84afcfbac84 172 Time();
hlipka 4:c84afcfbac84 173 ~Time();
hlipka 4:c84afcfbac84 174 /**
hlipka 4:c84afcfbac84 175 creates a new TimeStamp instance. The caller is responsible for deleting it afterwards!
hlipka 4:c84afcfbac84 176 @returns the time stamp
hlipka 4:c84afcfbac84 177 */
hlipka 4:c84afcfbac84 178 TimeStamp* getTime();
hlipka 4:c84afcfbac84 179 /**
hlipka 4:c84afcfbac84 180 @returns the current time stamp (UTC) in UNIX format, without time zone correction.
hlipka 4:c84afcfbac84 181 */
hlipka 4:c84afcfbac84 182 long getUnixTime();
hlipka 4:c84afcfbac84 183 private:
hlipka 4:c84afcfbac84 184 static TimeZoneEntry* _timeZoneEntries;
hlipka 5:fde01b92a384 185 static void readTimeZones();
hlipka 5:fde01b92a384 186 static int getTimeOffset(TimeStamp* ts);
hlipka 4:c84afcfbac84 187 };
hlipka 4:c84afcfbac84 188
hlipka 0:ab93db24fcc8 189 #endif