Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
TimeZone/Time.cpp@0:8cdad1c73e8e, 2012-03-25 (annotated)
- Committer:
- bfictorie
- Date:
- Sun Mar 25 17:26:30 2012 +0000
- Revision:
- 0:8cdad1c73e8e
Who changed what in which revision?
| User | Revision | Line number | New contents of line | 
|---|---|---|---|
| bfictorie | 0:8cdad1c73e8e | 1 | #include "Time.h" | 
| bfictorie | 0:8cdad1c73e8e | 2 | |
| bfictorie | 0:8cdad1c73e8e | 3 | #include "stdio.h" | 
| bfictorie | 0:8cdad1c73e8e | 4 | // #include "time.h" | 
| bfictorie | 0:8cdad1c73e8e | 5 | |
| bfictorie | 0:8cdad1c73e8e | 6 | using namespace std; | 
| bfictorie | 0:8cdad1c73e8e | 7 | |
| bfictorie | 0:8cdad1c73e8e | 8 | class TimeZoneEntry { | 
| bfictorie | 0:8cdad1c73e8e | 9 | public: | 
| bfictorie | 0:8cdad1c73e8e | 10 | TimeStamp *_from; | 
| bfictorie | 0:8cdad1c73e8e | 11 | TimeStamp *_to; | 
| bfictorie | 0:8cdad1c73e8e | 12 | int _offset; | 
| bfictorie | 0:8cdad1c73e8e | 13 | }; | 
| bfictorie | 0:8cdad1c73e8e | 14 | |
| bfictorie | 0:8cdad1c73e8e | 15 | list<TimeZoneEntry*> *Time::_timeZoneEntries=NULL; | 
| bfictorie | 0:8cdad1c73e8e | 16 | |
| bfictorie | 0:8cdad1c73e8e | 17 | bool TimeStamp::isSame(TimeStamp* ts) | 
| bfictorie | 0:8cdad1c73e8e | 18 | { | 
| bfictorie | 0:8cdad1c73e8e | 19 | if (ts->getYear()!=getYear()) | 
| bfictorie | 0:8cdad1c73e8e | 20 | return false; | 
| bfictorie | 0:8cdad1c73e8e | 21 | if (ts->getMonth()!=getMonth()) | 
| bfictorie | 0:8cdad1c73e8e | 22 | return false; | 
| bfictorie | 0:8cdad1c73e8e | 23 | if (ts->getDay()!=getDay()) | 
| bfictorie | 0:8cdad1c73e8e | 24 | return false; | 
| bfictorie | 0:8cdad1c73e8e | 25 | if (ts->getHour()!=getHour()) | 
| bfictorie | 0:8cdad1c73e8e | 26 | return false; | 
| bfictorie | 0:8cdad1c73e8e | 27 | if (ts->getSecond()!=getSecond()) | 
| bfictorie | 0:8cdad1c73e8e | 28 | return false; | 
| bfictorie | 0:8cdad1c73e8e | 29 | return true; | 
| bfictorie | 0:8cdad1c73e8e | 30 | } | 
| bfictorie | 0:8cdad1c73e8e | 31 | bool TimeStamp::isBefore(TimeStamp* ts) | 
| bfictorie | 0:8cdad1c73e8e | 32 | { | 
| bfictorie | 0:8cdad1c73e8e | 33 | if (getYear()<ts->getYear()) | 
| bfictorie | 0:8cdad1c73e8e | 34 | return true; | 
| bfictorie | 0:8cdad1c73e8e | 35 | if (getYear()>ts->getYear()) | 
| bfictorie | 0:8cdad1c73e8e | 36 | return false; | 
| bfictorie | 0:8cdad1c73e8e | 37 | |
| bfictorie | 0:8cdad1c73e8e | 38 | if (getMonth()<ts->getMonth()) | 
| bfictorie | 0:8cdad1c73e8e | 39 | return true; | 
| bfictorie | 0:8cdad1c73e8e | 40 | if (getMonth()>ts->getMonth()) | 
| bfictorie | 0:8cdad1c73e8e | 41 | return false; | 
| bfictorie | 0:8cdad1c73e8e | 42 | |
| bfictorie | 0:8cdad1c73e8e | 43 | if (getDay()<ts->getDay()) | 
| bfictorie | 0:8cdad1c73e8e | 44 | return true; | 
| bfictorie | 0:8cdad1c73e8e | 45 | if (getDay()>ts->getDay()) | 
| bfictorie | 0:8cdad1c73e8e | 46 | return false; | 
| bfictorie | 0:8cdad1c73e8e | 47 | |
| bfictorie | 0:8cdad1c73e8e | 48 | if (getHour()<ts->getHour()) | 
| bfictorie | 0:8cdad1c73e8e | 49 | return true; | 
| bfictorie | 0:8cdad1c73e8e | 50 | if (getHour()>ts->getHour()) | 
| bfictorie | 0:8cdad1c73e8e | 51 | return false; | 
| bfictorie | 0:8cdad1c73e8e | 52 | |
| bfictorie | 0:8cdad1c73e8e | 53 | if (getSecond()<ts->getSecond()) | 
| bfictorie | 0:8cdad1c73e8e | 54 | return true; | 
| bfictorie | 0:8cdad1c73e8e | 55 | return false; | 
| bfictorie | 0:8cdad1c73e8e | 56 | } | 
| bfictorie | 0:8cdad1c73e8e | 57 | bool TimeStamp::isAfter(TimeStamp* ts) | 
| bfictorie | 0:8cdad1c73e8e | 58 | { | 
| bfictorie | 0:8cdad1c73e8e | 59 | return ts->isBefore(this); | 
| bfictorie | 0:8cdad1c73e8e | 60 | } | 
| bfictorie | 0:8cdad1c73e8e | 61 | |
| bfictorie | 0:8cdad1c73e8e | 62 | Time::Time() { | 
| bfictorie | 0:8cdad1c73e8e | 63 | if (NULL==Time::_timeZoneEntries) { | 
| bfictorie | 0:8cdad1c73e8e | 64 | _timeZoneEntries=new list<TimeZoneEntry*>(); | 
| bfictorie | 0:8cdad1c73e8e | 65 | readTimeZones(); | 
| bfictorie | 0:8cdad1c73e8e | 66 | } | 
| bfictorie | 0:8cdad1c73e8e | 67 | } | 
| bfictorie | 0:8cdad1c73e8e | 68 | |
| bfictorie | 0:8cdad1c73e8e | 69 | void Time::readTimeZones() { | 
| bfictorie | 0:8cdad1c73e8e | 70 | time_t rawtime; | 
| bfictorie | 0:8cdad1c73e8e | 71 | time ( &rawtime ); | 
| bfictorie | 0:8cdad1c73e8e | 72 | TimeStamp ts(rawtime); | 
| bfictorie | 0:8cdad1c73e8e | 73 | |
| bfictorie | 0:8cdad1c73e8e | 74 | int currentYear=ts.getYear(); | 
| bfictorie | 0:8cdad1c73e8e | 75 | |
| bfictorie | 0:8cdad1c73e8e | 76 | FILE *fp = fopen("/local/Edmonton.csv", "r"); | 
| bfictorie | 0:8cdad1c73e8e | 77 | |
| bfictorie | 0:8cdad1c73e8e | 78 | if (fp==NULL) { | 
| bfictorie | 0:8cdad1c73e8e | 79 | printf("error while reading timezone file\n"); | 
| bfictorie | 0:8cdad1c73e8e | 80 | return; | 
| bfictorie | 0:8cdad1c73e8e | 81 | } | 
| bfictorie | 0:8cdad1c73e8e | 82 | |
| bfictorie | 0:8cdad1c73e8e | 83 | |
| bfictorie | 0:8cdad1c73e8e | 84 | char tmp[128]; // enough for a single line | 
| bfictorie | 0:8cdad1c73e8e | 85 | while (fgets(tmp,sizeof(tmp),fp)!=0) { | 
| bfictorie | 0:8cdad1c73e8e | 86 | int fyear, fmon, fday, fhour, fmin, fsec; | 
| bfictorie | 0:8cdad1c73e8e | 87 | int tyear, tmon, tday, thour, tmin, tsec; | 
| bfictorie | 0:8cdad1c73e8e | 88 | int offset; | 
| bfictorie | 0:8cdad1c73e8e | 89 | int r=sscanf(tmp,"%4d-%2d-%2dT%2d:%2d:%2dZ,%4d-%2d-%2dT%2d:%2d:%2dZ,%d", | 
| bfictorie | 0:8cdad1c73e8e | 90 | &fyear, &fmon, &fday, &fhour, &fmin, &fsec, | 
| bfictorie | 0:8cdad1c73e8e | 91 | &tyear, &tmon, &tday, &thour, &tmin, &tsec, | 
| bfictorie | 0:8cdad1c73e8e | 92 | &offset | 
| bfictorie | 0:8cdad1c73e8e | 93 | ); | 
| bfictorie | 0:8cdad1c73e8e | 94 | if (13!=r) | 
| bfictorie | 0:8cdad1c73e8e | 95 | continue; | 
| bfictorie | 0:8cdad1c73e8e | 96 | if (fyear<currentYear || tyear>currentYear+5) | 
| bfictorie | 0:8cdad1c73e8e | 97 | continue; | 
| bfictorie | 0:8cdad1c73e8e | 98 | |
| bfictorie | 0:8cdad1c73e8e | 99 | TimeStamp *from=new TimeStamp(fyear, fmon, fday, fhour, fmin, fsec); | 
| bfictorie | 0:8cdad1c73e8e | 100 | TimeStamp *to=new TimeStamp(tyear, tmon, tday, thour, tmin, tsec); | 
| bfictorie | 0:8cdad1c73e8e | 101 | TimeZoneEntry *tze=new TimeZoneEntry(); | 
| bfictorie | 0:8cdad1c73e8e | 102 | tze->_from=from; | 
| bfictorie | 0:8cdad1c73e8e | 103 | tze->_to=to; | 
| bfictorie | 0:8cdad1c73e8e | 104 | tze->_offset=offset; | 
| bfictorie | 0:8cdad1c73e8e | 105 | _timeZoneEntries->push_back(tze); | 
| bfictorie | 0:8cdad1c73e8e | 106 | } | 
| bfictorie | 0:8cdad1c73e8e | 107 | |
| bfictorie | 0:8cdad1c73e8e | 108 | fclose(fp); | 
| bfictorie | 0:8cdad1c73e8e | 109 | } | 
| bfictorie | 0:8cdad1c73e8e | 110 | |
| bfictorie | 0:8cdad1c73e8e | 111 | Time::~Time() { | 
| bfictorie | 0:8cdad1c73e8e | 112 | } | 
| bfictorie | 0:8cdad1c73e8e | 113 | |
| bfictorie | 0:8cdad1c73e8e | 114 | TimeStamp* Time::getTime() { | 
| bfictorie | 0:8cdad1c73e8e | 115 | time_t rawtime; | 
| bfictorie | 0:8cdad1c73e8e | 116 | time ( &rawtime ); | 
| bfictorie | 0:8cdad1c73e8e | 117 | TimeStamp *ts=new TimeStamp(rawtime); | 
| bfictorie | 0:8cdad1c73e8e | 118 | |
| bfictorie | 0:8cdad1c73e8e | 119 | for (list<TimeZoneEntry*>::iterator it = _timeZoneEntries->begin(); it != _timeZoneEntries->end(); it++) { | 
| bfictorie | 0:8cdad1c73e8e | 120 | TimeZoneEntry* tze=*it; | 
| bfictorie | 0:8cdad1c73e8e | 121 | if (tze->_from->isBefore(ts) && tze->_to->isAfter(ts)) | 
| bfictorie | 0:8cdad1c73e8e | 122 | { | 
| bfictorie | 0:8cdad1c73e8e | 123 | rawtime+=tze->_offset; | 
| bfictorie | 0:8cdad1c73e8e | 124 | ts->updateTime(rawtime); | 
| bfictorie | 0:8cdad1c73e8e | 125 | } | 
| bfictorie | 0:8cdad1c73e8e | 126 | } | 
| bfictorie | 0:8cdad1c73e8e | 127 | |
| bfictorie | 0:8cdad1c73e8e | 128 | return ts; | 
| bfictorie | 0:8cdad1c73e8e | 129 | } |