ncbitime.hpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:39k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: ncbitime.hpp,v $
  4.  * PRODUCTION Revision 1000.5  2004/04/21 14:34:55  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.33
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef CORELIB__NCBITIME__HPP
  10. #define CORELIB__NCBITIME__HPP
  11. /*  $Id: ncbitime.hpp,v 1000.5 2004/04/21 14:34:55 gouriano Exp $
  12.  * ===========================================================================
  13.  *
  14.  *                            PUBLIC DOMAIN NOTICE
  15.  *               National Center for Biotechnology Information
  16.  *
  17.  *  This software/database is a "United States Government Work" under the
  18.  *  terms of the United States Copyright Act.  It was written as part of
  19.  *  the author's official duties as a United States Government employee and
  20.  *  thus cannot be copyrighted.  This software/database is freely available
  21.  *  to the public for use. The National Library of Medicine and the U.S.
  22.  *  Government have not placed any restriction on its use or reproduction.
  23.  *
  24.  *  Although all reasonable efforts have been taken to ensure the accuracy
  25.  *  and reliability of the software and data, the NLM and the U.S.
  26.  *  Government do not and cannot warrant the performance or results that
  27.  *  may be obtained by using this software or data. The NLM and the U.S.
  28.  *  Government disclaim all warranties, express or implied, including
  29.  *  warranties of performance, merchantability or fitness for any particular
  30.  *  purpose.
  31.  *
  32.  *  Please cite the author in any work or product based on this material.
  33.  *
  34.  * ===========================================================================
  35.  *
  36.  * Authors:  Anton Butanayev, Denis Vakatov, Vladimir Ivanov
  37.  *
  38.  * DayOfWeek():  Used code has been posted on comp.lang.c on March 10th, 1993
  39.  *               by Tomohiko Sakamoto (sakamoto@sm.sony.co.jp).
  40.  *
  41.  */
  42. /// @file ncbitime.hpp
  43. /// Defines CTime, the standard Date/Time class which also can be used
  44. /// to span time (to represent elapsed time).
  45. ///
  46. /// NOTE: 
  47. ///   - Do not use Local time and time_t and its dependent functions with
  48. ///     dates outside range January 1, 1970 to January 18, 2038.
  49. ///     Also avoid to use GMT -> Local time conversion functions.
  50. ///
  51. ///   - Do not use DataBase conversion functions with dates
  52. ///     less than January 1, 1900.
  53. ///
  54. ///   - Mac OS 9 does not correctly support daylight savings flag.
  55. ///     CTime implementation does not support Daylight on this platform.
  56. #include <corelib/ncbistd.hpp>
  57. #include <corelib/ncbitype.h>
  58. #include <time.h>
  59. BEGIN_NCBI_SCOPE
  60. /** @addtogroup Time
  61.  *
  62.  * @{
  63.  */
  64. /////////////////////////////////////////////////////////////////////////////
  65. ///
  66. /// CTimeException --
  67. ///
  68. /// Define exceptions generated by CTime.
  69. ///
  70. /// CTimeException inherits its basic functionality from CCoreException
  71. /// and defines additional error codes.
  72. class NCBI_XNCBI_EXPORT CTimeException : public CCoreException
  73. {
  74. public:
  75.     /// Error types that CTime can generate.
  76.     enum EErrCode {
  77.         eInvalid,       ///< Invalid time value
  78.         eArgument,      ///< Bad function argument
  79.         eFormat         ///< Incorrect format
  80.     };
  81.     /// Translate from the error code value to its string representation.
  82.     virtual const char* GetErrCodeString(void) const
  83.     {
  84.         switch (GetErrCode()) {
  85.         case eInvalid:   return "eInvalid";
  86.         case eFormat:    return "eFormat";
  87.         default:    return CException::GetErrCodeString();
  88.         }
  89.     }
  90.     // Standard exception boilerplate code.
  91.     NCBI_EXCEPTION_DEFAULT(CTimeException, CCoreException);
  92. };
  93. /// Number of nanoseconds in one second.
  94. ///
  95. /// Interval for it is from 0 to 999,999,999. 
  96. const long kNanoSecondsPerSecond = 1000000000;
  97. /// Number of microseconds in one second.
  98. ///
  99. /// Interval for it is from 0 to 999,999. 
  100. const long kMicroSecondsPerSecond = 1000000;
  101. /// Number milliseconds in one second.
  102. ///
  103. /// Interval for it is from 0 to 999.
  104. const long kMilliSecondsPerSecond = 1000;
  105. // Time formats in databases (always contain local time only!)
  106. /// Database format for time where day and time is unsigned 16 bit.
  107. typedef struct {
  108.     Uint2 days;   ///< Days from 1/1/1900
  109.     Uint2 time;   ///< Minutes from begin of current day
  110. } TDBTimeU, *TDBTimeUPtr;
  111. /// Database format for time where day and time is signed 32 bit.
  112. typedef struct {
  113.     Int4  days;   ///< days from 1/1/1900
  114.     Int4  time;   ///< x/300 seconds from begin of current day
  115. } TDBTimeI, *TDBTimeIPtr;
  116. /////////////////////////////////////////////////////////////////////////////
  117. ///
  118. /// CTime --
  119. ///
  120. /// Defines a standard Date/Time class.
  121. ///
  122. /// Can be used to span time (to represent elapsed time). Can operate with
  123. /// local and UTC time. The time is kept in class in the format in which it
  124. /// was originally given. 
  125. ///
  126. /// Throw exception of type CTimeException on errors.
  127. ///
  128. /// NOTE: Do not use local time with time span and dates < "1/1/1900"
  129. /// (use GMT time only!!!).
  130. class NCBI_XNCBI_EXPORT CTime
  131. {
  132. public:
  133.     /// Which initial value to use for time.
  134.     enum EInitMode {
  135.         eCurrent,     ///< Use current time
  136.         eEmpty        ///< Use "empty" time
  137.     };
  138.     
  139.     /// Which initial value to use for timezone.
  140.     enum ETimeZone {
  141.         eLocal,       ///< Use local time
  142.         eGmt          ///< Use GMT (Greenwich Mean Time)
  143.     };
  144.     /// Current timezone. Used in AsString() method.
  145.     enum {
  146.     eCurrentTimeZone= -1
  147.     };
  148.     /// Which format use to get name of month or week of day.
  149.     enum ENameFormat {
  150.         eFull,        ///< Use full name.
  151.         eAbbr         ///< Use abbreviated name.
  152.     };
  153.     // Month names.
  154.     enum EMonth {
  155.         eJanuary = 1,
  156.         eFebruary,
  157.         eMarch,
  158.         eApril,
  159.         eMay,
  160.         eJune,
  161.         eJuly,
  162.         eAugust,
  163.         eSeptember,
  164.         eOctober,
  165.         eNovember,
  166.         eDecember
  167.     };
  168.     // Day of week names.
  169.     enum EDayOfWeek {
  170.         eSunday = 0,
  171.         eMonday,
  172.         eTuesday,
  173.         eWednesday,
  174.         eThursday,
  175.         eFriday,
  176.         eSaturday
  177.     };
  178.     /// What time zone precision to use for adjusting daylight saving time.
  179.     ///
  180.     /// Controls when (if ever) to adjust for the daylight saving time
  181.     /// (only if the time is represented in local timezone format).
  182.     ///
  183.     /// NOTE: if diff between previous time value and the time
  184.     /// after manipulation is greater than this range, then try apply
  185.     /// daylight saving conversion on the result time value.
  186.     enum ETimeZonePrecision {
  187.         eNone,    ///< Daylight saving not to affect time manipulations.
  188.         eMinute,  ///< Check condition - new minute.
  189.         eHour,    ///< Check condition - new hour.
  190.         eDay,     ///< Check condition - new day.
  191.         eMonth,   ///< Check condition - new month.
  192.         eTZPrecisionDefault = eNone
  193.     };
  194.     /// Whether to adjust for daylight saving time.
  195.     enum EDaylight {
  196.         eIgnoreDaylight,   ///< Ignore daylight savings time.
  197.         eAdjustDaylight,   ///< Adjust for daylight savings time.
  198.         eDaylightDefault = eAdjustDaylight
  199.     };
  200.     /// Constructor.
  201.     ///
  202.     /// @param mode
  203.     ///   Whether to build time object with current time or empty
  204.     ///   time (default).
  205.     /// @param tz
  206.     ///   Whether to use local time (default) or GMT. 
  207.     /// @param tzp
  208.     ///   What time zone precision to use.
  209.     CTime(EInitMode          mode = eEmpty,
  210.           ETimeZone          tz   = eLocal,
  211.           ETimeZonePrecision tzp  = eTZPrecisionDefault);
  212.     /// Explicit conversion constructor for time_t representation of time.
  213.     ///
  214.     /// Construct time object from UTC time_t value (assuming it is eGMT).
  215.     ///
  216.     /// @param t
  217.     ///   Time in the UTC time_t format.
  218.     /// @param tzp
  219.     ///   What time zone precision to use.
  220.     explicit CTime(time_t t, ETimeZonePrecision tzp = eTZPrecisionDefault);
  221.     /// Constructor.
  222.     ///
  223.     /// Construct time given the year, month, day, hour, minute, second,
  224.     /// nanosecond parts of a time value.
  225.     ///
  226.     /// @param year
  227.     ///   Year part of time.
  228.     /// @param month
  229.     ///   Month part of time. Note month starts from 1.
  230.     /// @param day
  231.     ///   Day part of time. Note day starts from 1.
  232.     /// @param second
  233.     ///   Second part of time.
  234.     /// @param nanosecond
  235.     ///   Nanosecond part of time.
  236.     /// @param tz
  237.     ///   Whether to use local time (default) or GMT. 
  238.     /// @param tzp
  239.     ///   What time zone precision to use.
  240.     CTime(int year, int month, int day,
  241.           int hour = 0, int minute = 0, int second = 0, long nanosecond = 0,
  242.           ETimeZone tz = eLocal,
  243.           ETimeZonePrecision tzp = eTZPrecisionDefault);
  244.     /// Constructor.
  245.     ///
  246.     /// Construct date as N-th day of the year.
  247.     ///
  248.     /// @param year
  249.     ///   Year part of date.
  250.     /// @param yearDayNumber
  251.     ///   N-th day of the year.
  252.     /// @param tz
  253.     ///   Whether to use local time (default) or GMT. 
  254.     /// @param tzp
  255.     ///   What time zone precision to use.
  256.     CTime(int year, int yearDayNumber,
  257.           ETimeZone tz = eLocal,
  258.           ETimeZonePrecision tzp = eTZPrecisionDefault);
  259.     /// Explicit conversion constructor for string representation of time.
  260.     ///
  261.     /// Construct time object from string representation of time.
  262.     ///
  263.     /// @param str
  264.     ///   String representation of time in format "fmt".
  265.     /// @param fmt
  266.     ///   Format in which "str" is presented. Default value of kEmptyStr,
  267.     ///   implies the "M/D/Y h:m:s" format.
  268.     /// @param tz
  269.     ///   Whether to use local time (default) or GMT. 
  270.     /// @param tzp
  271.     ///   What time zone precision to use.
  272.     explicit CTime(const string& str, const string& fmt = kEmptyStr,
  273.                    ETimeZone tz = eLocal,
  274.                    ETimeZonePrecision tzp = eTZPrecisionDefault);
  275.     /// Copy constructor.
  276.     CTime(const CTime& t);
  277.     /// Assignment operator.
  278.     CTime& operator = (const CTime& t);
  279.     /// Assignment operator -- rhs is string.
  280.     ///
  281.     /// If current format contains 'Z', then TimeZone will be set to:
  282.     /// - eGMT if "str" has word "GMT" in the appropriate position;
  283.     /// - eLocal otherwise.
  284.     ///
  285.     /// If current format does not contain 'Z', TimeZone will not be changed.
  286.     CTime& operator = (const string& str);
  287.     /// Set time using time_t time value.
  288.     ///
  289.     /// @param t
  290.     ///   Time to set in time object. This is always in GMT time format, and
  291.     ///   nanoseconds will be truncated. 
  292.     /// @return
  293.     ///   Time object that is set.
  294.     CTime& SetTimeT(const time_t& t);
  295.     /// Get time (time_t format).
  296.     ///
  297.     /// The function return the number of seconds elapsed since midnight
  298.     /// (00:00:00), January 1, 1970. Do not use this function if year is
  299.     /// less 1970.
  300.     /// @return
  301.     ///   Time in time_t format.
  302.     time_t GetTimeT(void) const;
  303.     /// Set time using database format time, TDBTimeU.
  304.     ///
  305.     /// Object's time format will always change to eLocal after call.
  306.     ///
  307.     /// @param t
  308.     ///   Time to set in time object in TDBTimeU format.
  309.     ///   This is always in local time format, and seconds, and nanoseconds
  310.     ///   will be truncated. 
  311.     /// @return
  312.     ///   Time object that is set.
  313.     CTime& SetTimeDBU(const TDBTimeU& t);
  314.     /// Set time using database format time, TDBTimeI.
  315.     ///
  316.     /// Object's time format will always change to eLocal after call.
  317.     ///
  318.     /// @param t
  319.     ///   Time to set in time object in TDBTimeI format.
  320.     ///   This is always in local time format, and seconds, and nanoseconds
  321.     ///   will be truncated. 
  322.     /// @return
  323.     ///   Time object that is set.
  324.     CTime& SetTimeDBI(const TDBTimeI& t);
  325.     /// Get time in database format time, TDBTimeU.
  326.     ///
  327.     /// @return
  328.     ///   Time value in database format, TDBTimeU.
  329.     TDBTimeU GetTimeDBU(void) const;
  330.     /// Get time in database format time, TDBTimeI.
  331.     ///
  332.     /// @return
  333.     ///   Time value in database format TDBTimeI.
  334.     TDBTimeI GetTimeDBI(void) const;
  335.     /// Make the time current in the presently active time zone.
  336.     CTime& SetCurrent(void);
  337.     
  338.     /// Make the time "empty",
  339.     CTime& Clear(void);
  340.     
  341.     /// Truncate the time to days (strip H,M,S and Nanoseconds.
  342.     CTime& Truncate(void);
  343.     /// Set the current time format.
  344.     /// 
  345.     /// The default format is: "M/D/Y h:m:s".
  346.     /// @param fmt
  347.     ///   String of letters describing the time format. The letters having
  348.     ///   the following meanings:
  349.     ///   - Y = year with century
  350.     ///   - y = year without century (00-99)
  351.     ///   - M = month as decimal number (01-12)
  352.     ///   - B = full month name
  353.     ///   - b = abbeviated month name
  354.     ///   - D = day as decimal number (01-31)
  355.     ///   - h = hour in 24-hour format (00-23)
  356.     ///   - m = minute as decimal number (00-59)
  357.     ///   - s = second as decimal number (00-59)
  358.     ///   - S = nanosecond as decimal number (000000000-999999999)
  359.     ///   - Z = timezone format (GMT or none) 
  360.     ///   - W = full day of week name
  361.     ///   - w = abbreviated day of week name
  362.     /// @sa
  363.     ///   GetFormat()
  364.     static void SetFormat(const string& fmt);
  365.     /// Get the current time format.
  366.     /// 
  367.     /// The default format is: "M/D/Y h:m:s".
  368.     /// @return
  369.     ///   A string of letters describing the time format. The letters having
  370.     ///   the following meanings:
  371.     ///   - Y = year with century
  372.     ///   - y = year without century (00-99)
  373.     ///   - M = month as decimal number (01-12)
  374.     ///   - B = full month name
  375.     ///   - b = abbeviated month name
  376.     ///   - D = day as decimal number (01-31)
  377.     ///   - h = hour in 24-hour format (00-23)
  378.     ///   - m = minute as decimal number (00-59)
  379.     ///   - s = second as decimal number (00-59)
  380.     ///   - S = nanosecond as decimal number (000000000-999999999)
  381.     ///   - Z = timezone format (GMT or none) 
  382.     ///   - W = full day of week name
  383.     ///   - w = abbreviated day of week name
  384.     /// @sa
  385.     ///   SetFormat()
  386.     static string GetFormat(void);
  387.     /// Get numerical value of the month by name.
  388.     ///
  389.     /// @param month
  390.     ///   Full or abbreviated month name.
  391.     /// @return
  392.     ///   Numerical value of a given month (1..12).
  393.     /// @sa
  394.     ///   MonthNumToName(), Month()
  395.     static int MonthNameToNum(const string& month);
  396.     /// Get name of the month by numerical value.
  397.     ///
  398.     /// @param month
  399.     ///   Full or abbreviated month name.
  400.     /// @param format
  401.     ///   Format for returned value (full or abbreviated).
  402.     /// @return
  403.     ///   Name of the month.
  404.     /// @sa
  405.     ///   MonthNameToNum(), Month()
  406.     static string MonthNumToName(int month, ENameFormat format = eFull);
  407.     /// Get numerical value of the day of week by name.
  408.     ///
  409.     /// @param day
  410.     ///   Full or abbreviated day of week name.
  411.     /// @return
  412.     ///   Numerical value of a given day of week (0..6).
  413.     /// @sa
  414.     ///   DayOfWeekNumToName(), DayOfWeek()
  415.     static int DayOfWeekNameToNum(const string& day);
  416.     /// Get name of the day of week by numerical value.
  417.     ///
  418.     /// @param day
  419.     ///   Full or abbreviated day of week name.
  420.     /// @param format
  421.     ///   Format for returned value (full or abbreviated).
  422.     /// @return
  423.     ///   Name of the day of week.
  424.     /// @sa
  425.     ///   DayOfWeekNameToNum(), DayOfWeek()
  426.     static string DayOfWeekNumToName(int day, ENameFormat format = eFull);
  427.     
  428.     /// Transform time to string.
  429.     ///
  430.     /// Use GetFormat() to obtain format, if "fmt" is not defined (=kEmptyStr).
  431.     /// @param fmt
  432.     ///   Format specifier used to convert time to string.
  433.     /// @param out_tz
  434.     ///   Output timezone. This is a difference in seconds between GMT time
  435.     ///   and local time for some place (for example, for EST5 timezone
  436.     ///   its value is 18000). This parameter works only with local time.
  437.     ///   If the time object have GMT time that it is ignored.
  438.     ///   Before transformation to string the time will be converted to output
  439.     ///   timezone. Timezone can be printed as string 'GMT[+|-]HHMM' using
  440.     ///   format symbol 'z'. By default current timezone is used.
  441.     /// @sa
  442.     ///   GetFormat(), SetFormat()
  443.     string AsString(const string& fmt = kEmptyStr,
  444.                     long out_tz       = eCurrentTimeZone) const;
  445.     /// Return time as string using the format returned by GetFormat().
  446.     operator string(void) const;
  447.     //
  448.     // Get various components of time.
  449.     //
  450.     /// Get year.
  451.     ///
  452.     /// Year = 1900 ..  
  453.     int Year(void) const;
  454.     /// Get month.
  455.     ///
  456.     /// Month number = 1..12
  457.     int Month(void) const;
  458.     /// Get day.
  459.     ///
  460.     /// Day of the month = 1..31
  461.     int Day(void) const;
  462.     /// Get hour.
  463.     ///
  464.     /// Hours since midnight = 0..23
  465.     int Hour(void) const;
  466.     /// Get minute.
  467.     ///
  468.     /// Minutes after the hour = 0..59
  469.     int Minute(void) const;
  470.     /// Get second.
  471.     ///
  472.     /// Seconds after the minute = 0..59
  473.     int Second(void) const;
  474.     /// Get nano seconds.
  475.     ///
  476.     /// Nanoseconds after the second = 0..999999999
  477.     long NanoSecond(void) const;
  478.    
  479.     //
  480.     // Set various components of time.
  481.     //
  482.     /// Set year.
  483.     ///
  484.     /// Beware that this operation is inherently inconsistent.
  485.     /// In case of different number of days in the months, the day number
  486.     /// can change, e.g.:
  487.     ///  - "Feb 29 2000".SetYear(2001) => "Feb 28 2001".
  488.     /// Because 2001 is not leap year.
  489.     /// @param year
  490.     ///   Year to set.
  491.     /// @sa
  492.     ///   Year()
  493.     void SetYear(int year);
  494.     /// Set month.
  495.     ///
  496.     /// Beware that this operation is inherently inconsistent.
  497.     /// In case of different number of days in the months, the day number
  498.     /// can change, e.g.:
  499.     ///  - "Dec 31 2000".SetMonth(2) => "Feb 29 2000".
  500.     /// Therefore e.g. calling SetMonth(1) again that result will be "Jan 28".
  501.     /// @param month
  502.     ///   Month number to set. Month number = 1..12.
  503.     /// @sa
  504.     ///   Month()
  505.     void SetMonth(int month);
  506.     /// Set day.
  507.     ///
  508.     /// Beware that this operation is inherently inconsistent.
  509.     /// In case of number of days in the months, the day number
  510.     /// can change, e.g.:
  511.     ///  - "Feb 01 2000".SetDay(31) => "Feb 29 2000".
  512.     /// @param day
  513.     ///   Day to set. Day of the month = 1..31.
  514.     /// @sa
  515.     ///   Day()
  516.     void SetDay(int day);
  517.     /// Set hour.
  518.     ///
  519.     /// @param day
  520.     ///   Hours since midnight = 0..23.
  521.     /// @sa
  522.     ///   Hour()
  523.     void SetHour(int hour);
  524.     /// Set minute.
  525.     ///
  526.     /// @param minute
  527.     ///   Minutes after the hour = 0..59.
  528.     /// @sa
  529.     ///   Minute()
  530.     void SetMinute(int minute);
  531.     /// Set second.
  532.     ///
  533.     /// @param day
  534.     ///   Seconds after the minute = 0..59.
  535.     /// @sa
  536.     ///   Second()
  537.     void SetSecond(int second);
  538.     /// Set nano seconds.
  539.     ///
  540.     /// @param day
  541.     ///   Nanoseconds after the second = 0..999999999.
  542.     /// @sa
  543.     ///   NanoSecond()
  544.     void SetNanoSecond(long nanosecond);
  545.     /// Get year's day number.
  546.     ///
  547.     /// Year day number = 1..366
  548.     int YearDayNumber(void) const;
  549.     /// Get week number in the year.
  550.     ///
  551.     /// Calculate the week number in a year of a given date.
  552.     /// The week can start on any day accordingly given parameter.
  553.     /// First week always start with 1st January.
  554.     /// @param week_start
  555.     ///   What day of week is first.
  556.     ///   Default is to use Sunday as first day of week. For Monday-based
  557.     ///   weeks use eMonday as parameter value.
  558.     /// @return
  559.     ///   Week number = 1..54.
  560.     int YearWeekNumber(EDayOfWeek first_day_of_week = eSunday) const;
  561.     /// Get week number in current month.
  562.     ///
  563.     /// @return
  564.     ///   Week number in current month = 1..6.
  565.     /// @sa
  566.     ///   YearWeekNumber()
  567.     int MonthWeekNumber(EDayOfWeek first_day_of_week = eSunday) const;
  568.     /// Get day of week.
  569.     ///
  570.     /// Days since Sunday = 0..6
  571.     int DayOfWeek(void) const;
  572.     /// Get number of days in the current month.
  573.     ///
  574.     /// Number of days = 1..31
  575.     int DaysInMonth(void) const;
  576.     /// Add specified years and adjust for day light savings time.
  577.     ///
  578.     /// It is an exact equivalent of calling AddMonth(years * 12).
  579.     /// @sa
  580.     ///   AddMonth()
  581.     CTime& AddYear(int years = 1, EDaylight adl = eDaylightDefault);
  582.     /// Add specified months and adjust for day light savings time.
  583.     ///
  584.     /// Beware that this operation is inherently inconsistent.
  585.     /// In case of different number of days in the months, the day number
  586.     /// can change, e.g.:
  587.     ///  - "Dec 31 2000".AddMonth(2) => "Feb 28 2001" ("Feb 29" if leap year).
  588.     /// Therefore e.g. calling AddMonth(1) 12 times for e.g. "Jul 31" will
  589.     /// result in "Jul 28" (or "Jul 29") of the next year.
  590.     /// @param months
  591.     ///   Months to add. Default is 1 month.
  592.     ///   If negative, it will result in a "subtraction" operation.
  593.     /// @param adl
  594.     ///   Whether to adjust for daylight saving time. Default is to adjust
  595.     ///   for daylight savings time. This parameter is for eLocal time zone
  596.     ///   and where the time zone precision is not eNone. 
  597.     CTime& AddMonth(int months = 1, EDaylight adl = eDaylightDefault);
  598.     /// Add specified days and adjust for day light savings time.
  599.     ///
  600.     /// @param days
  601.     ///   Days to add. Default is 1 day.
  602.     ///   If negative, it will result in a "subtraction" operation.
  603.     /// @param adl
  604.     ///   Whether to adjust for daylight saving time. Default is to adjust
  605.     ///   for daylight savings time. This parameter is for eLocal time zone
  606.     ///   and where the time zone precision is not eNone. 
  607.     CTime& AddDay(int days = 1, EDaylight adl = eDaylightDefault);
  608.     /// Add specified hours and adjust for day light savings time.
  609.     ///
  610.     /// @param hours
  611.     ///   Hours to add. Default is 1 hour.
  612.     ///   If negative, it will result in a "subtraction" operation.
  613.     /// @param adl
  614.     ///   Whether to adjust for daylight saving time. Default is to adjust
  615.     ///   for daylight savings time. This parameter is for eLocal time zone
  616.     ///   and where the time zone precision is not eNone. 
  617.     CTime& AddHour(int hours = 1, EDaylight adl = eDaylightDefault);
  618.     /// Add specified minutes and adjust for day light savings time.
  619.     ///
  620.     /// @param minutes
  621.     ///   Minutes to add. Default is 1 minute.
  622.     ///   If negative, it will result in a "subtraction" operation.
  623.     /// @param adl
  624.     ///   Whether to adjust for daylight saving time. Default is to adjust
  625.     ///   for daylight savings time. This parameter is for eLocal time zone
  626.     ///   and where the time zone precision is not eNone. 
  627.     CTime& AddMinute(int minutes = 1, EDaylight adl = eDaylightDefault);
  628.     /// Add specified seconds.
  629.     ///
  630.     /// @param seconds
  631.     ///   Seconds to add. Default is 1 second.
  632.     ///   If negative, it will result in a "subtraction" operation.
  633.     CTime& AddSecond(int seconds = 1);
  634.     /// Add specified nanoseconds.
  635.     ///
  636.     /// @param nanoseconds
  637.     ///   Nanoseconds to add. Default is 1 nanosecond.
  638.     ///   If negative, it will result in a "subtraction" operation.
  639.     CTime& AddNanoSecond(long nanoseconds = 1);
  640.     // Add/subtract days
  641.     /// Operator to add days.
  642.     CTime& operator += (const int days);
  643.     /// Operator to subtract days.
  644.     CTime& operator -= (const int days);
  645.     /// Operator to increment days.
  646.     CTime& operator ++ (void);
  647.     /// Operator to decrement days.
  648.     CTime& operator -- (void);
  649.     /// Operator to increment days.
  650.     CTime  operator ++ (int);
  651.     /// Operator to decrement days.
  652.     CTime  operator -- (int);
  653.     // Time comparison ('>' means "later", '<' means "earlier")
  654.     /// Operator to test equality of time.
  655.     bool operator == (const CTime& t) const;
  656.     /// Operator to test in-equality of time.
  657.     bool operator != (const CTime& t) const;
  658.     /// Operator to test if time is later.
  659.     bool operator >  (const CTime& t) const;
  660.     /// Operator to test if time is earlier.
  661.     bool operator <  (const CTime& t) const;
  662.     /// Operator to test if time is later or equal.
  663.     bool operator >= (const CTime& t) const;
  664.     /// Operator to test if time is earlier or equal.
  665.     bool operator <= (const CTime& t) const;
  666.     // Time difference
  667.     /// Difference in days from specified time.
  668.     double DiffDay(const CTime& t) const;
  669.     /// Difference in hours from specified time.
  670.     double DiffHour(const CTime& t) const;
  671.     /// Difference in minutes from specified time.
  672.     double DiffMinute(const CTime& t) const;
  673.     /// Difference in seconds from specified time.
  674.     int DiffSecond(const CTime& t) const;
  675.     /// Difference in nanoseconds from specified time.
  676.     double DiffNanoSecond(const CTime& t) const;
  677.     // Checks
  678.     /// Is time empty?
  679.     bool IsEmpty     (void) const;
  680.     /// Is time in a leap year?
  681.     bool IsLeap      (void) const;
  682.     /// Is time valid?
  683.     bool IsValid     (void) const;
  684.     /// Is time local time?
  685.     bool IsLocalTime (void) const;
  686.     /// Is time GMT time?
  687.     bool IsGmtTime   (void) const;
  688.     // Timezone functions
  689.     /// Get time zone format.
  690.     ETimeZone GetTimeZoneFormat(void) const;
  691.     /// Set time zone format.
  692.     ETimeZone SetTimeZoneFormat(ETimeZone val);
  693.     /// Get time zone precision.
  694.     ETimeZonePrecision GetTimeZonePrecision(void) const;
  695.     /// Set time zone precision.
  696.     ETimeZonePrecision SetTimeZonePrecision(ETimeZonePrecision val);
  697.     /// Get difference between local timezone and GMT in seconds.
  698.     int TimeZoneDiff(void) const;
  699.     /// Get current time as local time.
  700.     CTime GetLocalTime(void) const;
  701.     /// Get current time as GMT time.
  702.     CTime GetGmtTime(void) const;
  703.     /// Convert current time into specified time zone time.
  704.     CTime& ToTime(ETimeZone val);
  705.     /// Convert current time into local time.
  706.     CTime& ToLocalTime(void);
  707.     /// Convert current time into GMT time.
  708.     CTime& ToGmtTime(void);
  709. private:
  710.   
  711.     /// Helper method to check if time format "fmt" is valid.
  712.     static void x_VerifyFormat(const string& fmt);
  713.     /// Helper method to set time value from string "str" using format "fmt".
  714.     void x_Init(const string& str, const string& fmt);
  715.     /// Helper method to set time from 'time_t' -- If "t" not specified,
  716.     /// then set to current time.
  717.     CTime& x_SetTime(const time_t* t = 0);
  718.     /// Helper method to adjust day number to correct value after day
  719.     /// manipulations.
  720.     void x_AdjustDay(void);
  721.     /// Helper method to adjust the time to correct timezone (across the
  722.     /// barrier of winter & summer times) using "from" as a reference point.
  723.     ///
  724.     /// This does the adjustment only if the time object:
  725.     /// - contains local time (not GMT), and
  726.     /// - has TimeZonePrecision != CTime::eNone, and
  727.     /// - differs from "from" in the TimeZonePrecision (or larger) part.
  728.     CTime& x_AdjustTime(const CTime& from, bool shift_time = true);
  729.     /// Helper method to forcibly adjust timezone using "from" as a
  730.     /// reference point.
  731.     CTime& x_AdjustTimeImmediately(const CTime& from, bool shift_time = true);
  732.     /// Helper method to check if there is a need adjust time in timezone.
  733.     bool x_NeedAdjustTime(void) const;
  734.     /// Helper method to add hour with/without shift time.
  735.     /// Parameter "shift_time" access or denied use time shift in 
  736.     /// process adjust hours.
  737.     CTime& x_AddHour(int hours = 1, EDaylight daylight = eDaylightDefault, 
  738.                      bool shift_time = true);
  739.     // Time
  740.     int           m_Year;       ///< Private data member year
  741.     unsigned char m_Month;      ///< Private data member month
  742.     unsigned char m_Day;        ///< Private data member day
  743.     unsigned char m_Hour;       ///< Private data member hour
  744.     unsigned char m_Minute;     ///< Private data member minute
  745.     unsigned char m_Second;     ///< Private data member second
  746.     unsigned long m_NanoSecond; ///< Private data member nanosecond
  747.     // Timezone and precision
  748.     ETimeZone          m_Tz;    ///< Private data member timezone
  749.     ETimeZonePrecision m_TzPrecision;///< Private data member time zone prec.
  750.     /// Difference between GMT and local time in seconds,
  751.     /// as stored during the last call to x_AdjustTime***().
  752.     int m_AdjustTimeDiff;
  753.     // Friend operators
  754.     NCBI_XNCBI_EXPORT
  755.     friend CTime operator + (int days, const CTime& t);
  756.     NCBI_XNCBI_EXPORT
  757.     friend CTime operator + (const CTime& t, int days);
  758.     NCBI_XNCBI_EXPORT
  759.     friend CTime operator - (const CTime& t, int days);
  760. };
  761. /////////////////////////////////////////////////////////////////////////////
  762. ///
  763. /// CStopWatch --
  764. ///
  765. /// Define a stop watch class to measure elasped time.
  766. class NCBI_XNCBI_EXPORT CStopWatch
  767. {
  768. public:
  769.     /// Constructor.
  770.     /// NB. Ctor doesn't start timer, it merely creates it.
  771.     CStopWatch(void);
  772.     /// Start the timer.
  773.     void Start(void);
  774.     /// Return time elapsed time since last Start() call.
  775.     /// Result is underfined if Start() wasn't previously called.
  776.     double Elapsed(void) const;
  777. protected:
  778.     /// Get current time mark.
  779.     static double GetTimeMark();
  780. private:
  781.     double m_Start;  ///< Start time value.
  782. };
  783. /* @} */
  784. //=============================================================================
  785. //
  786. //  Extern
  787. //
  788. //=============================================================================
  789. // Add (subtract if negative) to the time (see CTime::AddXXX)
  790. NCBI_XNCBI_EXPORT
  791. extern CTime AddYear       (const CTime& t, int  years       = 1);
  792. NCBI_XNCBI_EXPORT
  793. extern CTime AddMonth      (const CTime& t, int  months      = 1);
  794. NCBI_XNCBI_EXPORT
  795. extern CTime AddDay        (const CTime& t, int  days        = 1);
  796. NCBI_XNCBI_EXPORT
  797. extern CTime AddHour       (const CTime& t, int  hours       = 1);
  798. NCBI_XNCBI_EXPORT
  799. extern CTime AddMinute     (const CTime& t, int  minutes     = 1);
  800. NCBI_XNCBI_EXPORT
  801. extern CTime AddSecond     (const CTime& t, int  seconds     = 1);
  802. NCBI_XNCBI_EXPORT
  803. extern CTime AddNanoSecond (const CTime& t, long nanoseconds = 1);
  804. // Add/subtract days (see CTime::operator +/-)
  805. NCBI_XNCBI_EXPORT
  806. extern CTime operator + (int days, const CTime& t);
  807. NCBI_XNCBI_EXPORT
  808. extern CTime operator + (const CTime& t, int days);
  809. NCBI_XNCBI_EXPORT
  810. extern CTime operator - (const CTime& t, int days);
  811. // Difference in days (see CTime::operator)
  812. NCBI_XNCBI_EXPORT
  813. extern int   operator - (const CTime& t1, const CTime& t2);
  814. // Get current time (in local or GMT format)
  815. NCBI_XNCBI_EXPORT
  816. extern CTime CurrentTime(
  817.     CTime::ETimeZone          tz  = CTime::eLocal, 
  818.     CTime::ETimeZonePrecision tzp = CTime::eTZPrecisionDefault
  819.     );
  820. // Truncate the time to days (see CTime::Truncate)
  821. NCBI_XNCBI_EXPORT 
  822. extern CTime Truncate(const CTime& t);
  823. //=============================================================================
  824. //
  825. //  Inline
  826. //
  827. //=============================================================================
  828. // CTime
  829. inline 
  830. int CTime::Year(void) const { return m_Year; }
  831. inline 
  832. int CTime::Month(void) const { return m_Month; }
  833. inline 
  834. int CTime::Day(void) const { return m_Day; }
  835. inline 
  836. int CTime::Hour(void) const { return m_Hour; }
  837. inline 
  838. int CTime::Minute(void) const { return m_Minute; }
  839. inline 
  840. int CTime::Second(void) const { return m_Second; }
  841. inline 
  842. long CTime::NanoSecond(void) const { return (long) m_NanoSecond; }
  843. inline 
  844. CTime& CTime::AddYear(int years, EDaylight adl)
  845. {
  846.     return AddMonth(years * 12, adl);
  847. }
  848. inline
  849. CTime& CTime::SetTimeT(const time_t& t) { return x_SetTime(&t); }
  850. inline
  851. CTime& CTime::SetCurrent(void) { return x_SetTime(); }
  852. inline 
  853. CTime& CTime::operator += (const int days) { return AddDay(days); }
  854. inline 
  855. CTime& CTime::operator -= (const int days) { return AddDay(-days); }
  856. inline 
  857. CTime& CTime::operator ++ (void) { return AddDay( 1); }
  858. inline 
  859. CTime& CTime::operator -- (void) { return AddDay(-1); }
  860. inline 
  861. CTime::operator string(void) const { return AsString(); }
  862. inline 
  863. CTime CTime::operator ++ (int)
  864. {
  865.     CTime t = *this;
  866.     AddDay(1);
  867.     return t;
  868. }
  869. inline 
  870. CTime CTime::operator -- (int)
  871. {
  872.     CTime t = *this;
  873.     AddDay(-1);
  874.     return t;
  875. }
  876. inline 
  877. CTime& CTime::operator = (const string& str)
  878. {
  879.     x_Init(str, GetFormat());
  880.     return *this;
  881. }
  882. inline 
  883. CTime& CTime::operator = (const CTime& t)
  884. {
  885.     if ( &t == this )
  886.         return *this;
  887.     m_Year           = t.m_Year;
  888.     m_Month          = t.m_Month;
  889.     m_Day            = t.m_Day;
  890.     m_Hour           = t.m_Hour;
  891.     m_Minute         = t.m_Minute;
  892.     m_Second         = t.m_Second;
  893.     m_NanoSecond     = t.m_NanoSecond;
  894.     m_Tz             = t.m_Tz;
  895.     m_TzPrecision    = t.m_TzPrecision;
  896.     m_AdjustTimeDiff = t.m_AdjustTimeDiff;
  897.     return *this;
  898. }
  899. inline 
  900. bool CTime::operator != (const CTime& t) const
  901. {
  902.     return !(*this == t);
  903. }
  904. inline 
  905. bool CTime::operator >= (const CTime& t) const
  906. {
  907.     return !(*this < t);
  908. }
  909. inline
  910. bool CTime::operator <= (const CTime& t) const
  911. {
  912.     return !(*this > t);
  913. }
  914. inline
  915. CTime& CTime::AddHour(int hours, EDaylight use_daylight)
  916. {
  917.     return x_AddHour(hours, use_daylight, true);
  918. }
  919. inline 
  920. bool CTime::IsEmpty() const
  921. {
  922.     return
  923.         !Day()   &&  !Month()   &&  !Year()  &&
  924.         !Hour()  &&  !Minute()  &&  !Second()  &&  !NanoSecond();
  925. }
  926. inline 
  927. double CTime::DiffDay(const CTime& t) const
  928. {
  929.     return DiffSecond(t) / 60.0 / 60.0 / 24.0;
  930. }
  931. inline 
  932. double CTime::DiffHour(const CTime& t) const
  933. {
  934.     return DiffSecond(t) / 60.0 / 60.0;
  935. }
  936. inline 
  937. double CTime::DiffMinute(const CTime& t) const
  938. {
  939.     return DiffSecond(t) / 60.0;
  940. }
  941. inline 
  942. double CTime::DiffNanoSecond(const CTime& t) const
  943. {
  944.     long dNanoSec = NanoSecond() - t.NanoSecond();
  945.     return (double) DiffSecond(t) * kNanoSecondsPerSecond + dNanoSec;
  946. }
  947. inline 
  948. bool CTime::IsLocalTime(void) const { return m_Tz == eLocal; } 
  949. inline 
  950. bool CTime::IsGmtTime(void) const { return m_Tz == eGmt; }
  951. inline 
  952. CTime::ETimeZone CTime::GetTimeZoneFormat(void) const
  953. {
  954.     return m_Tz;
  955. }
  956. inline 
  957. CTime::ETimeZonePrecision CTime::GetTimeZonePrecision(void) const
  958. {
  959.     return m_TzPrecision;
  960. }
  961. inline 
  962. CTime::ETimeZone CTime::SetTimeZoneFormat(ETimeZone val)
  963. {
  964.     ETimeZone tmp = m_Tz;
  965.     m_Tz = val;
  966.     return tmp;
  967. }
  968. inline 
  969. CTime::ETimeZonePrecision CTime::SetTimeZonePrecision(ETimeZonePrecision val)
  970. {
  971.     ETimeZonePrecision tmp = m_TzPrecision;
  972.     m_TzPrecision = val;
  973.     return tmp;
  974. }
  975. inline 
  976. int CTime::TimeZoneDiff(void) const
  977. {
  978.     return GetLocalTime().DiffSecond(GetGmtTime());
  979. }
  980. inline 
  981. CTime CTime::GetLocalTime(void) const
  982. {
  983.     if ( IsLocalTime() )
  984.         return *this;
  985.     CTime t(*this);
  986.     return t.ToLocalTime();
  987. }
  988. inline 
  989. CTime CTime::GetGmtTime(void) const
  990. {
  991.     if ( IsGmtTime() )
  992.         return *this;
  993.     CTime t(*this);
  994.     return t.ToGmtTime();
  995. }
  996. inline
  997. CTime& CTime::ToLocalTime(void)
  998. {
  999.     ToTime(eLocal);
  1000.     return *this;
  1001. }
  1002. inline
  1003. CTime& CTime::ToGmtTime(void)
  1004. {
  1005.     ToTime(eGmt);
  1006.     return *this;
  1007. }
  1008. inline 
  1009. bool CTime::x_NeedAdjustTime(void) const
  1010. {
  1011.     return GetTimeZoneFormat() == eLocal  &&  GetTimeZonePrecision() != eNone;
  1012. }
  1013. // CStopWatch
  1014. inline
  1015. CStopWatch::CStopWatch(void)
  1016.     : m_Start(0)
  1017. {
  1018. }
  1019. inline
  1020. void CStopWatch::Start()
  1021. {
  1022.     m_Start = GetTimeMark();
  1023. }
  1024. inline
  1025. double CStopWatch::Elapsed() const
  1026. {
  1027.     return GetTimeMark() - m_Start;
  1028. }
  1029. END_NCBI_SCOPE
  1030. /*
  1031.  * ===========================================================================
  1032.  * $Log: ncbitime.hpp,v $
  1033.  * Revision 1000.5  2004/04/21 14:34:55  gouriano
  1034.  * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.33
  1035.  *
  1036.  * Revision 1.33  2004/04/07 19:07:29  lavr
  1037.  * Document CStopWatch in a little more details
  1038.  *
  1039.  * Revision 1.32  2004/03/24 15:52:50  ivanov
  1040.  * Added new format symbol support 'z' (local time in format GMT{+|-}HHMM).
  1041.  * Added second parameter to AsString() method that specify an output
  1042.  * timezone.
  1043.  *
  1044.  * Revision 1.31  2004/03/10 19:56:38  gorelenk
  1045.  * Added NCBI_XNCBI_EXPORT prefix for functions AddYear, AddMonth, AddDay,
  1046.  * AddHour, AddMinute, AddSecond, AddNanoSecond and operators:
  1047.  * CTime operator + and CTime operator - .
  1048.  *
  1049.  * Revision 1.30  2004/01/26 18:07:22  siyan
  1050.  * Fixed errors in documentation on GetTimeT()
  1051.  *
  1052.  * Revision 1.29  2003/11/25 20:03:32  ivanov
  1053.  * Fixed misspelled eTZPrecisionDefault
  1054.  *
  1055.  * Revision 1.28  2003/11/25 19:53:33  ivanov
  1056.  * Renamed eDefault to eTZPrecisionDefault.
  1057.  * Added setters for various components of time -- Set*().
  1058.  * Added YearWeekNumber(), MonthWeekNumber().
  1059.  * Reimplemented AddYear() as AddMonth(years*12).
  1060.  *
  1061.  * Revision 1.27  2003/11/21 20:04:41  ivanov
  1062.  * + DaysInMonth()
  1063.  *
  1064.  * Revision 1.26  2003/11/18 11:58:24  siyan
  1065.  * Changed so @addtogroup does not cross namespace boundary
  1066.  *
  1067.  * Revision 1.25  2003/10/03 18:26:48  ivanov
  1068.  * Added month and day of week names conversion functions
  1069.  *
  1070.  * Revision 1.24  2003/09/11 13:26:13  siyan
  1071.  * Documentation changes
  1072.  *
  1073.  * Revision 1.23  2003/07/15 19:34:28  vakatov
  1074.  * Comment typo fix
  1075.  *
  1076.  * Revision 1.22  2003/04/16 20:28:26  ivanov
  1077.  * Added class CStopWatch
  1078.  *
  1079.  * Revision 1.21  2003/04/14 19:41:32  ivanov
  1080.  * Rollback to R1.19 -- accidental commit
  1081.  *
  1082.  * Revision 1.19  2003/04/01 19:18:43  siyan
  1083.  * Added doxygen support
  1084.  *
  1085.  * Revision 1.18  2003/02/10 22:36:55  ucko
  1086.  * Make string- and time_t-based constructors explicit, to avoid weird surprises.
  1087.  *
  1088.  * Revision 1.17  2002/12/18 22:53:21  dicuccio
  1089.  * Added export specifier for building DLLs in windows.  Added global list of
  1090.  * all such specifiers in mswin_exports.hpp, included through ncbistl.hpp
  1091.  *
  1092.  * Revision 1.16  2002/10/17 16:55:01  ivanov
  1093.  * Added new time format symbols - 'b' and 'B' (month abbreviated and full name)
  1094.  *
  1095.  * Revision 1.15  2002/07/23 19:53:34  lebedev
  1096.  * NCBI_OS_MAC: Note about Daylight flag handling added
  1097.  *
  1098.  * Revision 1.14  2002/07/15 18:17:52  gouriano
  1099.  * renamed CNcbiException and its descendents
  1100.  *
  1101.  * Revision 1.13  2002/07/11 14:17:56  gouriano
  1102.  * exceptions replaced by CNcbiException-type ones
  1103.  *
  1104.  * Revision 1.12  2002/05/13 13:56:30  ivanov
  1105.  * Added MT-Safe support
  1106.  *
  1107.  * Revision 1.11  2002/04/11 20:39:20  ivanov
  1108.  * CVS log moved to end of the file
  1109.  *
  1110.  * Revision 1.10  2001/07/06 15:11:30  ivanov
  1111.  * Added support DataBase-time's -- GetTimeDBI(), GetTimeDBU()
  1112.  *                                  SetTimeDBI(), SetTimeDBU()
  1113.  *
  1114.  * Revision 1.9  2001/07/04 19:41:07  vakatov
  1115.  * Get rid of an extra semicolon
  1116.  *
  1117.  * Revision 1.8  2001/06/12 16:56:36  vakatov
  1118.  * Added comments for the time constituents access methods
  1119.  *
  1120.  * Revision 1.7  2001/05/29 20:12:58  ivanov
  1121.  * Changed type of return value in NanoSecond().
  1122.  *
  1123.  * Revision 1.6  2001/05/29 16:14:34  ivanov
  1124.  * Return to nanosecond-revision. Corrected mistake of the work with local
  1125.  * time on Linux. Polish and improvement source code.
  1126.  * Renamed AsTimeT() -> GetTimerT().
  1127.  *
  1128.  * Revision 1.5  2001/04/30 22:01:29  lavr
  1129.  * Rollback to pre-nanosecond-revision due to necessity to use
  1130.  * configure to figure out names of global variables governing time zones
  1131.  *
  1132.  * Revision 1.4  2001/04/29 03:06:10  lavr
  1133.  * #include <time.h>" moved from .cpp to ncbitime.hpp
  1134.  *
  1135.  * Revision 1.3  2001/04/27 20:42:29  ivanov
  1136.  * Support for Local and UTC time added.
  1137.  * Support for work with nanoseconds added.
  1138.  *
  1139.  * Revision 1.2  2000/11/21 18:15:29  butanaev
  1140.  * Fixed bug in operator ++/-- (int)
  1141.  *
  1142.  * Revision 1.1  2000/11/20 22:17:42  vakatov
  1143.  * Added NCBI date/time class CTime ("ncbitime.[ch]pp") and
  1144.  * its test suite ("test/test_ncbitime.cpp")
  1145.  *
  1146.  * ===========================================================================
  1147.  */
  1148. #endif /* CORELIB__NCBITIME__HPP */