ptime.h
上传用户:hzhsqp
上传日期:2007-01-06
资源大小:1600k
文件大小:18k
源码类别:

IP电话/视频会议

开发平台:

Visual C++

  1. /*
  2.  * ptime.h
  3.  *
  4.  * Time and date class.
  5.  *
  6.  * Portable Windows Library
  7.  *
  8.  * Copyright (c) 1993-1998 Equivalence Pty. Ltd.
  9.  *
  10.  * The contents of this file are subject to the Mozilla Public License
  11.  * Version 1.0 (the "License"); you may not use this file except in
  12.  * compliance with the License. You may obtain a copy of the License at
  13.  * http://www.mozilla.org/MPL/
  14.  *
  15.  * Software distributed under the License is distributed on an "AS IS"
  16.  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  17.  * the License for the specific language governing rights and limitations
  18.  * under the License.
  19.  *
  20.  * The Original Code is Portable Windows Library.
  21.  *
  22.  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
  23.  *
  24.  * Portions are Copyright (C) 1993 Free Software Foundation, Inc.
  25.  * All Rights Reserved.
  26.  *
  27.  * Contributor(s): ______________________________________.
  28.  *
  29.  * $Log: ptime.h,v $
  30.  * Revision 1.28  2000/04/29 08:14:52  robertj
  31.  * Added some documentation on string formats that can be parsed into a time.
  32.  *
  33.  * Revision 1.27  2000/04/29 04:49:00  robertj
  34.  * Added microseconds to string output.
  35.  *
  36.  * Revision 1.26  2000/04/05 02:50:16  robertj
  37.  * Added microseconds to PTime class.
  38.  *
  39.  * Revision 1.25  1999/03/09 02:59:50  robertj
  40.  * Changed comments to doc++ compatible documentation.
  41.  *
  42.  * Revision 1.24  1999/02/16 08:11:10  robertj
  43.  * MSVC 6.0 compatibility changes.
  44.  *
  45.  * Revision 1.23  1998/09/23 06:21:15  robertj
  46.  * Added open source copyright license.
  47.  *
  48.  * Revision 1.22  1998/01/04 08:04:27  robertj
  49.  * Changed gmtime and locatime to use operating system specific functions.
  50.  *
  51.  * Revision 1.21  1997/01/12 04:21:40  robertj
  52.  * Added IsPast() and IsFuture() functions for time comparison.
  53.  *
  54.  * Revision 1.20  1996/05/09 12:16:06  robertj
  55.  * Fixed syntax error found by Mac platform.
  56.  *
  57.  * Revision 1.19  1996/02/15 14:47:34  robertj
  58.  * Fixed bugs in time zone compensation (some in the C library).
  59.  *
  60.  * Revision 1.18  1996/02/13 12:58:43  robertj
  61.  * Changed GetTimeZone() so can specify standard/daylight time.
  62.  *
  63.  * Revision 1.17  1996/02/08 12:13:03  robertj
  64.  * Changed zone parameter in PTime to indicate the time zone as minutes not enum.
  65.  * Staticised some functions that are system global.
  66.  *
  67.  * Revision 1.16  1996/02/03 11:04:52  robertj
  68.  * Added string constructor for times, parses date/time from string.
  69.  *
  70.  * Revision 1.15  1996/01/03 11:09:34  robertj
  71.  * Added Universal Time and Time Zones to PTime class.
  72.  *
  73.  * Revision 1.14  1995/06/17 11:13:10  robertj
  74.  * Documentation update.
  75.  *
  76.  * Revision 1.13  1995/03/14 12:42:18  robertj
  77.  * Updated documentation to use HTML codes.
  78.  *
  79.  * Revision 1.12  1995/01/11  09:45:12  robertj
  80.  * Documentation and normalisation.
  81.  *
  82.  * Revision 1.11  1995/01/09  12:34:05  robertj
  83.  * Removed unnecesary return value from I/O functions.
  84.  *
  85.  * Revision 1.10  1994/08/23  11:32:52  robertj
  86.  * Oops
  87.  *
  88.  * Revision 1.9  1994/08/22  00:46:48  robertj
  89.  * Added pragma fro GNU C++ compiler.
  90.  *
  91.  * Revision 1.8  1994/07/27  05:58:07  robertj
  92.  * Synchronisation.
  93.  *
  94.  * Revision 1.7  1994/06/25  11:55:15  robertj
  95.  * Unix version synchronisation.
  96.  *
  97.  * Revision 1.6  1994/01/13  03:16:09  robertj
  98.  * Added function to return time as a string.
  99.  *
  100.  * Revision 1.5  1994/01/03  04:42:23  robertj
  101.  * Mass changes to common container classes and interactors etc etc etc.
  102.  *
  103.  * Revision 1.4  1993/12/31  06:45:38  robertj
  104.  * Made inlines optional for debugging purposes.
  105.  *
  106.  * Revision 1.3  1993/08/27  18:17:47  robertj
  107.  * Made time functions common to all platforms.
  108.  * Moved timer resolution function to PTimeInterval wher it belongs.
  109.  *
  110.  * Revision 1.2  1993/07/14  12:49:16  robertj
  111.  * Fixed RCS keywords.
  112.  *
  113.  */
  114. #define _PTIME
  115. #ifdef __GNUC__
  116. #pragma interface
  117. #endif
  118. #include <time.h>
  119. ///////////////////////////////////////////////////////////////////////////////
  120. // System time and date class
  121. class PTimeInterval;
  122. /**This class defines an absolute time and date. It has a number of time and
  123.    date rendering and manipulation functions. It is based on the standard C
  124.    library functions for time. Thus it is based on a number of seconds since
  125.    1 January 1970.
  126.  */
  127. class PTime : public PObject
  128. {
  129.   PCLASSINFO(PTime, PObject);
  130.   public:
  131.   /**@name Construction */
  132.   //@{
  133.     /** Time Zone special codes. The value for a time zone is usually in minutes
  134.         from UTC, this enum are special values for specific areas.
  135.       */
  136.     enum {
  137.       /// Universal Coordinated Time.
  138.       UTC   = 0,
  139.       /// Greenwich Mean Time, effectively UTC.
  140.       GMT   = UTC,
  141.       /// Local Time.
  142.       Local = 9999
  143.     };
  144.     /**Create a time object instance.
  145.        This initialises the time with the current time in the current time zone.
  146.      */
  147.     PTime();
  148.     /**Create a time object instance.
  149.        This initialises the time to the specified time.
  150.      */
  151.     PTime(
  152.       time_t tsecs,          /// Time in seconds since 00:00:00 1/1/70 UTC
  153.       long usecs = 0
  154.     ) { theTime = tsecs; microseconds = usecs; }
  155.     /**Create a time object instance.
  156.        This initialises the time to the specified time, parsed from the
  157.        string. The string may be in many different formats, for example:
  158.           "5/03/1999 12:34:56"
  159.           "15/06/1999 12:34:56"
  160.           "15/06/01 12:34:56 PST"
  161.           "5/06/02 12:34:56"
  162.           "5/23/1999 12:34am"
  163.           "5/23/00 12:34am"
  164.           "1999/23/04 12:34:56"
  165.           "Mar 3, 1999 12:34pm"
  166.           "3 Jul 2004 12:34pm"
  167.           "12:34:56 5 December 1999"
  168.           "10 minutes ago"
  169.           "2 weeks"
  170.      */
  171.     PTime(
  172.       const PString & str   /// Time and data as a string
  173.     );
  174.     /**Create a time object instance.
  175.        This initialises the time to the specified time.
  176.      */
  177.     PTime(
  178.       int second,           /// Second from 0 to 59.
  179.       int minute,           /// Minute from 0 to 59.
  180.       int hour,             /// Hour from 0 to 23.
  181.       int day,              /// Day of month from 1 to 31.
  182.       int month,            /// Month from 1 to 12.
  183.       int year,             /// Year from 1970 to 2038
  184.       int tz = Local        /// local time or UTC
  185.     );
  186.   //@}
  187.   /**@name Overrides from class PObject */
  188.   //@{
  189.     /**Create a copy of the time on the heap. It is the responsibility of the
  190.        caller to delete the created object.
  191.     
  192.        @return
  193.        pointer to new time.
  194.      */
  195.     PObject * Clone() const;
  196.     /**Determine the relative rank of the specified times. This ranks the
  197.        times as you would expect.
  198.        
  199.        @return
  200.        rank of the two times.
  201.      */
  202.     virtual Comparison Compare(
  203.       const PObject & obj   /// Other time to compare against.
  204.     ) const;
  205.     /**Output the time to the stream. This uses the #AsString()# function
  206.        with the #ShortDateTime# parameter.
  207.      */
  208.     virtual void PrintOn(
  209.       ostream & strm    /// Stream to output the time to.
  210.     ) const;
  211.     /**Input the time from the specified stream. If a parse error occurs the
  212.        time is set to the current time. The string may be in many different
  213.        formats, for example:
  214.           "5/03/1999 12:34:56"
  215.           "15/06/1999 12:34:56"
  216.           "15/06/01 12:34:56 PST"
  217.           "5/06/02 12:34:56"
  218.           "5/23/1999 12:34am"
  219.           "5/23/00 12:34am"
  220.           "1999/23/04 12:34:56"
  221.           "Mar 3, 1999 12:34pm"
  222.           "3 Jul 2004 12:34pm"
  223.           "12:34:56 5 December 1999"
  224.           "10 minutes ago"
  225.           "2 weeks"
  226.      */
  227.     virtual void ReadFrom(
  228.       istream & strm    /// Stream to input the time from.
  229.     );
  230.   //@}
  231.   /**@name Access functions */
  232.   //@{
  233.     /**Get the total microseconds since the epoch. The epoch is the 1st
  234.        January 1970.
  235.        @return
  236.        microseconds.
  237.      */
  238.     PInt64 GetTimestamp() const;
  239.     /**Get the total seconds since the epoch. The epoch is the 1st
  240.        January 1970.
  241.        @return
  242.        seconds.
  243.      */
  244.     time_t GetTimeInSeconds() const;
  245.     /**Get the microsecond part of the time.
  246.        @return
  247.        integer in range 0..999999.
  248.      */
  249.     long GetMicrosecond() const;
  250.     /**Get the second of the time.
  251.        @return
  252.        integer in range 0..59.
  253.      */
  254.     int GetSecond() const;
  255.     /**Get the minute of the time.
  256.        @return
  257.        integer in range 0..59.
  258.      */
  259.     int GetMinute() const;
  260.     /**Get the hour of the time.
  261.        @return
  262.        integer in range 0..23.
  263.      */
  264.     int GetHour() const;
  265.     /**Get the day of the month of the date.
  266.        @return
  267.        integer in range 1..31.
  268.      */
  269.     int GetDay() const;
  270.     /// Month codes.
  271.     enum Months {
  272.       January = 1,
  273.       February,
  274.       March,
  275.       April,
  276.       May,
  277.       June,
  278.       July,
  279.       August,
  280.       September,
  281.       October,
  282.       November,
  283.       December
  284.     };
  285.     /**Get the month of the date.
  286.        @return
  287.        enum for month.
  288.      */
  289.     Months GetMonth() const;
  290.     /**Get the year of the date.
  291.        @return
  292.        integer in range 1970..2038.
  293.      */
  294.     int GetYear() const;
  295.     /// Days of the week.
  296.     enum Weekdays {
  297.       Sunday,
  298.       Monday,
  299.       Tuesday,
  300.       Wednesday,
  301.       Thursday,
  302.       Friday,
  303.       Saturday
  304.     };
  305.     /**Get the day of the week of the date.
  306.     
  307.        @return
  308.        enum for week days with 0=Sun, 1=Mon, ..., 6=Sat.
  309.      */
  310.     Weekdays GetDayOfWeek() const;
  311.     /**Get the day in the year of the date.
  312.     
  313.        @return
  314.        integer from 1..366.
  315.      */
  316.     int GetDayOfYear() const;
  317.     /**Determine if the time is in the past or in the future.
  318.        @return
  319.        TRUE if time is before the current real time.
  320.      */
  321.     BOOL IsPast() const;
  322.     /**Determine if the time is in the past or in the future.
  323.        @return
  324.        TRUE if time is after the current real time.
  325.      */
  326.     BOOL IsFuture() const;
  327.   //@}
  328.   /**@name Time Zone configuration functions */
  329.   //@{
  330.     /**Get flag indicating daylight savings is current.
  331.     
  332.        @return
  333.        TRUE if daylight savings time is active.
  334.      */
  335.     static BOOL IsDaylightSavings();
  336.     /// Flag for time zone adjustment on daylight savings.
  337.     enum TimeZoneType {
  338.       StandardTime,
  339.       DaylightSavings
  340.     };
  341.     /// Get the time zone offset in minutes.
  342.     static int GetTimeZone();
  343.     /**Get the time zone offset in minutes.
  344.        This is the number of minutes to add to UTC (previously known as GMT) to
  345.        get the local time. The first form automatically adjusts for daylight
  346.        savings time, whilst the second form returns the specified time.
  347.        @return
  348.        Number of minutes.
  349.      */
  350.     static int GetTimeZone(
  351.        TimeZoneType type  /// Daylight saving or standard time.
  352.     );
  353.     /**Get the text identifier for the local time zone .
  354.        @return
  355.        Time zone identifier string.
  356.      */
  357.     static PString GetTimeZoneString(
  358.        TimeZoneType type = StandardTime /// Daylight saving or standard time.
  359.     );
  360.   //@}
  361.   /**@name Operations */
  362.   //@{
  363.     /**Add the interval to the time to yield a new time.
  364.     
  365.        @return
  366.        Time altered by the interval.
  367.      */
  368.     PTime operator+(
  369.       const PTimeInterval & time   /// Time interval to add to the time.
  370.     ) const;
  371.     /**Add the interval to the time changing the instance.
  372.     
  373.        @return
  374.        reference to the current time instance.
  375.      */
  376.     PTime & operator+=(
  377.       const PTimeInterval & time   /// Time interval to add to the time.
  378.     );
  379.     /**Calculate the difference between two times to get a time interval.
  380.     
  381.        @return
  382.        Time intervale difference between the times.
  383.      */
  384.     PTimeInterval operator-(
  385.       const PTime & time   /// Time to subtract from the time.
  386.     ) const;
  387.     /**Subtract the interval from the time to yield a new time.
  388.     
  389.        @return
  390.        Time altered by the interval.
  391.      */
  392.     PTime operator-(
  393.       const PTimeInterval & time   /// Time interval to subtract from the time.
  394.     ) const;
  395.     /**Subtract the interval from the time changing the instance.
  396.        @return
  397.        reference to the current time instance.
  398.      */
  399.     PTime & operator-=(
  400.       const PTimeInterval & time   /// Time interval to subtract from the time.
  401.     );
  402.   //@}
  403.   /**@name String conversion functions */
  404.   //@{
  405.     /// Standard time formats for string representations of a time and date.
  406.     enum TimeFormat {
  407.       /// Internet standard format.
  408.       RFC1123,
  409.       /// Date with weekday, full month names and time with seconds.
  410.       LongDateTime,
  411.       /// Date with weekday, full month names and no time.
  412.       LongDate,
  413.       /// Time with seconds.
  414.       LongTime,
  415.       /// Date with abbreviated month names and time without seconds.
  416.       MediumDateTime,
  417.       /// Date with abbreviated month names and no time.
  418.       MediumDate,
  419.       /// Date with numeric month name and time without seconds.
  420.       ShortDateTime,
  421.       /// Date with numeric month and no time.
  422.       ShortDate,
  423.       /// Time without seconds.
  424.       ShortTime,
  425.       NumTimeStrings
  426.     };
  427.     /** Convert the time to a string representation. */
  428.     PString AsString(
  429.       TimeFormat formatCode = RFC1123,  /// Standard format for time.
  430.       int zone = Local                  /// Time zone for the time.
  431.     ) const;
  432.     /** Convert the time to a string representation. */
  433.     PString AsString(
  434.       const PString & formatStr, /// Arbitrary format string for time.
  435.       int zone = Local           /// Time zone for the time.
  436.     ) const;
  437.     /* Convert the time to a string using the format code or string as a
  438.        formatting template. The special characters in the formatting string
  439.        are:
  440. begin{description}
  441.        item[h]         hour without leading zero
  442.        item[hh]        hour with leading zero
  443.        item[m]         minute without leading zero
  444.        item[mm]        minute with leading zero
  445.        item[s]         second without leading zero
  446.        item[ss]        second with leading zero
  447.        item[u]         tenths of second
  448.        item[uu]        hundedths of second with leading zero
  449.        item[uuu]       millisecond with leading zeros
  450.        item[uuuu]      microsecond with leading zeros
  451.        item[a]         the am/pm string
  452.        item[w/ww/www]  abbreviated day of week name
  453.        item[wwww]      full day of week name
  454.        item[d]         day of month without leading zero
  455.        item[dd]        day of month with leading zero
  456.        item[M]         month of year without leading zero
  457.        item[MM]        month of year with leading zero
  458.        item[MMM]       month of year as abbreviated text
  459.        item[MMMM]      month of year as full text
  460.        item[y/yy]      year without century
  461.        item[yyy/yyyy]  year with century
  462.        item[z]         the time zone description
  463. end{description}
  464.        All other characters are copied to the output string unchanged.
  465.        
  466.        Note if there is an 'a' character in the string, the hour will be in 12
  467.        hour format, otherwise in 24 hour format.
  468.      */
  469.     PString AsString(
  470.       const char * formatPtr,    /// Arbitrary format C string pointer for time.
  471.       int zone = Local           /// Time zone for the time.
  472.     ) const;
  473.   //@}
  474.   /**@name Internationalisation functions */
  475.   //@{
  476.     /**Get the internationalised time separator.
  477.     
  478.        @return
  479.        string for time separator.
  480.      */
  481.     static PString GetTimeSeparator();
  482.     /**Get the internationalised time format: AM/PM or 24 hour.
  483.     
  484.        @return
  485.        TRUE is 12 hour, FALSE if 24 hour.
  486.      */
  487.     static BOOL GetTimeAMPM();
  488.     /**Get the internationalised time AM string.
  489.     
  490.        @return
  491.        string for AM.
  492.      */
  493.     static PString GetTimeAM();
  494.     /**Get the internationalised time PM string.
  495.     
  496.        @return
  497.        string for PM.
  498.      */
  499.     static PString GetTimePM();
  500.     /// Flag for returning language dependent string names.
  501.     enum NameType {
  502.       FullName,
  503.       Abbreviated
  504.     };
  505.     /**Get the internationalised day of week day name (0=Sun etc).
  506.     
  507.        @return
  508.        string for week day.
  509.      */
  510.     static PString GetDayName(
  511.       Weekdays dayOfWeek,       /// Code for day of week.
  512.       NameType type = FullName  /// Flag for abbreviated or full name.
  513.     );
  514.     /**Get the internationalised date separator.
  515.     
  516.        @return
  517.        string for date separator.
  518.      */
  519.     static PString GetDateSeparator();
  520.     /**Get the internationalised month name string (1=Jan etc).
  521.     
  522.        @return
  523.        string for month.
  524.      */
  525.     static PString GetMonthName(
  526.       Months month,             /// Code for month in year.
  527.       NameType type = FullName  /// Flag for abbreviated or full name.
  528.     );
  529.     /// Possible orders for date components.
  530.     enum DateOrder {
  531.       MonthDayYear,   // Date is ordered month then day then year.
  532.       DayMonthYear,   // Date is ordered day then month then year.
  533.       YearMonthDay    // Date is ordered year then day month then day.
  534.     };
  535.     /**Return the internationalised date order.
  536.     
  537.        @return
  538.        code for date ordering.
  539.      */
  540.     static DateOrder GetDateOrder();
  541.   //@}
  542.     static struct tm * os_localtime(const time_t * clock, struct tm * t);
  543.     static struct tm * os_gmtime(const time_t * clock, struct tm * t);
  544.     /*
  545.       Threadsafe version of localtime library call.
  546.       We could make these calls non-static if we could put the struct tm inside the
  547.       instance. But these calls are usually made with const objects so that's not possible,
  548.       and we would require per-thread storage otherwise. Sigh...
  549.     */
  550.   protected:
  551.     // Member variables
  552.     /// Number of seconds since 1 January 1970.
  553.     time_t theTime;
  554.     long   microseconds;
  555. #ifdef DOC_PLUS_PLUS
  556. };
  557. #endif
  558. // Class declaration continued in platform specific header file ///////////////