diff options
Diffstat (limited to 'debian/htdig/htdig-3.2.0b6/htlib/HtDateTime.h')
-rw-r--r-- | debian/htdig/htdig-3.2.0b6/htlib/HtDateTime.h | 533 |
1 files changed, 533 insertions, 0 deletions
diff --git a/debian/htdig/htdig-3.2.0b6/htlib/HtDateTime.h b/debian/htdig/htdig-3.2.0b6/htlib/HtDateTime.h new file mode 100644 index 00000000..c212b49a --- /dev/null +++ b/debian/htdig/htdig-3.2.0b6/htlib/HtDateTime.h @@ -0,0 +1,533 @@ +// +// HtDateTime.h +// +// HtDateTime: Parse, split, compare and format dates and times. +// Uses locale. +// +// Part of the ht://Dig package <http://www.htdig.org/> +// Copyright (c) 1999-2004 The ht://Dig Group +// For copyright details, see the file COPYING in your distribution +// or the GNU Library General Public License (LGPL) version 2 or later +// <http://www.gnu.org/copyleft/lgpl.html> +// +// $Id: HtDateTime.h,v 1.19 2004/05/28 13:15:20 lha Exp $ + +/////// + // Class for Date and Time + // Gabriele Bartolini - Prato - Italia + // Started: 22.04.1999 +/////// + +// Version: 1.0 +// Release date: 07.05.1999 + +// +// General purpose of HtDateTime +// The general purpose of this class, is to provide an interface for +// date and time managing, and to unload the programmer to manage +// time_t, struct tm, time system functions and other related procedures +// locally ... Everything regarding time and date must be put here. +// D'you agree with me? Well, here is a summary of the class capabilities. + +// Attributes of the class: +// +// HtDateTime class has only 2 member attributes +// - time_t Ht_t +// - bool local_time +// +// Obviously Ht_t contains the most important piece of information. +// local_time assumes a true value if we wanna consider the date and +// time information as local. False means that our object value is +// referred to the Greenwich Meridian time. + +// Interface provided: +// +// Construction: +// - Default: set the date time value to now +// - By passing a time_t value or pointer: Set to it +// - By passing a struct tm value or pointer: Set to it +// The last one could be useful sometimes. But it had better not to +// be used. +// +// Parsing interface: +// Not yet implemented ... :-) +// +// Setting Interface: +// - from time_t: copy the time_t value into the object +// - from struct tm: set the object's time_t value by converting +// the value from the struct tm. If local_time is set to true, +// converts it with mktime, else uses HtTimeGM. +// - set to now +// - from a string, by passing the input format: the method uses +// strptime syntax (and invokes Htstrptime). For now, timezone +// is ignored, and so data are stored as a GM date time value. +// - from an int series, by specifying all the information (year, +// month, day, hour, minute and second). It's all stored as +// GM value. +// - from various standard formats, such as C asctime, RFC 1123, +// RFC 850 (these 3 types are suggested by the HTTP/1.1 standard), +// ISO 8601, date and time default representation for the locale. +// This list could get longer ... It all depends on us. +// - setting the date and time to be represented in a local value +// or universal (GM) one. +// +// Getting Interface +// - in a personalized output format, by passing a string with +// strftime values. +// - in various standard formats, like C asctime, RFC 1123, +// RFC 850, ISO 8601 (short too), date and time default +// representation for the locale. +// - getting the time_t value +// - queries the local time status +// - getting specific piece of information of both the date and the +// the time, like the year, the month, the day of the week, of +// the year or of the month, ... In short, every kind of thing +// a tm structure is able to store ... +// +// Operator overloading +// - Copy +// - Every kind of logical comparison between 2 objects +// +// Comparison interface +// This is divided in 2 sections. +// - Static section: +// comparison are made on a 2 struct tm values basis. +// It's possible to compare the whole date time value, or +// simply the date or the time value. +// - Member functions section: +// comparison are made between 2 HtDateTime objects. +// You can compare either the whole date time, or the date, or the +// time, both as they are or referring their values to the GM value. +// +// System functions interface +// They are all done with previous "configure" checks +// - for strptime +// - for timegm +// +// Static methods +// - check for a leap year +// - check for a valid year number (according with time_t capabilities) +// - check for a valid month number +// - check for a valid day +// - converts a 2 digits year number into a 4 digits one: from 1970 to 2069. +// - converts a 4 digits year number into a 2 digits one. +// - retrieve the difference in seconds between 2 HtDateTime objs +// +// Test Interface (only by defining TEST_HTDATETIME directive). +// + + +#ifndef _HTDATETIME_H +#define _HTDATETIME_H + +#ifdef HAVE_CONFIG_H +# include "htconfig.h" +#endif + +#if TIME_WITH_SYS_TIME +#include <sys/time.h> +#include <time.h> +#else +# if HAVE_SYS_TIME_H +# include <sys/time.h> +# else +# include <time.h> +# endif +#endif + +#include "htString.h" + +// If you wanna do some tests +#define TEST_HTDATETIME + + +class HtDateTime +{ +public: + +/////// + // Construction +/////// + + // Default: now and local + HtDateTime() {SettoNow(); ToLocalTime();} + + // From an integer (seconds from epoc) +// Causes ambiguity in systems with time_t an integer... +// HtDateTime(const int i) {SetDateTime((time_t)i); ToLocalTime();} + + // From a time_t value and pointer + HtDateTime(time_t &t) {SetDateTime(t); ToLocalTime();} + HtDateTime(time_t *t) {SetDateTime(t); ToLocalTime();} + + // From a struct tm value and pointer + HtDateTime(struct tm &t) {SetDateTime(t); ToLocalTime();} + HtDateTime(struct tm *t) {SetDateTime(t); ToLocalTime();} + + // Copy constructor + inline HtDateTime(const HtDateTime& rhs); + +/////// + // Interface methods +/////// + +/////// + // "Parsing" interface +/////// + + int Parse(const char *); // It looks for the similar format + // then sets the date by invoking + // right method + + +/////// + // "Setting" interface +/////// + + // Setting from a time_t value + void SetDateTime(const time_t &t) { Ht_t = t; } // by reference + void SetDateTime(const time_t *t) { Ht_t = *t; } // by pointer + + // Set object time_t value from a struct tm + void SetDateTime(struct tm *); // by pointer + inline void SetDateTime(struct tm &t) { SetDateTime(&t);} // by reference + + // Set GM Time from single values input + // Return true if it all went good, false else + bool SetGMDateTime( int year, int mon, int mday, + int hour=0, int min=0, int sec=0); + + // Set to Now + void SettoNow(); + + // Parsing various input string format + // It ignores time Zone value - always stores as GM + char *SetFTime(const char *, const char *); // as strptime + + void SetAscTime(char *); // Sun Nov 6 08:49:37 1994 + void SetRFC1123(char *); // Sun, 06 Nov 1994 08:49:37 GMT + void SetRFC850(char *); // Sunday, 06-Nov-94 08:49:37 GMT + void SetISO8601(char *); // 1994-11-06 08:49:37 GMT + void SetTimeStamp(char *); // 19941106084937 + + void SetDateTimeDefault(char *); // Default date and time representation + // for the locale + + /////// + // Methods for setting Local and GM time formats (Switches) + /////// + + void ToLocalTime() {local_time=true;} + void ToGMTime() {local_time=false;} + + +/////// + // "Getting" interface +/////// + + + /////// + // Output formats + /////// + + // Personalized output + char *GetFTime(const char *format) const; // as strftime + size_t GetFTime(char *, size_t, const char *) const; // as strftime + + char *GetAscTime() const; // Sun Nov 6 08:49:37 1994 + char *GetRFC1123() const; // Sun, 06 Nov 1994 08:49:37 GMT + char *GetRFC850() const; // Sunday, 06-Nov-94 08:49:37 GMT + char *GetISO8601() const; // 1994-11-06 08:49:37 GMT + char *GetTimeStamp() const; // 19941106084937 + + char *GetDateTimeDefault() const; // Default date and time representation + // for the locale + + // Partial (only date or only time) + char *GetShortISO8601() const; // 1994-11-06 + char *GetDateDefault() const; // Default date form for the locale + char *GetTimeDefault() const; // Default time form for the locale + + + /////// + // Gets the time_t value + /////// + + time_t GetTime_t() const {return Ht_t;} + + + /////// + // Gets specific date and time values (from a struct tm) + /////// + + // Gets the year + int GetYear() const { return ( GetStructTM().tm_year + 1900) ;} + + // Gets the month + int GetMonth() const { return (GetStructTM().tm_mon + 1);} + + // Gets the day of the week (since Sunday) + int GetWDay() const { return (GetStructTM().tm_wday + 1);} + + // Gets the day of the month + int GetMDay() const { return GetStructTM().tm_mday;} + + // Gets the day since january 1 + int GetYDay() const { return (GetStructTM().tm_yday + 1);} + + // Gets the hour + int GetHour() const { return GetStructTM().tm_hour;} + + // Gets the minute + int GetMinute() const { return GetStructTM().tm_min;} + + // Gets the second + int GetSecond() const { return GetStructTM().tm_sec;} + + // Daylight saving time is in effect at that time? + int GetIsDst() const { return GetStructTM().tm_isdst;} + + + /////// + // Methods for querying localtime status + /////// + + bool isLocalTime() const {return local_time;} + bool isGMTime() const {return !local_time;} + + + +/////// + // Methods for comparison +/////// + + // Returns 0 if equal, -1 if tm1 is lower than tm2, 1 if tm1 is greater than tm2 + + int DateTimeCompare (const HtDateTime &) const; // Compares both date and time + + int DateCompare (const HtDateTime &) const; // Compares the date + int TimeCompare (const HtDateTime &) const; // Compares the time + + // Refers the date and the time to a GM value, then compares + int GMDateTimeCompare (const HtDateTime &) const; // Compares both date and time + int GMDateCompare (const HtDateTime &) const; // Compares the date + int GMTimeCompare (const HtDateTime &) const; // Compares the time + + +/////// + // Operator overloading +/////// + + // For comparisons - between objects of the same class + + inline bool operator==(const HtDateTime &right) const; + inline bool operator<(const HtDateTime &right) const; + + bool operator!=(const HtDateTime &right) const + {return !( *this == right );} + + bool operator>=(const HtDateTime &right) const + {return !( *this < right);} + + bool operator<=(const HtDateTime &right) const + {return !( right < *this);} + + bool operator>(const HtDateTime &right) const + {return right < *this; } + + + // For comparisons - between HtDateTime objects and int + + bool operator==(const int right) const // with an int + {return ( Ht_t == (time_t) right );} + + bool operator<(const int right) const // with an int + {return ( Ht_t < (time_t) right );} + + bool operator!=(const int right) const // with an int + {return !( *this == right );} + + bool operator>=(const int right) const // with an int + {return !( *this < right);} + + bool operator<=(const int right) const // with an int + {return !( *this > right);} + + bool operator>(const int right) const // with an int + {return (Ht_t > (time_t) right); } + + + // For Copy + + inline HtDateTime &operator=(const HtDateTime &right); + inline HtDateTime &operator=(const int right); + + + + +/////// // STATIC METHODS // /////// + + // Here we can add static methods as we want more :-) + // Then invoke them with HtDateTime::MethodXXX () + + + inline static bool LeapYear(int); // Is a leap year? + + // These checks are made for time_t compatibility + inline static bool isAValidYear(int); // Is a valid year number + + inline static bool isAValidMonth(int); // Is a valid month number + inline static bool isAValidDay(int, int, int); // Is a valid day + + + // Converts a 2 digits year in a 4 one - with no checks + static int Year_From2To4digits (int y) + { + if ( y >= 70 ) return y+1900; + else return y+2000; + } + + // Converts a 4 digits year in a 2 one - with no checks + static int Year_From4To2digits (int y) + { + if ( y >= 2000 ) return y - 2000; + else return y - 1900; + } + + static int GetDiff(const HtDateTime &, const HtDateTime &); + + // Check equality from 2 struct tm pointers + // Returns 0 if equal, -1 if tm1 is lower than tm2, 1 if tm1 is greater than tm2 + + // Compares the whole time information (both date and time) + static int DateTimeCompare(const struct tm *tm1, + const struct tm *tm2); + + // Compares only date + static int DateCompare(const struct tm *tm1, + const struct tm *tm2); + + // Compares only time + static int TimeCompare(const struct tm *tm1, + const struct tm *tm2); + + + +/////// // HIDDEN ATTRIBUTES & METHODS // /////// + +protected: // to permit inheritance + + time_t Ht_t; + bool local_time; + + static const int days[]; + +/////// + // Sets and gets the struct tm depending on local_time status +/////// + + void RefreshStructTM() const; // Refresh its content + struct tm &GetStructTM() const; // gets it + void GetStructTM(struct tm & t) const { t=GetStructTM(); } // Gets and copy + + +/////// + // Gets the struct tm ignoring local_time status +/////// + + struct tm &GetGMStructTM() const; // gets it + void GetGMStructTM(struct tm &) const; // Gets and copy + + +/////// + // Interface for system functions +/////// + + // Interface for timegm + static time_t HtTimeGM (struct tm*); + + +#ifdef TEST_HTDATETIME + +/////// + // Only for debug: view of struct tm fields +/////// + +public: + + static void ViewStructTM(struct tm *); // view of struct tm fields + virtual void ViewStructTM(); // view of struct tm fields + void ViewFormats(); // View of various formats + + void ComparisonTest (const HtDateTime &) const; // comparison + + + // Test of the class + static int Test(void); + static int Test(char **test_dates, const char *format); + +#endif + +}; + + +/////// + // Copy constructor +/////// + +inline +HtDateTime::HtDateTime (const HtDateTime& rhs) +{ + // Copy the contents + Ht_t = rhs.Ht_t; + local_time = rhs.local_time; +} + +/////// + // Operator overloading +/////// + +inline +bool HtDateTime::operator==(const HtDateTime &right) const +{ + if(Ht_t==right.Ht_t) + return true; + else + return false; +} + +inline +bool HtDateTime::operator<(const HtDateTime &right) const +{ + if(Ht_t < right.Ht_t) return true; + else return false; +} + +/////// + // Copy +/////// + +inline +HtDateTime &HtDateTime::operator=(const HtDateTime &right) +{ + if (this != &right) + { + Ht_t=right.Ht_t; // Copy the time_t value + local_time=right.local_time; // Copy the local_time flag + } + + return *this; +} + +inline +HtDateTime &HtDateTime::operator=(const int right) +{ + Ht_t=(time_t)right; // Copy the int as a time_t value + ToLocalTime(); + return *this; +} + + + + +#endif |