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:
2010-12-22
Revision:
2:7946f902f2d4
Parent:
1:81f7dd124217
Child:
3:2ad51ec5ef6e

File content as of revision 2:7946f902f2d4:

#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 _tm.tm_year+1900;
    };

    /**
        @returns the month of the time stamp
    */
    int getMonth() {
        return _tm.tm_mon;
    };

    int getDay() {
    /**
        @returns the day-of-the-month of the time stamp
    */
        return _tm.tm_mday;
    };

    /**
        @returns the hour of the time stamp
    */
    int getHour() {
        return _tm.tm_hour;
    };

    /**
        @returns the minute of the time stamp
    */
    int getMinute() {
        return _tm.tm_min;
    };

    /**
        @returns the second of the time stamp
    */
    int getSecond() {
        return _tm.tm_sec;
    };

    /**
        get the day of the week - monday is 0
        @returns the day-of-the-week of the time stamp
    */
    int getDayOfWeek() {
        int dow=_tm.tm_wday;
        dow--;
        if (dow==-1)
            dow=6;
        return dow;
    };

    /**
        @returns the day-of-the-year of the time stamp
    */
    int getDayOfYear() {
        return _tm.tm_yday;
    };

    /**
        creates a new time stamp based on the UNIX time stamp (seconds since 1970)
    */
    TimeStamp(time_t unixTime) {
        updateTime(unixTime);
    };

    ~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);
    /**
        @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);
private:
    void updateTime(time_t unixTime) {
        struct tm *time;
        time=localtime(&unixTime);
        memcpy(&_tm, time, sizeof(_tm));
    }
    TimeStamp(int year, int mon, int day, int hour, int min, int sec)
    {
        _tm.tm_year=year-1900;
        _tm.tm_mon=mon;
        _tm.tm_mday=day;
        _tm.tm_hour=hour;
        _tm.tm_min=min;
        _tm.tm_sec=sec;
    }

    struct tm _tm;
};

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 std::list<TimeZoneEntry*> *_timeZoneEntries;
    void readTimeZones();
};

#endif