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
Diff: Time.cpp
- Revision:
- 5:fde01b92a384
- Parent:
- 4:c84afcfbac84
- Child:
- 7:0c7207d674d3
--- a/Time.cpp Fri Jan 21 23:05:05 2011 +0000 +++ b/Time.cpp Mon Jan 24 22:01:44 2011 +0000 @@ -6,7 +6,7 @@ using namespace std; class TimeZoneEntry { - public: +public: TimeStamp *_from; TimeStamp *_to; int _offset; @@ -15,8 +15,7 @@ TimeZoneEntry* Time::_timeZoneEntries=NULL; -bool TimeStamp::isSame(TimeStamp* ts) -{ +bool TimeStamp::isSame(TimeStamp* ts) { if (ts->getYear()!=getYear()) return false; if (ts->getMonth()!=getMonth()) @@ -29,8 +28,7 @@ return false; return true; } -bool TimeStamp::isBefore(TimeStamp* ts) -{ +bool TimeStamp::isBefore(TimeStamp* ts) { if (getYear()<ts->getYear()) return true; if (getYear()>ts->getYear()) @@ -53,11 +51,10 @@ if (getSecond()<ts->getSecond()) return true; - return false; + return false; } -bool TimeStamp::isAfter(TimeStamp* ts) -{ - return ts->isBefore(this); +bool TimeStamp::isAfter(TimeStamp* ts) { + return ts->isBefore(this); } Time::Time() { @@ -82,68 +79,72 @@ printf("error while reading timezone file [timezone.csv]\n"); return; } - + TimeZoneEntry *current=NULL; char tmp[128]; // enough for a single line while (fgets(tmp,sizeof(tmp),fp)!=0) { - int fyear, fmon, fday, fhour, fmin, fsec; - int tyear, tmon, tday, thour, tmin, tsec; - int offset; - int r=sscanf(tmp,"%4d-%2d-%2dT%2d:%2d:%2dZ,%4d-%2d-%2dT%2d:%2d:%2dZ,%d", - &fyear, &fmon, &fday, &fhour, &fmin, &fsec, - &tyear, &tmon, &tday, &thour, &tmin, &tsec, - &offset - ); - if (13!=r) - continue; - if (tyear<currentYear || fyear>currentYear+4) - continue; - - TimeStamp *from=new TimeStamp(fyear, fmon, fday, fhour, fmin, fsec,0); - TimeStamp *to=new TimeStamp(tyear, tmon, tday, thour, tmin, tsec,0); - TimeZoneEntry *tze=new TimeZoneEntry(); - tze->_from=from; - tze->_to=to; - tze->_offset=offset; - tze->next=NULL; - - if (NULL==current) - { - current=tze; - _timeZoneEntries=tze; - } - else - { - current->next=tze; - current=tze; + if (tmp[0]!='#') { + int fyear, fmon, fday, fhour, fmin, fsec; + int tyear, tmon, tday, thour, tmin, tsec; + int offset; + int r=sscanf(tmp,"%4d-%2d-%2dT%2d:%2d:%2dZ,%4d-%2d-%2dT%2d:%2d:%2dZ,%d", + &fyear, &fmon, &fday, &fhour, &fmin, &fsec, + &tyear, &tmon, &tday, &thour, &tmin, &tsec, + &offset + ); + if (13!=r) + continue; + // when we have no current time, so the year is 1970 and we read everything + // otherwise skip everything more than 4 years in advance to save memory + if (currentYear!=1970 && (tyear<currentYear || fyear>currentYear+4)) { + continue; + } + + TimeStamp *from=new TimeStamp(fyear, fmon, fday, fhour, fmin, fsec,0); + TimeStamp *to=new TimeStamp(tyear, tmon, tday, thour, tmin, tsec,0); + TimeZoneEntry *tze=new TimeZoneEntry(); + tze->_from=from; + tze->_to=to; + tze->_offset=offset; + tze->next=NULL; + + if (NULL==current) { + current=tze; + _timeZoneEntries=tze; + } else { + current->next=tze; + current=tze; + } } } - printf("closing time zone file\n"); +// printf("closing time zone file\n"); fclose(fp); } Time::~Time() { } +int Time::getTimeOffset(TimeStamp* ts) { + TimeZoneEntry *current=_timeZoneEntries; + + while (current!=NULL) { + if (current->_from->isBefore(ts) && current->_to->isAfter(ts)) { + return current->_offset; + } + current=current->next; + } + return 0; +} + TimeStamp* Time::getTime() { time_t rawtime; time ( &rawtime ); TimeStamp *ts=new TimeStamp(rawtime); - - TimeZoneEntry *current=_timeZoneEntries; - - while (current!=NULL) - { - if (current->_from->isBefore(ts) && current->_to->isAfter(ts)) - { - rawtime+=current->_offset; - ts->updateTime(rawtime); - break; - } - current=current->next; - } - + + rawtime+=getTimeOffset(ts); + ts->updateTime(rawtime); + return ts; }