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
Time.h
- Committer:
- hlipka
- Date:
- 2011-02-18
- Revision:
- 7:0c7207d674d3
- Parent:
- 6:f4693f2d03e6
File content as of revision 7:0c7207d674d3:
/* * TimeZone library * Copyright (c) 2010 Hendrik Lipka * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ #ifndef __TIME_H_ #define __TIME_H_ #include <time.h> #include "stdio.h" #include "string.h" #include <list> class Time; /** This class encapsulates a point in time - which means it will not change after it has been created. */ class TimeStamp { friend class Time; public: /** @returns the year of the time stamp */ int getYear() { return _year+1900; }; /** @returns the month of the time stamp (January is 1) */ int getMonth() { return _mon+1; }; int getDay() { /** @returns the day-of-the-month of the time stamp (starting with 1) */ return _mday; }; /** @returns the hour of the time stamp (0-23) */ int getHour() { return _hour; }; /** @returns the minute of the time stamp (0-59) */ int getMinute() { return _min; }; /** @returns the second of the time stamp (0-59) */ int getSecond() { return _sec; }; /** get the day of the week - monday is 0 @returns the day-of-the-week of the time stamp */ int getDayOfWeek() { int dow=_wday; dow--; if (dow==-1) dow=6; return dow; }; /** @returns the day-of-the-year of the time stamp */ /* int getDayOfYear() { return _yday; }; */ /** creates a new time stamp based on the UNIX time stamp (seconds since 1970) */ TimeStamp(time_t unixTime) { updateTime(unixTime); }; TimeStamp(int year, int mon, int day, int hour, int min, int sec, int wday) { _year=(char)(year-1900); _mon=(char)(mon-1); _mday=(char)day; _hour=(char)hour; _min=(char)min; _sec=(char)sec; _wday=(char)wday; } ~TimeStamp() { }; /** @param ts the time stamp to compare to @returns true when both timestamp are the same point in time */ bool isSame(TimeStamp* ts); /** @param ts the time stamp to compare to @return true when the current time stamp is before the given time stamp */ bool isBefore(TimeStamp* ts); /** @returns time stamp transformed to ASCII (done by asctime() - but transformed to local time) */ char *asChar() { struct tm * time=getTm();char *s=asctime(time); delete time;return s;}; /** @param ts the time stamp to compare to @return true when the current time stamp is after the given time stamp */ bool isAfter(TimeStamp* ts); int getStartOfDay() { tm* t=getTm(); t->tm_hour=0; t->tm_min=0; t->tm_sec=0; return mktime(t); } private: tm *getTm() { tm *time=new tm(); time->tm_year=_year; time->tm_mon=_mon; time->tm_mday=_mday; time->tm_hour=_hour; time->tm_min=_min; time->tm_sec=_sec; time->tm_wday=_wday; return time; } void updateTime(time_t unixTime) { struct tm *time; time=localtime(&unixTime); _year=time->tm_year; _mon=time->tm_mon; _mday=time->tm_mday; _hour=time->tm_hour; _min=time->tm_min; _sec=time->tm_sec; _wday=time->tm_wday; } void print() { printf("ts=%i.%i.%i %i:%i.%i\n",_mday,_mon+1,_year+1900,_hour,_min,_sec); } // make sure this structure needs only 7 bytes - otherwise it's 48 bytes... char __packed _year; char __packed _mon; char __packed _mday; char __packed _hour; char __packed _min; char __packed _sec; char __packed _wday; }; class TimeZoneEntry; /** This class handles the time zone calculation, and is used for creating time stamp objects. */ class Time { public: /** creates a new Time instance. On the first call, it reads the file 'timezone.csv' from the USB disk (local file system). */ Time(); ~Time(); /** creates a new TimeStamp instance. The caller is responsible for deleting it afterwards! @returns the time stamp */ TimeStamp* getTime(); /** @returns the current time stamp (UTC) in UNIX format, without time zone correction. */ long getUnixTime(); private: static TimeZoneEntry* _timeZoneEntries; static void readTimeZones(); static int getTimeOffset(TimeStamp* ts); }; #endif