focal (3) datetime.3bobcat.gz

Provided by: libbobcat-dev_5.02.00-1build1_amd64 bug

NAME

       FBB::DateTime - Performs Date and Time Computations

SYNOPSIS

       #include <bobcat/datetime>
       Linking option: -lbobcat

DESCRIPTION

       FBB::DateTime  objects contain and represent date and time values. Individual date and time fields can be
       requested or modified, returning `sanitized’ times (e.g., a date like March 33 or a time  like  56  hours
       are  never  returned;  instead  the  next month or day is returned). Times may be specified in local time
       (according to the computer’s idea of what the local time is), in Universal Time  Coordinated  (UTC)  time
       values,  as  a  time  in  a named timezone, or as a time in a user-defined timezone. Refer to the section
       TIMEZONES below for a detailed description of how timezones can be specified.

       Dates/times represented  by  DateTime  objects  may  be  modified  by  adding,  subtracting,  or  setting
       (std::chrono) seconds, minutes, or hours, or by specifying (a selection of) fields of tm structs.

       Date/time  modificationsthese  are  always  performed  relative to the DateTime object’s current timezone
       (which may be UTC,  local  or  another  timezone).  Conversions  between  timezones  (including  the  UTC
       `timezone’) are also supported.

       DateTime  objects can be constructed in many ways. Dates and times may be specified as UTC time, as local
       time, as (std::chrono::minutes) shifts with respect to UTC time, or as a date and  time  in  other  (user
       defined)  time  zones.  Negative  time offsets refer to timezones West of Greenwich, and positive offsets
       refer to timezones East of Greenwich: these offsets represent the zones’ local time differences with  UTC
       time. Timezone offsets are always computed modulo 12 hours, as timezones may at most differ 12 hours from
       UTC.

       DateTime objects always contain date and time points in  seconds  since  the  beginning  of  the  `epoch’
       (midnight  Jan  1,  1970  UTC).  The  C function time(2) returns this value for the current date and time
       (assuming that the computer’s clock has properly been synchronized).

       Daylight Saving Time (DST), when defined for DateTime objects’ zones is automatically applied when DST is
       active.  E.g., when a DateTime object’s time represents 12:00 hr., and it zone’s DST (using a standard +1
       hour shift) becomes active tomorrow, then the object’s time shows 13:00 hr. when 1 day is  added  to  its
       current date/time.

       Handling  time  is complex. The C function time(2) returns the time in seconds since the beginning of the
       epoch. Beyond that, simplicity ends, and the reader is referred to Eric S. Raymond’s (2007)  coverage  of
       the  complexities  of  handling time: see http://www.catb.org/esr/time-programming (this document is also
       included in bobcat’s repository).

TIMEZONES

       DateTime’s nested class Zone is used  to  specify  time  zones.  Time  zones  have  various  configurable
       components:

       o      The  time  shift itself. E.g., Central European Time (CET) uses a shift of one hour: when UTC time
              is noon, then it’s 13:00 h. CET. The time shift doesn’t have to be multiples of full hours.  E.g.,
              India uses a time shift of +5:30 h relative to UTC.

       o      Maybe a Daylight Saving Time. Most timezones use a +1 hour DST shift: when in the previous example
              DST is active then CET’s local time is 14:00 h. Some  countries  do  not  use  DST  shifts.  E.g.,
              Afghanistan doesn’t use a DST shift.

       o      A date-interval in which the DST is used may be standard. E.g., it starts at 02:00 h. (local time,
              becoming 03:00 DST), the last Sunday in March, and ends at 02:00 h.  (local  time,  resetting  DST
              03:00 to 02:00) the last Sunday in October.

       o      Other  calendar intervals may apply. E.g., in 2019 New Zealand’s DST starts September 29, and ends
              April 7th.

       o      In practice, DST shifts are equal to 1 hour, although there’s no formal requirement for that.

       DataTime::Zone’s class offers a variety of means for specifying time zones with or  without  support  for
       DST.  Time shifts can be positive or negative and are specified in hours and optionally minutes. E.g., -8
       or -8:00 for a timezone 8 hours earlier than UTC (noon at UTC becomes 04:00 in this  timezone)  or  +5:30
       for a time zone later than UTC (noon at UTC becomes 17:30 in that timezone). Timezones can be given names
       (which may or may not be the names of the `standard’ time  zones  like  CET  or  PST)  but  can  also  be
       constructed by providing

       o      a mere shift relative to UTC, no DST.

       o      a  shift  relative  to  UTC, using a standard DST (1 hour) time shift. In this case the computer’s
              idea of the calendar interval in which DST is active is used;

       o      a shift relative to UTC, using a specified  DST  time  shift  as  well  as  a  specified  calendar
              interval, optionally specifying the time when the DST calendar interval starts and/or ends.

NAMESPACE

       FBB
       All  constructors,  members,  operators  and manipulators, mentioned in this man-page, are defined in the
       namespace FBB.

INHERITS FROM

       -

ENUMS

       The class DateTime defines the following enums:

       DateTime::Month
       This enumeration has the following values which are ordered using the default C++ enum values:

       o      JANUARY,

       o      FEBRUARY,

       o      MARCH,

       o      APRIL,

       o      MAY,

       o      JUNE,

       o      JULY,

       o      AUGUST,

       o      SEPTEMBER,

       o      OCTOBER,

       o      NOVEMBER,

       o      DECEMBER.

       Standard 3-letter abbreviations can also be used (e.g., DateTime::Jul):

       o      Jan,

       o      Feb,

       o      Mar,

       o      Apr,

       o      May ,

       o      Jun,

       o      Jul,

       o      Aug,

       o      Sep,

       o      Oct,

       o      Nov,

       o      Dec.

       DateTime::Relative
       This enumeration is used with the setMonth() member (see below).  It has the following values:

       o      THIS_WEEK,

       o      THIS_YEAR,

       o      LAST,

       o      NEXT

       DateTime::TimeFields
       This enumeration has the following values which can be bit_or-ed when calling the member setFields():

       o      SECONDS

       o      MINUTES

       o      HOURS

       o      MONTHDAY

       o      MONTH

       o      YEAR

       DateTime::TimeType
       This enumeration has the following values:

       o      LOCALTIME: the DateTime object’s date and time use a  shift  relative  to  UTC  according  to  the
              object’s configured time zone.

       o      UTC: the object’s date and time represent the Universal Time Coordinated.

       DateTime::Weekday
       This enumeration has the following values which are ordered using the default C++ enum values:

       o      SUNDAY,

       o      MONDAY,

       o      TUESDAY,

       o      WEDNESDAY,

       o      THURSDAY,

       o      FRIDAY,

       o      SATURDAY.

       Standard 3-letter abbreviations can also be used (e.g., DateTime::Wed):

       o      Sun,

       o      Mon,

       o      Tue,

       o      Wed,

       o      Thu,

       o      Fri,

       o      Sat.

TEXTUAL TIME REPRESENTATIONS

       DateTime  objects  may  also  be  defined  using textual time-representations. In addition, the date/time
       represented by DateTime objects  may  be  altered  using  textual  time  representations  extracted  from
       istreams.

       The following time formats (shown by example) are recognized:

       o      Mon Dec 3 13:29:11 2018, as displayed by put_time(..., "%c");

       o      Mon  Dec  3  13:29:11  CET 2018, as displayed by the date(1) program. When this format is used the
              specified zone name must have been defined. CET is defined by default, other time zones can easily
              be defined using, e.g., the member DateTime::Zone::read (see section ZONE MEMBERS).

       o      Mon,  03  Dec  2018 13:29:11 +0100, as displayed by the date -R command (and the rfc2822() member,
              see below);

       o      2018-12-03 13:29:11+01:00, as displayed by the date --rfc-3339=seconds command.

ZONE CONSTRUCTORS

       The class DateTime::Zone defines how time zones can be defined and used. Time zone objects  are  expected
       by  several  DateTime constructors and by the DateTime::setZone member. The class DateTime::Zone supports
       the following constructors:

       o      Zone(std::string const &name):
              The argument name refers to a predefined zone name. By default the zone CET  is  available.  Other
              zone names can be defined using the members DateTime::Zone::read and DateTime::Zone::store;

       o      Zone(std::string const &specification):
              The  argument  specification  refers  to a zone specification that’s available under the directory
              referred to by /etc/localtime (e.g., /usr/share/zoneinfo). The specification  must  start  with  a
              colon,  followed  by the name of an entry that is found below /usr/share/zoneinfo. E.g, to specify
              the Europe/Amsterdam zone use DateTime::Zone{ ":Europe/Amsterdam" }. If the  specified  zone  uses
              DST then a +1 hour DST shift is used;

       o      Zone(std::string const &shift):
              The  argument  shift defines the zone’s shift in hours and minutes relative to UTC. Shift’s format
              is [+-]hh[:mm], where negative time shifts refer to time zones West of Greenwich and positive time
              shifts to time zones East of Greenwich. No DST is used;

       o      Zone(std::string const &shift, string const &dstSpec):
              The  argument  shift defines the zone’s shift in hours and minutes relative to UTC. Shift’s format
              is [+-]hh[:mm], where negative time shifts refer to time zones West of Greenwich and positive time
              shifts  to  time  zones East of Greenwich. The dstSpec argument defines the time shift to use when
              DST is active. It uses the same format as shift,  or  =  may  be  specified,  in  which  case  the
              (standard) DST shift of +1:00 hour is used;

       o      Zone(std::string   const   &shift,   std::string  const  &dstSpec,  std::string  const  &beginDST,
              std::string const &endDST):
              Like the previous constructor, but in  addition  beginDST  and  endDST  are  used  to  define  the
              date/time interval in which the DST is active. These arguments use the following format:

                  Mon, weekSpec Day [hh[:mm]]

              For  Mon  a  standard  3-letter  month  specification  is  used, like "Jan" for January, for Day a
              standard 3-letter day specification is used, like "Sun" for  Sunday  (cf.  the  standard  3-letter
              abbreviations listed in the section ENUMS).

              The  weekSpec  defines the number of the week of the month containing Day. Use 1st, 2nd, 3rd, 4th,
              5th or last. Here, 1st refers to the first week having day Day, while last and 5th  refer  to  the
              last week (so not necessarily the 5th week) having day Day.

              The time specification defines the time when the DST starts or ends.  Some examples:

                  Mar, last Sunday 02:00
                  Oct, 1st Monday 03:00

       Copy and move constructors as well as assignment operators are available.

ZONE MEMBERS

       o      std::string const &spec() const:
              The constructors’ zone specifications are converted to a form recognized by the function tzset(3).
              This member returns the converted string;

       o      int dstSeconds() const:
              If DST is active for a local date/time point then the DST shift in seconds  is  returned  by  this
              member. Use the member DateTime::dst() to determine whether or not DST is active.

       o      int zoneSeconds() const:
              The  zone’s  time  shift relative to UTC in seconds. Negative values represent zone shifts West of
              Greenwich, positive values represent zone shifts East of Greenwich.

ZONE STATIC MEMBERS

       o      DateTime::Zone const &DateTime::Zone::get(std::string const &name):
              The time zone object named name is returned. E.g., to retrieve the time zone object  for  CET  use
              DateTime::Zone::get("CET").  If the named zone has not been defined an std::exception is thrown;

       o      DateTime::Zone const &DateTime::Zone::store(std::string const &name, ...):
              A  time  zone  object  is  defined  and stored as zone name. Zone names must consists of (at least
              three) letters. The ellipsis should be replaced by the arguments of the Zone constructors  (except
              for  the  arguments  of the first, copy, and move constructors).  A reference to the newly defined
              Zone object is returned;

       o      std::string const &DateTime::Zone::defaultTZ():
              The TZ specification that is active when the program using DateTime objects starts. It returns the
              return value of getenv("TZ") or an empty string if the TZ environment variable was not defined;

       o      void DateTime::Zone::read(std::string const &fname):
              Time  zone specifications as expected by the above store member are read from the file named fname
              (one specification per line, using blanks between the elements, and inserting  until  between  the
              dstBegin and dstEnd specifications (if provided)). For cosmetic reasons a colon may be appended to
              zone names. Examples:

                  ccu:   +5:50
                  nyc:   -5:00 +1:00
                  cal:   -8:00 =
                  eet:   +2:00 +1:00 Mar, last Sun 02:00 until Oct, last Sun 02:00
                  same:  +2:00 =     Mar, last Sun 02:00 until Oct, last Sun 02:00

              If the first character on a line is a hash-tag (#) or  if  a  line  only  contains  blanks  it  is
              ignored;

       o      time_t DateTime::Zone::thisZoneShift():
              Returns this computer’s zone shift in seconds.

DATETIME CONSTRUCTORS

       o      DateTime(TimeType type = UTC):
              The  object’s  date/time  is  initialized  to  the  current date and time. By default UTC time (no
              zone-shift or dst correction) is used. When specifying LOCALTIME, the computer’s timezone and  DST
              correction are used;

       o      DateTime(std::chrono::minutes zoneMinutes):
              The  object’s  local  time  is  initialized  to  the  current  UTC  time  to which a zone shift of
              zoneMinutes minutes is added. DST is not used. Note that by specifying  a  zone  shift  in,  e.g.,
              std::chrono::hours a conversion to minutes is automatically applied;

       o      DateTime(Datetime::Zone const &zone):
              The  object’s  local time is initialized to the the current UTC time to which a zone shift defined
              by the Zone argument is added;

       o      DateTime(time_t time, TimeType type = UTC):
              The object uses time to set its UTC time in seconds since the epoch. When LOCALTIME  is  specified
              its local time is obtained by applying the computer’s timezone and DST correction;

       o      DateTime(time_t time, std::chrono::minutes zoneMinutes):
              The  object’s  uses  time  to  set its UTC time in seconds since the epoch. Its local time is then
              obtained by adding a zone shift of zoneMinutes minutes. DST is not used.;

       o      DateTime(time_t time, Datetime::Zone const &zone):
              The object’s uses time to set its UTC time in seconds since the epoch.  Its  local  time  is  then
              obtained by adding a zone shift as defined by the Zone argument.

       o      DateTime(tm const &ts, TimeType type = UTC):
              The tm argument is a struct defined as:

                  struct tm
                  {
                      int tm_sec;     // seconds          0..59, or 60: leap second
                      int tm_min;     // minutes          0..59
                      int tm_hour;    // hours            0..23
                      int tm_mday;    // day of the month 1..31
                      int tm_mon;     // month            0..11
                      int tm_year;    // year                     see below!!
                      int tm_wday;    // day of the week  0..6
                      int tm_yday;    // day in the year  0..365
                      int tm_isdst;   // daylight saving time
                                      // > 0: yes, 0: no, < 0: unknown
                  };

              Values  outside of these ranges may be specified to compute points in time in the future or in the
              past. E.g., tm_hour == 30 is normalized to tm_hour == 6 of the next day.

              Note that functions like mktime(3) expect tm_year to be specified relative to 1900.  The  DateTime
              constructor  does  not  expect  this:  the tm_year field should be the specified as the (calendar)
              year, e.g., 2019.

              Using tm’s fields the object’s date/time is initialized to either UTC or LOCALTIME. The  DST,  day
              of the year, and day of the week fields of the tm argument are ignored;

       o      DateTime(tm const &ts, Datetime::Zone const &zone):
              The  fields  of  ts  (see the previous constructor) define a LOCALTIME time point in the specified
              Zone.

       o      DateTime(std::string const &timeStr, TimeType type = UTC):
              The object’s date/time is initialized to  either  UTC  or  LOCALTIME  using  DateTime’s  supported
              textual  time representations.  The time representation without explicit timezone shift (e.g., Mon
              Dec 3 13:29:11 2018 is interpreted as UTC time when type == UTC is specified, otherwise  as  local
              time  (type  ==  LOCALTIME), using the computer’s time zone and DST correction). The other textual
              time representations provide zone specifications which are  used  to  obtain  the  requested  time
              representation  (e.g., when UTC is requested, and the textual time specification contains 13:29:11
              +0100 then the object’s (UTC) time is set to 12:29:11). DST  specifications  are  ignored,  except
              when named time zones are used, as in on Dec 3 13:29:11 CET 2018;

       o      DateTime(std::istream &in, TimeType type = UTC):
              The  object’s  date/time  is initialized to either UTC or LOCALTIME extracting a supported textual
              time representation from  in  as  destribed  at  the  DateTime(std::string  const  &timeStr,  ...)
              constructor. The std::istream &in stream may also be a rvalue reference.

       Copy and move constructors are available.

OVERLOADED OPERATORS

       All class-less overloaded operators are defined in the FBB namespace.  All overloaded operators modifying
       DateTime objects support `commit or roll-back’: if the operation cannot  be  performed  an  exception  is
       thrown, without modifying the destination object.

       o      std::ostream &std::operator<<(std::ostream &str, DateTime const &dt):
              Inserts  dt’s  date/time into str using the zone-less supported textual time representation (e.g.,
              Mon Dec 3 13:29:11 2018);

       o      std::istream &std::operator>>(std::istream &str, DateTime &dt):
              Extracts a supported  textual time representation from str and assigns the implied date/time point
              to dt;

       o      bool operator==(DateTime const &left, DateTime const &right):
              Returns true if left represents the same UTC time as right;

       o      bool operator!=(DateTime const &left, DateTime const &right):
              Returns true if left represents a different UTC time as right;

       o      bool operator<(DateTime const &left, DateTime const &right):
              Returns true if left represents an earlier UTC time as right;

       o      bool operator<=(DateTime const &left, DateTime const &right):
              Returns true if left represents an earlier or equal UTC time as right;

       o      bool operator>(DateTime const &left, DateTime const &right):
              Returns true if left represents a later UTC time as right;

       o      bool operator>=(DateTime const &left, DateTime const &right):
              Returns true if left represents a later or equal UTC time as right.

       o      DateTime operator+(DateTime const &obj, std::chrono::seconds seconds):
              Returns a copy of obj to which seconds were added;

       o      DateTime operator+(DateTime const &obj, tm const &ts):
              Returns  a copy of obj to which the tm_sec, tm_min, tm_hour, tm_mday, tm_mon and tm_year fields of
              ts were added;

              Caveat: note that this is an addition operation: if you want to add 1 year specify ts.tm_year = 1,
              and not the finally expected calendar year!

       o      DateTime &operator+=(std::chrono::seconds seconds):
              Adds seconds to the time represented by the current object;

       o      DateTime &operator+=(tm const &ts):
              Adds the tm_sec, tm_min, tm_hour, tm_mday, tm_mon and tm_year fields of ts to the time represented
              by the current object.

              Caveat: note that this is an addition operation: if you want to add 1 year specify ts.tm_year = 1,
              and not the finally expected calendar year!

       o      DateTime operator-(DateTime const &obj, std::chrono::seconds seconds):
              Returns a copy of obj to which seconds were subtracted;

       o      DateTime operator-(DateTime const &obj, tm const &ts):
              Returns  a copy of obj to which the tm_sec, tm_min, tm_hour, tm_mday, tm_mon and tm_year fields of
              ts were subtracted.

              Caveat: note that this is an addition operation: if you want to subtract 1 year specify ts.tm_year
              = 1, and not the finally expected calendar year!

       o      DateTime &operator-=(std::chrono::seconds seconds):
              Subtracts seconds from the time represented by the current object;

       o      DateTime &operator-=(tm const &ts):
              Subtracts  the  tm_sec,  tm_min,  tm_hour,  tm_mday, tm_mon and tm_year fields of ts from the time
              represented by the current object.

              Caveat: note that this is an addition operation: if you want to subtract 1 year specify ts.tm_year
              = 1, and not the finally expected calendar year!

              E.g., the following program fragment displays midnight, December 31, 1969:
              DateTime dt{ 0, DateTime::UTC };    // set UTC at begin of era

              tm era{ 0 };                        // define a tm with tm_mday == 1
              era.tm_mday = 1;

              dt -= era;                          // subtract from dt and display
              cout << dt << endl;

              Copy and move assignment operators are available.

MEMBER FUNCTIONS

       All  members  returning  a  time-element  do  so  according to the latest time-representation (i.e., UTC,
       LOCALTIME, or using an explicitly set display zone shift value). All members returning numeric values use
       0 as their smallest return value, except for the ...Nr() members, which start at 1.

       o      bool dst() const:
              Returns true if the current object’s time includes a DST shift, otherwise false is returned.

       o      unsigned hours() const:
              Returns the number of hours represented by the current object’s time (0-23);

       o      unsigned minutes() const:
              Returns the number of minutes represented by the current object (0-59);

       o      DateTime::Month month() const:
              Returns the Month represented by the current object;

       o      unsigned monthDayNr() const:
              Returns the day number of the month represented by the current object’s date (1-31);

       o      string rfc2822() const:
              Returns  the current object’s date/time displayed according to the RFC 2822 format. This format is
              used, e.g., by the date -R command (cf. date(1)). For example:

                  Mon,  3 Dec 2018 13:49:10 +0100

       o      string rfc3339() const:
              Returns the current object’s date/time displayed according to the the RFC 3339 format. This format
              is used, e.g., by the date --rfc-3339=seconds command (cf. date(1)). For example:

                  2018-12-03 13:29:11+01:00

       o      unsigned seconds() const:
              Returns  the  number  of seconds represented by the current object’s time (0-59, but 60 and 61 may
              occur at leap seconds);

       o      void setDay(int dayNr):
              Assigns dayNr to the day number of the object’s current month.

              Caveat: since day numbers start at 1, passing 0 or negative values to setDay results in  resetting
              the objects date to an earlier month;

       o      void setFields(tm const &ts, DateTime::TimeFields fields):
              Assigns  the  fields  of  ts  indicated by a bit_or combination of TimeFields fields’ value to the
              corresponding current object’s date/time tm fields;

       o      void setHours(int hours):
              Assigns hours to the number of hours of the current object’s time;

       o      void setMinutes(int minutes):
              Assigns minutes to the number of minutes of the current object’s time;

       o      void setMonth(int month):
              Assigns month to the current object’s month. January is represented by 0, December by 11.  Smaller
              or larger values refer to previous or future years;

       o      void setMonth(DateTime::Month month):
              Assigns month to the current object’s month;

       o      void setMonth(DateTime::Month month, DateTime::Relative where = THIS_YEAR):
              Assigns  month  to the current object’s month. By default the month of the current year is updated
              (where == THIS_YEAR). Use LAST to ensure that the month is set before the current  object’s  month
              (e.g.,  if  the  current  month  is JUNE, then requesting AUGUST, LAST will decrement the object’s
              year, but requesting MAY, LAST won’t). Analogously, when specifying DateTime::NEXT  the  resulting
              month is set after the current object’s month.

              Caveat:  If the day number of the current month exceeds the number of days in the requested month,
              the object’s month and day number are updated to the next month. E.g., if the current  day  number
              equals 31, and NOVEMBER is requested, then the object’s date is updated to December 1;

       o      void setSeconds(int seconds):
              Assigns seconds to the number of seconds of the current object’s time;

       o      void setUTCseconds(time_t utcSeconds):
              Assigns utcSeconds as the number of seconds since the epoch to the current object’s UTC time;

       o      void setWeekday(Weekday day, Relative where = NEXT):
              Assigns  day  to  the current object’s day of the week. By default (where == NEXT) the day will be
              the next occurrence of day (maybe the current week, maybe in the next week:  if  the  current  day
              equals  Monday and Friday is specified, the current week is used. If the current day equals Friday
              and Monday is requested the next week is used). By specifying where = LAST the day  will  be  most
              recent  occurrence  of  day: if the current day equals Friday and Monday is requested, the current
              week is used. By specifying where = THIS_WEEK then day is selected in the current week;

       o      void setYear(unsigned year):
              Assigns year to the current object’s date. Note that year is the actual calendar  year,  and  not,
              e.g., the year relative to the beginning of the epoch or 1900;

       o      void setZone(Datetime::Zone const &zone):
              The  current  object’s  time  zone  is set to zone. This does not alter the object’s UTC time, but
              merely its time zone. If the object represented UTC time before calling setZone it will  represent
              a local time after calling setZone;

       o      void swap(DateTime &other):
              Swaps the current and other DateTime object;

       o      DateTime thisTime() const:
              Returns  a  DateTime  object  using the current object’s UTC time, applying the computer’s default
              time zone;

       o      tm const *timeStruct() const:
              Returns a pointer to the object’s current tm representing its object’s broken down time  elements.
              If the object holds a local time the tm struct represents the local time (if applicable: including
              a DST shift), otherwise it represents UTC;

       o      DateTime utc() const:
              Returns a copy of the current object representing its UTC time;

       o      time_t utcSeconds() const:
              Returns the current object’s (UTC) time in seconds since the epoch;

       o      DateTime::Weekday weekday() const:
              Returns the current object’s Weekday value;

       o      unsigned weekNr() const:
              Returns the week number of the current object’s date. Week numbers are numbers of complete  weeks.
              If  Jan  1st  is  a  Sunday  then  the  week numbers of Jan 1st through Jan 6th are returned as 1,
              otherwise the week numbers of Jan 1st through the date of the first Saturday of  the  year  (which
              could very well be Jan 1st) are returned as 52;

       o      unsigned year() const:
              Returns  the  year  of  the current object’s date (note: this is the actual calendar year, not the
              year since the epoch or relative to 1900);

       o      unsigned yearDay() const:
              Returns the day in the year of the current object’s date. January 1st is returned as 0;

       o      unsigned yearDayNr() const:
              Returns the day in the year of the current object’s date. January 1 is returned as 1;

       o      DateTime::Zone const &zone() const:
              Returns the current object’s Zone object.  )

STATIC MEMBER

       o      void tm2cout(char const *label, TM const &ts):
              This static member is primarily used for debugging  purposes.  It  displays  the  values  of  ts’s
              fields, preceded by label and ": ".

EXAMPLES

       Many   examples  illustrating  the  use  of  DateTime  objects  are  provided  in  the  source  archive’s
       bobcat/datetime/driver directory. Here is an example:
       #include <iostream>

       #include "../datetime"

       using namespace std;
       using namespace FBB;

       void show(DateTime const &dt, char const *label)
       {
           cout <<
               label << ": " << dt << "\n"
               "dst: " << dt.dst() << "\n"
               "hh:mm:ss: " << dt.hours() << ’:’ << dt.minutes() << ’:’ <<
                               dt.seconds() << "\n"
               "year-month-monthdaynr: " << dt.year() << ’-’ << dt.month() << ’-’ <<
                                            dt.monthDayNr() << "\n"
               "weekday/weeknr/yearday/yeardaynr: " <<
                   dt.weekday() << ’/’ << dt.weekNr() << ’/’ <<
                   dt.yearDay() << ’/’ << dt.yearDayNr() << "\n"
               "\n";
       }

       int main()
       {
           time_t now = time(0);

           DateTime utc{ now, DateTime::UTC };
           show(utc, "Current UTC time");

           DateTime local{ utc.thisTime() };

           cout << "The COMPUTER’S LOCAL TIME: " << local << ’\n’;

           DateTime dt{ now, DateTime::LOCALTIME };
           show(dt, "Current LOCAL TIME");

           DateTime utc2{ dt.utc() };
           cout << "UTC obtained from LOCAL TIME: " << utc2 << ’\n’;

           DateTime jan1{ "2019-01-01 13:00:00+01:00", DateTime::LOCALTIME };
           cout << "Jan 1, 1919, 13:00h: " << jan1 << ’\n’;
           show(jan1, "Jan 1, details:");

           cout << "\nOptionally rerun specifying another time zone specification\n"
                   "\n";
       }

FILES

       bobcat/datetime defines the class interface.

SEE ALSO

       bobcat(7), Exception(3bobcat), gmtime_r(3), localtime_r(3), mktime(3), time(2), tzset(3),
       http://www.catb.org/esr/time-programming,
       https://www.timeanddate.com/time/dst/events.html

BUGS

       See bobcat’s changelog file for an overview of members that were discontinued at release 5.00.00.
       The class DateTime assumes that time(2) returns the time in UTC.
       English is used/expected when specifying named date components.

DISTRIBUTION FILES

       o      bobcat_5.02.00-x.dsc: detached signature;

       o      bobcat_5.02.00-x.tar.gz: source archive;

       o      bobcat_5.02.00-x_i386.changes: change log;

       o      libbobcat1_5.02.00-x_*.deb: debian package holding the libraries;

       o      libbobcat1-dev_5.02.00-x_*.deb: debian package holding the libraries, headers and manual pages;

       o      http://sourceforge.net/projects/bobcat: public archive location;

BOBCAT

       Bobcat is an acronym of `Brokken’s Own Base Classes And Templates’.

       This is free software, distributed under the terms of the GNU General Public License (GPL).

AUTHOR

       Frank B. Brokken (f.b.brokken@rug.nl).