dwww Home | Manual pages | Find package

Date::Manip::TZ(3pm)  User Contributed Perl Documentation Date::Manip::TZ(3pm)

NAME
       Date::Manip::TZ - an interface to the time zone data

SYNOPSIS
          use Date::Manip::TZ;
          $tz = new Date::Manip::TZ;

       Data for most (and hopefully all) time zones used around the world have
       been gathered and is publicly available in the zoneinfo (or Olson)
       database.

       This module uses the data from the zoneinfo database to perform various
       time zone operations.

DESCRIPTION
       Every time zone has some of the following characteristics:

       name
           Every time zone has a unique name. In the zoneinfo database, these
           are something similar to:

              America/New_York

       aliases
           Time zones may have (but are not required to have) one or more
           aliases.  Each alias is unique, and is not the same as any time
           zone name. An alias can be used in exactly the same way as a name.

       periods
           Every time zone is broken up into periods. Each period describes
           how a portion of time relates to GMT, and how it might be
           expressed.

       Each period includes the following information:

       start time, end time
           The period begin and ends at certain times. The times are included
           both as an absolute GMT time, and as a wall clock time.  The wall
           clock start time is the time that will be on a clock just as the
           period starts (i.e. after a time change). The wall clock end time
           is the time on a clock immediately before the period ends.

       offset
           The entire period has an offset which is how much the wall clock
           time differs from GMT.

       abbreviation
           When expressing the time period, an abbreviation (such as EST) is
           typically used.

       daylight saving time flag
           Every period is categorized as a standard time or a daylight saving
           time. The flag will be 1 if it is a daylight saving time, or 0 if
           it is a standard time.

       Date::Manip includes all of the data for all of the time zones from the
       zoneinfo database. This data is available from:

       <ftp://ftp.iana.org/tz/>

       Additional data from other standards are also used.

       The zoneinfo database is not necessary in order to use Date::Manip.
       Instead, all of that data has been extracted and stored in a series of
       other modules which are used to handle each time zone.  In that way,
       Date::Manip has no dependency on any other source of data.

       The Date::Manip::Zones document contains detailed information on the
       data available.

METHODS
       In all methods, the following variables are used:

       $zone
           This is a string which contains a valid time zone name.  For
           example:

             America/New_York

       $alias
           This is a strings which contains a valid time zone name, or a valid
           time zone alias. For example:

             America/New_York
             US/Eastern
             EST5EDT

       $abbrev
           This is a string which contains a valid time zone abbreviation. For
           example:

             EST

       $offset
           This is a time zone entered as an offset. An offset is either a
           string of one of the formats:

             +HH
             +HHMM
             +HHMMSS
             +HH:MM
             +HH:MM:SS

           or it can be a list reference:

             [HH,MM,SS]

           If a list reference is used, the sign must be included with all
           values.  So, the offset "-05:30" would be the list reference:

             [-5,-30,0]

       $dstflag
           This is always one of the values: std, stdonly, dst, dstonly

           It defaults to "std" if it is not present. When determining a time
           zone, it is usually necessary to check a number of different time
           zone and DST combinations.

           If $dstflag is "std", it will check both standard and daylight
           saving times, but will give preference to standard times. If
           $dstflag is "stdonly", only standard times will be checked.

           The "dst" flag will search both, but give preference to daylight
           saving times.  The "dstonly" values will only use daylight saving
           times.

       $date
           A date is always a string containing a date in one of the formats:

              YYYYMMDDHH:MN:SS
              YYYY-MM-DD-HH:MN:SS
              YYYYMMDDHHMNSS

           or a list reference:

              [Y,M,D,H,MN,S]

       $isdst
           This is 0 if a date is in standard time, 1 if it is in daylight
           saving time.

       $period
           A period is a list reference currently containing the following
           items:

              [ $dateUT, $dateLT, $offsetstr, $offset, $abbrev, $isdst,
                $endUT, $endLT, $begUTs, $begLTs, $endUTs, $endLTs ]

           $dateUT and $dateLT are the starting date of the period (i.e. the
           first second in a period) in universal (GMT) time and local (wall
           clock) time. $endUT and $endLT are the end date of the period (i.e.
           the last second in a period) in universal and local time.  These
           are all stored as list references.

           $offsetstr is the string representation of the offset ("+05:00:00")
           and $offset is the corresponding list reference form ([5,0,0]).

           $abbrev is the abbreviation that applies during this period, and
           $isdst is 0 or 1 if it is standard or daylight saving time.

           When accessing the elements in a period, use ONLY positive indices.
           In other words, to get $endUT, access it as $$period[6], NOT as
           $$period[-2], since I am considering adding more information to the
           period description that may speed up performance.

           $begUTs is the string representation (YYYYMMDDHH:MN:SS) of $begUT.
           Similar for $begLTs, $endUTs, and $endLTs.

       The following methods are available:

       base
       config
       err
       new
       new_config
           Please refer to the Date::Manip::Obj documentation for these
           methods.

       all_periods
              @periods = $tz->all_periods($zone,$year);

           This returns the description of all time zone periods that occur
           (in full or in part) during the given year.  The year is measured
           in universal (GMT) time.

       convert
       convert_to_gmt
       convert_from_gmt
       convert_to_local
       convert_from_local
           These functions convert a date from one time zone to another.

              ($err,$date,$offset,$isdst,$abbrev) =
                 $tz->convert($date,$from,$to [,$isdst]);

           This converts a date in the time zone given by $from to the time
           zone given by $to.

              ($err,$date,$offset,$isdst,$abbrev) =
                 $tz->convert_to_gmt($date [,$from] [,$isdst]);

           This converts a date to GMT. If $from is given, it is the current
           time zone of the date. If $from is omitted, it defaults to the
           local time zone.

           The value of $isdst returned is always 0.

              ($err,$date,$offset,$isdst,$abbrev) =
                 $tz->convert_from_gmt($date [,$to]);

           This converts a date from GMT to another time zone. If $to is
           given, the date is converted to that time zone. Otherwise, it is
           converted to the local time zone.

              ($err,$date,$offset,$isdst,$abbrev) =
                 $tz->convert_to_local($date [,$from] [,$isdst]);
              ($err,$date,$offset,$isdst,$abbrev) =
                 $tz->convert_from_local($date [,$to] [,$isdst]);

           Similar to the convert_to_gmt and convert_from_gmt functions. If
           $from or $to are omitted, they default to GMT.

           If there is any ambiguity about whether $date is in DST or not
           (i.e.  if it is a date that is repeated during a time change due to
           the clock being moved back), the $isdst option can be passed in as
           an argument (it should be 0 or 1) to say which time to use. It is
           ignored in all cases where $date can be determined without that
           information.

           The $isdst value passed back is 1 if the converted date is in DST.
           The $offset value passed back is a list reference containing the
           offset from GMT. $abbrev passed back is the time zone abbreviation.

           Error codes are:

              0  No error
              1  Invalid arguments
              2  Invalid FROM zone
              3  Invalid TO zone
              4  Invalid date

       curr_zone
              $tz->curr_zone();

           This returns the system time zone. The system time zone is
           determined using the methods described below in the "DETERMINING
           THE SYSTEM TIME ZONE" section.

           This is the time zone that is used by default unless the SetDate or
           ForceDate config variable is set to a different zone.

              $tz->curr_zone(1);

           This clears the system time zone and re-determines it using the
           methods described below.

           The main reason to do this is if the curr_zone_methods method is
           used to change how the time zone is determined.

       curr_zone_methods
              $tz->curr_zone_methods(@methods);

           This sets the list and order of methods to use in determining the
           local time zone. The various methods available are listed below in
           the section "DETERMINING THE SYSTEM TIME ZONE".

           Some methods may require one or more arguments. For example, the
           method named "mainvar" takes an option that is the name of a
           variable. The arguments must be included in the @methods list
           immediately after the method name (so @methods is actually a
           mixture of method names and arguments).

           This method may not be used in any environment where taint checking
           is enabled. If it is, it will issue a warning, but will NOT change
           the method list.

       date_period
              $period = $tz->date_period($date,$zone,$wall_clock [,$isdst]);

           This returns the period information for the given date. $date
           defaults to GMT, but may be given as local (i.e. wall clock) time
           if $wall_clock is non-zero. The period information is described in
           the periods method below.

           If a wall clock time is given, no period is returned if the wall
           clock time doesn't ever appear (such as when a time change results
           in the clock moving forward "skipping" a period of time). If the
           wall clock time appears twice (i.e. when a time change results in
           the clock being set back), the $isdst variable is used. The
           standard time is used unless $isdst is non-zero.  $isdst is ignored
           except in the case where there are two possible periods.

       define_abbrev
              ($err,$val) = $tz->define_abbrev($abbrev,@zone);

           When encountering an abbreviation, by default, all time zones which
           ever include the abbreviation will be examine in the order given in
           the Date::Manip::Zones manual.

           Occasionally, it may be necessary to change the order. This is true
           if you are parsing dates in a time zone which uses an abbreviation
           which is also used in another time zone, and where the other time
           zone is given preference. As an example, the abbreviation "ADT"
           will default to the "Atlantic/Bermuda" time zone. If you are in the
           "America/Halifax" time zone (which also uses that abbreviation),
           you may want to change the order of time zones.

           This will take an abbreviation (which must be a known
           abbreviation... there is no means of defining a totally new
           abbreviation) and a list of zones.  This will set the list of zones
           that will be checked, and the order in which they are checked, when
           a date is encountered with the given abbreviation. It is not
           necessary that the list include every zone that has ever used the
           abbreviation, but it may not include a zone that has never used it.

           If $abbrev is "reset", all abbreviations are reset to the standard
           values.  If @zone includes only the element 'reset', the default
           list for $abbrev is restored.

           The following error codes are returned:

              0  No error
              1  $abbrev is not a valid abbreviation in any time zone
              2  A zone (returned as $val) is not a valid time zone
              3  A zone (returned as $val) does not use the abbreviation

           For more information about the different zones which may correspond
           to each abbreviation, and the order in which they will be examined
           by default, refer to the Date::Manip::Zones manual.

       define_alias
              $err = $tz->define_alias($alias,$zone);

           This will define a new alias (or override an existing alias). $zone
           must be a valid zone or an error is returned.

           For more information about the different aliases which are set by
           default, refer to the Date::Manip::Zones manual.

           If $alias is "reset", all aliases will be reset to the standard
           values.  If $zone is "reset", $alias will be reset to the standard
           value.

       define_offset
              ($err,$val) = $tz->define_offset($offset, [$dstflag,] @zone);

           This is similar to the define_abbrev method. When an offset is
           encountered, all time zones which have ever included that offset
           are checked. This will defined which time zones, and in what order,
           they should be checked.

           The zones to both standard and daylight saving times which include
           the offset (if $dstflag is "std" or "dst") or to only one or the
           other.

           If $offset is "reset", all lists are reset to the default values.
           If @zone includes only the element 'reset', the default list and
           order is restored for $offset ($dstflag must not be given).

           The following error codes are returned:

              0  No error
              1  $offset is not a valid offset in any time zone
              2  $offset is not a valid offset in the selected
                 time (if doing "dstonly" or "stdonly")
              3  A zone (returned as $val) is not a valid time zone
              4  A zone (returned as $val) does not use the offset
              5  A zone (returned as $val) does not include the
                 offset in the selected time (if doing "dstonly"
                 or "stdonly")

              9  Offset is not a valid offset

       periods
              @periods = $tz->periods($zone,$year);

           This returns the description of all time zone periods that begin
           during the year given. The year is measured in universal (GMT)
           time.

           If no time zone period starts in the given year, nothing is
           returned.

              @periods = $tz->periods($zone,undef,$year);

           This returns all periods that begin in any year from 0001 to $year.

              @periods = $tz->periods($zone,$year0,$year1);

           This returns all periods that begin in any year from $year0 to
           $year1.

       tzdata
       tzcode
              $vers = $tz->tzdata();
              $vers = $tz->tzcode();

           These return the versions of the tzdata and tzcode packages used to
           generate the modules.

       zone
              $zone = $tz->zone(@args);
              @zone = $tz->zone(@args);

           This function will return a list of all zones, or the default zone,
           which matches all of the supplied information. In scalar context,
           it will return only the default zone. In list context, it will
           return all zones.

           @args may include any of the following items, and the order is not
           important.

              A zone name or alias ($alias)

              A zone abbreviation ($abbrev)

              An offset ($offset)

              A dstflag ($dstflag)

              A date ($date)

           It is NOT valid to include two of any of the items. Any time zone
           returned will match all of the data supplied.

           If an error occurs, undef is returned. If no zone matches, an empty
           string, or an empty list is returned.

           The order of the zones will be determined in the following way:

           If $abbrev is given, the order of time zones will be determined by
           it (and $dstflag). If $dstflag is "std", all zones which match
           $abbrev in standard time are included, followed by all that match
           $abbrev in saving time (but no duplication is allowed). The reverse
           is true if $dstflag is "dst".

           If $abbrev is not given, but $offset is, $offset (and $dstflag)
           will determine the order given. If $dstflag is "std", all zones
           which match $offset in standard time are included, followed by all
           that match $offset in saving time (but no duplication is allowed).
           The reverse is true if $dstflag is "dst".

           If $date is given, only zones in which $date will appear in a zone
           that matches all other information are given. $date is a wall clock
           time.

           If no $zone, $abbrev, or $offset are entered, the local time zone
           may be returned (unless $date is entered, and it doesn't exist in
           the local time zone).

           NOTE: there is one important thing to note with respect to $dstflag
           when you are working with a timezone expressed as an offset and a
           date is passed in. In this case, the default value of $dstflag is
           "dst" (NOT "stdonly"), and you probably never want to pass in a
           value of "std" (though passing in "stdonly" is okay).

           For standard offsets (with no minute component), there is always a
           standard timezone which matches that offset. For example, the
           timezone "+0100" matches the timezone "Etc/GMT+01", so you will
           never get a timezone in daylight saving time if $dstflag is "std".

           If you want to pass in a date of 2001-07-01-00:00:00 and an
           timezone of "+0100" and you want to get a timezone that refers to
           that date as a daylight saving time date, you must use the $dstflag
           of "dst" (or "dstonly").

           Because this is almost always the behavior desired, when a zone is
           passed in as an offset, and a date is passed in, the default
           $dstflag is "dst" instead of "std". In all other situations, the
           default is still "std".

           If the timezone is expressed as an abbreviation, this problem does
           not occur.

TIME ZONE INFORMATION IN DATE::MANIP
       Date::Manip makes use of three potentially different time zones when
       working with a date.

       The first time zone that may be used is the actual local time zone.
       This is the time zone that the computer is actually running in.

       The second time zone is the working time zone. Usually, you will want
       the default time zone to be the local time zone, but occasionally, you
       may want the default time zone to be different.

       The third time zone is the actual time zone that was parsed, or set,
       for a date. If a date contains no time zone information, it will
       default to the working time zone.

       The local time zone is determined using the methods described in the
       following section. Methods exist for locating the zone in one of the
       system configuration files, determining it by running a system command,
       or by looking it up in the registry (for Windows operating systems).
       If all of these methods fail, the local time zone may be set using
       either the $::TZ or $ENV{TZ} variables. Please note that these should
       ONLY be used to set the actual local time zone.

       If you are running in one time zone, but you want to force dates to be
       specified in an alternate time zone by default, you need to set the
       working time zone. The working time zone defaults to the local time
       zone, but this can be changed using either the SetDate or ForceDate
       config variables. Refer to the Date::Manip::Config manual for more
       information.

       Finally, when a date is actually parsed, if it contains any time zone
       information, the date is stored in that time zone.

DETERMINING THE SYSTEM TIME ZONE
       There are a large number of ways available for determining the time
       zone. Some or all of them may be checked. A list of methods to use is
       provided by default, and may be overridden by the curr_zone_methods
       function described above. To override the default order and/or list of
       methods, just pass in a list of method names (with arguments where
       necessary), and only those methods will be done, and in the order
       given.

       The following methods are available:

          Method     Argument(s)    Procedure
          ======     ===========    =========

          main       VAR            The main variable named VAR is
                                    checked. E.g. "main TZ" checks
                                    the variable $::TZ .

          env        TYPE VAR       The named environment variable
                                    is checked and the type of
                                    data stored there (TYPE can
                                    be 'zone' or 'offset' which
                                    is the number of seconds from
                                    UTC).

          file       FILE           Look in the given file for any
                                    one of the following case
                                    insensitive lines:
                                       ZONE
                                       tz = ZONE
                                       zone = ZONE
                                       timezone = ZONE
                                    ZONE may be quoted (single or
                                    double) and whitespace is
                                    ignored (except that underscores
                                    in the zone name may be replaced
                                    by whitespace on some OSes). If
                                    the entire line is a zone, it must
                                    be the first non-blank non-comment
                                    line in the file.

          command    COMMAND        Runs a command which produces
                                    a time zone as the output.

          cmdfield   COMMAND N      Runs a command which produces
                                    whitespace separated fields,
                                    the Nth one containing the
                                    time zone (fields are numbered
                                    starting at 0, or from the
                                    end starting at -1).

          gmtoff                    Uses the current offset from
                                    GMT to come up with a best guess.

          tzdata     FILE DIR       This uses a system config file that
                                    contains a pointer to the local tzdata
                                    files to  determine the timezone.  On
                                    many operating systems, use:

                                    tzdata /etc/localtime /usr/share/zoneinfo

                                    FILE is the system file.  DIR is the
                                    directory where the tzdata files are stored.

                                    The config file is either a link to a file
                                    in the tzdata directory or a copy of one
                                    of the files.

          registry                  Look up the value in the
                                    Windows registry. This is only
                                    available to hosts running a
                                    Windows operating system.

       Note that the "main" and "env" methods should only be used to specify
       the actual time zone the system is running in. Use the SetDate and
       ForceDate config variables to specify an alternate time zone that you
       want to work in.

       By default, the following methods are checked (in the order given) on
       Unix systems:

          main     TZ
          env      zone TZ
          file     /etc/TIMEZONE
          file     /etc/timezone
          file     /etc/sysconfig/clock
          file     /etc/default/init
          command  "/bin/date +%Z"
          command  "/usr/bin/date +%Z"
          command  "/usr/local/bin/date +%Z"
          cmdfield /bin/date             -2
          cmdfield /usr/bin/date         -2
          cmdfield /usr/local/bin/date   -2
          command  "/bin/date +%z"
          command  "/usr/bin/date +%z"
          command  "/usr/local/bin/date +%z"
          tzdata   /etc/localtime /usr/share/zoneinfo
          gmtoff

       The default methods for Windows systems are:

          main     TZ
          env      zone TZ
          registry
          gmtoff

       The default methods for VMS systems are:

          main     TZ
          env      zone TZ
          env      zone SYS$TIMEZONE_NAME
          env      zone UCX$TZ
          env      zone TCPIP$TZ
          env      zone MULTINET_TIMEZONE
          env      offset SYS$TIMEZONE_DIFFERENTIAL
          gmtoff

       The default methods for all other systems are:

          main     TZ
          env      zone TZ
          gmtoff

       If anyone wants better support for a specific OS, please contact me and
       we'll coordinate adding it.

       In all cases, the value returned from the method may be any of the
       following:

          the full name of a time zone (e.g. America/New_York)
          or an alias

          an abbreviation (e.g. EDT) which will be used to
          determine the zone if possible

          an offset (+hh, +hhmn, +hh:mm, +hh:mm:ss) from GMT

       The Date::Manip::Zones module contains information about the time zones
       and aliases available, and what time zones contain the abbreviations.

DESIGN ISSUES
       The design decisions made in writing this module may cause some
       questions (and probably complaints).  The time zone modules are all
       generated using scripts (included in the Date::Manip distribution)
       which use the standard tzdata tools to parse the tzdata files and store
       that information in perl modules.

       I'd like to address some of them, to avoid answering some of the "why
       did you do it that way" remarks. I do welcome discussion about these
       decisions... but preferably after you understand why those decisions
       were made so that that we have an informed basis to begin a discussion.

       Why not use existing zoneinfo files
           Some people will probably think that I should have written an
           interface to the zoneinfo files which are distributed with most
           operating systems.  Although I considered doing that, I rejected
           the idea for two reasons.

           First, not all operating systems come with the zoneinfo databases
           in a user accessible state (Microsoft for example).  Even those
           that do include them store the information in various formats and
           locations.  In order to bypass all that, I have included the data
           directly in these modules.

           Second, as I was doing my initial investigations into this, I ran
           into a bug in the Solaris zoneinfo tools (long since fixed I'm
           sure).  I decided then that I didn't want to depend on an
           implementation where I could not control and fix the bugs.

       Why not use the native tzdata files
           Another decision people may question is that I parse the tzdata
           files and store the data from them in a large number of perl
           modules instead of creating an interface to the tzdata files
           directly. This was done solely for the sake of speed.  Date::Manip
           is already a slow module.  I didn't want to slow it down further by
           doing the complex parsing required to interpret the tzdata files
           while manipulating dates.  By storing the data in these modules,
           there is little or no parsing done while using Date::Manip modules.
           It costs a little disk space to store this information... but very
           little of it is actually loaded at runtime (time zone data is only
           loaded when the time zone is actually referred to), so I feel it's
           a good tradeoff.

       Why store the information in so many files
           The data from the native tzdata files are parsed and stored in two
           sets of modules. These include almost 500 Date::Manip::Offset::*
           modules and almost 450 Date::Manip::TZ::* modules.

           I note that on my linux box, /usr/share/zoneinfo (which contains
           data files generated from the tzdata files) contains over 1700
           files, so I'm not doing anything "new" by breaking up the
           information into separate files. And doing so has a huge impact on
           performance... it is not necessary to load and/or manipulate data
           from time zones which are not in use.

           The minute I made the decision to distribute the timezone
           information myself, as opposed to using the system version, it was
           a given that there would be a lot of files.

           These modules are loaded only when the time zone or offset is
           actually used, so, unless dates from around the world are being
           parsed, only a very small number of these modules will actually be
           loaded. In many applications, only a single TZ module will be
           loaded. If parsing dates which have timezone information stored as
           offsets, one or two Offset modules will also be loaded.

       The disk space seems excessive
           Currently, the disk usage of the perl files is around 9 MB. Total
           disk usage for /usr/share/zoneinfo on my computer is around 4 MB.
           There are a couple of differences.

           The primary difference is that the zoneinfo files are stored in a
           binary (and hence, more compressed) version, where the perl modules
           have all the data in pure text.

           Since these are all automatically generated and used, it may be
           beneficial to store the data in some packed binary format instead
           of the fully expanded text form that is currently in use. This
           would decrease the disk space usage, and might improve performance.
           However, the performance improvement would happen only once per
           timezone, and would make for more complicated code, so I'm not very
           interested in pursuing this.

           Another aspect of the current modules is that they all include pod
           documentation. Although not necessary, this allows users to easily
           see what modules handle which time zones, and that's nice. It also
           allows me to use pod_coverage tests for the module which is a nice
           check to make sure that the documentation is accurate.

           All told, I don't consider the disk usage excessive at all.

KNOWN PROBLEMS OR ISSUES
       Unable to determine Time Zone
           When using Date::Manip, when the module is initialized, it must be
           able to determine the local time zone. If it fails to do so, an
           error will occur:

              Unable to determine Time Zone

           and the script will exit.

           In the past, this was the most common problem with using
           Date::Manip .  With the release of 6.00, this problem should be
           significantly less common. If you do get this error, please refer
           to the section above DETERMINING THE SYSTEM TIME ZONE for
           information about determining the local time zone. I am also
           interested in hearing about this so that I can update the default
           list of methods to be able to determine the local time zone better.

       Asia/Jerusalem time zone
           The Asia/Jerusalem time zone has a non-standard way of specifying
           the start and end of Daylight Saving Time based on the Hebrew
           calendar.

           As a result, there is no way to specify a simple rule to define
           time zone changes for all years in the future. As such, this module
           supports all time zone changes currently specified in the zoneinfo
           database (which currently goes to the year 2037) but does not
           attempt to correctly handle zone changes beyond that date. As a
           result, Date::Manip should not be used to parse dates in the
           Jerusalem time zone that are far enough in the future that
           information is not included in the current version of the zoneinfo
           database.

       LMT and zzz abbreviations
           Both the LMT and zzz abbreviations are used in the zoneinfo
           databases.  LMT is use for most time zones for the times before the
           Gregorian calendar was adopted, and zzz is used for a few where the
           time zone was created and no description of dates prior to that are
           supported. Both LMT and zzz are basically ignored in parsing dates
           (because there is no reasonable way to determine which zone they
           are referring to), and will be treated as the local time zone
           regardless.

KNOWN BUGS
       None known.

BUGS AND QUESTIONS
       Please refer to the Date::Manip::Problems documentation for information
       on submitting bug reports or questions to the author.

SEE ALSO
       Date::Manip        - main module documentation

LICENSE
       This script is free software; you can redistribute it and/or modify it
       under the same terms as Perl itself.

AUTHOR
       Sullivan Beck (sbeck@cpan.org)

perl v5.36.0                      2023-03-05              Date::Manip::TZ(3pm)

Generated by dwww version 1.15 on Wed Jun 26 05:29:25 CEST 2024.