Date
[ class tree: Date ] [ index: Date ] [ all elements ]

Source for file TimeZone.php

Documentation is available at TimeZone.php

  1. <?php
  2. /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4 foldmethod=marker: */
  3.  
  4.  
  5. // {{{ Header
  6.  
  7. /**
  8.  * TimeZone representation class, along with time zone information data
  9.  *
  10.  * PHP versions 4 and 5
  11.  *
  12.  * LICENSE:
  13.  *
  14.  * Copyright (c) 1997-2007 Baba Buehler, Pierre-Alain Joye, C.A. Woodcock
  15.  * All rights reserved.
  16.  *
  17.  * Redistribution and use in source and binary forms, with or without
  18.  * modification, are permitted under the terms of the BSD License.
  19.  *
  20.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  21.  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  22.  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
  23.  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
  24.  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
  25.  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
  26.  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  27.  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  28.  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
  30.  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  31.  * POSSIBILITY OF SUCH DAMAGE.
  32.  *
  33.  * @category   Date and Time
  34.  * @package    Date
  35.  * @author     Baba Buehler <baba@babaz.com>
  36.  * @author     Pierre-Alain Joye <pajoye@php.net>
  37.  * @author     C.A. Woodcock <c01234@netcomuk.co.uk>
  38.  * @copyright  1997-2007 Baba Buehler, Pierre-Alain Joye, C.A. Woodcock
  39.  * @license    http://www.opensource.org/licenses/bsd-license.php
  40.  *              BSD License
  41.  * @version    CVS: $Id: TimeZone.php,v 1.33 2008/03/23 18:34:16 c01234 Exp $
  42.  * @link       http://pear.php.net/package/Date
  43.  */
  44.  
  45.  
  46. // }}}
  47. // {{{ Class Date_TimeZone
  48.  
  49. /**
  50.  * TimeZone representation class, along with time zone information data
  51.  *
  52.  * The default timezone is set from the first valid timezone id found
  53.  * in one of the following places, in this order:
  54.  *   + global $_DATE_TIMEZONE_DEFAULT
  55.  *   + system environment variable PHP_TZ
  56.  *   + system environment variable TZ
  57.  *   + the result of date('T')
  58.  *
  59.  * If no valid timezone id is found, the default timezone is set to 'UTC'.
  60.  * You may also manually set the default timezone by passing a valid id to
  61.  * Date_TimeZone::setDefault().
  62.  *
  63.  * This class includes time zone data (from zoneinfo) in the form of a
  64.  * global array, $_DATE_TIMEZONE_DATA.
  65.  *
  66.  * @category  Date and Time
  67.  * @package   Date
  68.  * @author    Baba Buehler <baba@babaz.com>
  69.  * @author    C.A. Woodcock <c01234@netcomuk.co.uk>
  70.  * @copyright 1997-2007 Baba Buehler, Pierre-Alain Joye, C.A. Woodcock
  71.  * @license   http://www.opensource.org/licenses/bsd-license.php
  72.  *             BSD License
  73.  * @version   Release: 1.5.0a1
  74.  * @link      http://pear.php.net/package/Date
  75.  */
  76. {
  77.  
  78.     // {{{ Properties
  79.  
  80.     /**
  81.      * Unique time Zone ID of this time zone
  82.      *
  83.      * @var      string 
  84.      * @access   private
  85.      * @since    Property available since Release 1.0
  86.      */
  87.     var $id;
  88.  
  89.     /**
  90.      * Offset, in milliseconds, of this timezone
  91.      *
  92.      * @var      int 
  93.      * @access   private
  94.      * @since    Property available since Release 1.0
  95.      */
  96.     var $offset;
  97.  
  98.     /**
  99.      * Short name of this time zone (e.g. "CST")
  100.      *
  101.      * @var      string 
  102.      * @access   private
  103.      * @since    Property available since Release 1.0
  104.      */
  105.     var $shortname;
  106.  
  107.     /**
  108.      * DST short name of this timezone (e.g. 'BST')
  109.      *
  110.      * @var      string 
  111.      * @access   private
  112.      * @since    Property available since Release 1.0
  113.      */
  114.     var $dstshortname;
  115.  
  116.     /**
  117.      * Long name of this time zone (e.g. "Central Standard Time")
  118.      *
  119.      * N.B. this is not necessarily unique
  120.      *
  121.      * @since    1.0
  122.      * @access   private
  123.      * @since    Property available since Release 1.0
  124.      */
  125.     var $longname;
  126.  
  127.     /**
  128.      * DST long name of this time zone (e.g. 'British Summer Time')
  129.      *
  130.      * @var      string 
  131.      * @access   private
  132.      * @since    Property available since Release 1.0
  133.      */
  134.     var $dstlongname;
  135.  
  136.     /**
  137.      * Whether this time zone observes daylight savings time
  138.      *
  139.      * @var      bool 
  140.      * @access   private
  141.      * @since    Property available since Release 1.0
  142.      */
  143.     var $hasdst;
  144.  
  145.     /**
  146.      * Additional offset of Summer time from the standard time of the
  147.      * time zone in milli-seconds
  148.      *
  149.      * The value is usually 3600000, i.e. one hour, and always positive
  150.      *
  151.      * @var      int 
  152.      * @access   private
  153.      * @since    Property available since Release 1.5.0
  154.      */
  155.     var $on_summertimeoffset;
  156.  
  157.     /**
  158.      * Month no (1-12) in which Summer time starts (the clocks go forward)
  159.      *
  160.      * @var      int 
  161.      * @access   private
  162.      * @since    Property available since Release 1.5.0
  163.      */
  164.     var $on_summertimestartmonth;
  165.  
  166.     /**
  167.      * Definition of when Summer time starts in the specified month
  168.      *
  169.      * Can take one of the following forms:
  170.      *
  171.      *  5        the fifth of the month
  172.      *  lastSun  the last Sunday in the month
  173.      *  lastMon  the last Monday in the month
  174.      *  Sun>=8   first Sunday on or after the 8th
  175.      *  Sun<=25  last Sunday on or before the 25th
  176.      *
  177.      * @var      string 
  178.      * @access   private
  179.      * @since    Property available since Release 1.5.0
  180.      */
  181.     var $os_summertimestartday;
  182.  
  183.     /**
  184.      * Time in milli-seconds relative to midnight UTC when
  185.      * Summer time starts (the clocks go forward)
  186.      *
  187.      * @var      int 
  188.      * @access   private
  189.      * @since    Property available since Release 1.5.0
  190.      */
  191.     var $on_summertimestarttime;
  192.  
  193.     /**
  194.      * Month no (1-12) in which Summer time ends (the clocks go back)
  195.      *
  196.      * @var      int 
  197.      * @access   private
  198.      * @since    Property available since Release 1.5.0
  199.      */
  200.     var $on_summertimeendmonth;
  201.  
  202.     /**
  203.      * Definition of when Summer time ends in the specified month
  204.      *
  205.      * @var      string 
  206.      * @access   private
  207.      * @see      Date_TimeZone::$os_summertimestartday
  208.      * @since    Property available since Release 1.5.0
  209.      */
  210.     var $os_summertimeendday;
  211.  
  212.     /**
  213.      * Time in milli-seconds relative to midnight UTC when
  214.      * Summer time ends (the clocks go back)
  215.      *
  216.      * @var      int 
  217.      * @access   private
  218.      * @since    Property available since Release 1.5.0
  219.      */
  220.     var $on_summertimeendtime;
  221.  
  222.  
  223.     // }}}
  224.     // {{{ Constructor
  225.  
  226.     /**
  227.      * Constructor
  228.      *
  229.      * Creates a new Date::TimeZone object, representing the time zone
  230.      * specified in $id.
  231.      *
  232.      * If the supplied ID is invalid, the created time zone is "UTC".
  233.      *
  234.      * A note about time zones of the form 'Etc/*' (quoted from the public
  235.      * domain 'tz' data-base (see ftp://elsie.nci.nih.gov/pub/tzdata2007i.tar.gz
  236.      * [file 'etcetera']):
  237.      *
  238.      *  These entries are mostly present for historical reasons, so that
  239.      *  people in areas not otherwise covered by the tz files could use
  240.      *  a time zone that was right for their area.  These days, the
  241.      *  tz files cover almost all the inhabited world, and the only practical
  242.      *  need now for the entries that are not on UTC are for ships at sea
  243.      *  that cannot use POSIX TZ settings.
  244.      *
  245.      *   Etc/GMT  (GMT)
  246.      *   Etc/UTC  (UTC)
  247.      *   Etc/UCT  (UCT)
  248.      *
  249.      *  The following link uses older naming conventions, but it belongs here.
  250.      *  We want this to work even on installations that omit the other older
  251.      *  names.
  252.      *
  253.      *   Etc/GMT  (equivalent to GMT)
  254.      *
  255.      *   Etc/UTC  (equivalent to Etc/Universal)
  256.      *   Etc/UTC  (equivalent to Etc/Zulu)
  257.      *
  258.      *   Etc/GMT  (equivalent to Etc/Greenwich)
  259.      *   Etc/GMT  (equivalent to Etc/GMT-0)
  260.      *   Etc/GMT  (equivalent to Etc/GMT+0)
  261.      *   Etc/GMT  (equivalent to Etc/GMT0)
  262.      *
  263.      *  We use POSIX-style signs in the Zone names and the output abbreviations,
  264.      *  even though this is the opposite of what many people expect.
  265.      *  POSIX has positive signs west of Greenwich, but many people expect
  266.      *  positive signs east of Greenwich.  For example, TZ='Etc/GMT+4' uses
  267.      *  the abbreviation "GMT+4" and corresponds to 4 hours behind UTC
  268.      *  (i.e. west of Greenwich) even though many people would expect it to
  269.      *  mean 4 hours ahead of UTC (i.e. east of Greenwich).
  270.      *
  271.      *  In the draft 5 of POSIX 1003.1-200x, the angle bracket notation
  272.      *  (which is not yet supported by the tz code) allows for
  273.      *  TZ='<GMT-4>+4'; if you want time zone abbreviations conforming to
  274.      *  ISO 8601 you can use TZ='<-0400>+4'.  Thus the commonly-expected
  275.      *  offset is kept within the angle bracket (and is used for display)
  276.      *  while the POSIX sign is kept outside the angle bracket (and is used
  277.      *  for calculation).
  278.      *
  279.      *  Do not use a TZ setting like TZ='GMT+4', which is four hours behind
  280.      *  GMT but uses the completely misleading abbreviation "GMT".
  281.      *
  282.      *  Earlier incarnations of this package were not POSIX-compliant, and
  283.      *  we did not want things to change quietly if someone accustomed to the
  284.      *  old way uses the codes from previous versions so we moved the names
  285.      *  into the Etc subdirectory.
  286.      *
  287.      *   Etc/GMT-14  (14 hours ahead of Greenwich)
  288.      *   Etc/GMT-13  (13)
  289.      *   Etc/GMT-12  (12)
  290.      *   Etc/GMT-11  (11)
  291.      *   Etc/GMT-10  (10)
  292.      *   Etc/GMT-9   (9)
  293.      *   Etc/GMT-8   (8)
  294.      *   Etc/GMT-7   (7)
  295.      *   Etc/GMT-6   (6)
  296.      *   Etc/GMT-5   (5)
  297.      *   Etc/GMT-4   (4)
  298.      *   Etc/GMT-3   (3)
  299.      *   Etc/GMT-2   (2)
  300.      *   Etc/GMT-1   (1)
  301.      *   Etc/GMT+1   (1 hour behind Greenwich)
  302.      *   Etc/GMT+2   (2)
  303.      *   Etc/GMT+3   (3)
  304.      *   Etc/GMT+4   (4)
  305.      *   Etc/GMT+5   (5)
  306.      *   Etc/GMT+6   (6)
  307.      *   Etc/GMT+7   (7)
  308.      *   Etc/GMT+8   (8)
  309.      *   Etc/GMT+9   (9)
  310.      *   Etc/GMT+10  (10)
  311.      *   Etc/GMT+11  (11)
  312.      *   Etc/GMT+12  (12)
  313.      *
  314.      * @param string $ps_id the time zone ID
  315.      *
  316.      * @return   void 
  317.      * @access   public
  318.      * @see      Date::setTZByID(), Date_TimeZone::isValidID()
  319.      */
  320.     function Date_TimeZone($ps_id)
  321.     {
  322.         $_DATE_TIMEZONE_DATA =$GLOBALS['_DATE_TIMEZONE_DATA'];
  323.  
  324.         if (isset($GLOBALS['_DATE_TIMEZONE_DATA'][$ps_id])) {
  325.             $this->id $ps_id;
  326.  
  327.             $this->shortname    $_DATE_TIMEZONE_DATA[$ps_id]['shortname'];
  328.             $this->longname     $_DATE_TIMEZONE_DATA[$ps_id]['longname'];
  329.             $this->offset       $_DATE_TIMEZONE_DATA[$ps_id]['offset'];
  330.             $this->dstshortname 
  331.                 array_key_exists("dstshortname",
  332.                                  $_DATE_TIMEZONE_DATA[$ps_id]?
  333.                 $_DATE_TIMEZONE_DATA[$ps_id]['dstshortname':
  334.                 null;
  335.             if ($this->hasdst !is_null($this->dstshortname)) {
  336.                 $this->dstlongname =
  337.                     array_key_exists("dstlongname",
  338.                                      $_DATE_TIMEZONE_DATA[$ps_id]?
  339.                     $_DATE_TIMEZONE_DATA[$ps_id]['dstlongname':
  340.                     null;
  341.                 if (isset($_DATE_TIMEZONE_DATA[$ps_id]["summertimeoffset"])) {
  342.                     $this->on_summertimeoffset     $_DATE_TIMEZONE_DATA[$ps_id]["summertimeoffset"];
  343.                     $this->on_summertimestartmonth $_DATE_TIMEZONE_DATA[$ps_id]["summertimestartmonth"];
  344.                     $this->os_summertimestartday   $_DATE_TIMEZONE_DATA[$ps_id]["summertimestartday"];
  345.                     $this->on_summertimestarttime  $_DATE_TIMEZONE_DATA[$ps_id]["summertimestarttime"];
  346.                     $this->on_summertimeendmonth   $_DATE_TIMEZONE_DATA[$ps_id]["summertimeendmonth"];
  347.                     $this->os_summertimeendday     $_DATE_TIMEZONE_DATA[$ps_id]["summertimeendday"];
  348.                     $this->on_summertimeendtime    $_DATE_TIMEZONE_DATA[$ps_id]["summertimeendtime"];
  349.                 else {
  350.                     $this->on_summertimeoffset = null;
  351.                 }
  352.             }
  353.         else {
  354.             $this->hasdst = false;
  355.  
  356.             if (preg_match('/^UTC([+\-])([0-9]{2,2}):?([0-5][0-9])$/',
  357.                            $ps_id,
  358.                            $ha_matches)) {
  359.                 $this->id     $ps_id;
  360.                 $this->offset ($ha_matches[1.
  361.                                  ($ha_matches[2* 3600 +
  362.                                   $ha_matches[3* 60)) * 1000;
  363.  
  364.                 if (!($hb_isutc $this->offset == 0)) {
  365.                     $this->id        $ps_id;
  366.                     $this->shortname "UTC" .
  367.                                        $ha_matches[1.
  368.                                        ($ha_matches[3== "00" ?
  369.                                         ltrim($ha_matches[2]"0":
  370.                                         $ha_matches[2$ha_matches[3]);
  371.                     $this->longname  "UTC" .
  372.                                        $ha_matches[1.
  373.                                        $ha_matches[2.
  374.                                        ":" .
  375.                                        $ha_matches[3];
  376.                 }
  377.             else if (preg_match('/^UTC([+\-])([0-9]{1,2})$/',
  378.                                   $ps_id,
  379.                                   $ha_matches)) {
  380.                 $this->id     $ps_id;
  381.                 $this->offset ($ha_matches[1.
  382.                                  ($ha_matches[2* 3600)) * 1000;
  383.  
  384.                 if (!($hb_isutc $this->offset == 0)) {
  385.                     $this->shortname "UTC" .
  386.                                        $ha_matches[1.
  387.                                        ltrim($ha_matches[2]"0");
  388.                     $this->longname  "UTC" .
  389.                                        $ha_matches[1.
  390.                                        sprintf("%02d"$ha_matches[2].
  391.                                        ":00";
  392.                 }
  393.             else {
  394.                 $this->id "UTC";
  395.                 $hb_isutc = true;
  396.             }
  397.  
  398.             if ($hb_isutc{
  399.                 $this->shortname $_DATE_TIMEZONE_DATA["UTC"]['shortname'];
  400.                 $this->longname  $_DATE_TIMEZONE_DATA["UTC"]['longname'];
  401.                 $this->offset    $_DATE_TIMEZONE_DATA["UTC"]['offset'];
  402.             }
  403.         }
  404.     }
  405.  
  406.  
  407.     // }}}
  408.     // {{{ getDefault()
  409.  
  410.     /**
  411.      * Returns a TimeZone object representing the system default time zone
  412.      *
  413.      * The system default time zone is initialized during the loading of
  414.      * this file.
  415.      *
  416.      * @return   object     Date_TimeZone object of the default time zone
  417.      * @access   public
  418.      */
  419.     function getDefault()
  420.     {
  421.         return new Date_TimeZone($GLOBALS['_DATE_TIMEZONE_DEFAULT']);
  422.     }
  423.  
  424.  
  425.     // }}}
  426.     // {{{ setDefault()
  427.  
  428.     /**
  429.      * Sets the system default time zone to the time zone in $id
  430.      *
  431.      * @param string $id the time zone id to use
  432.      *
  433.      * @return   void 
  434.      * @access   public
  435.      */
  436.     function setDefault($id)
  437.     {
  438.         if (Date_TimeZone::isValidID($id)) {
  439.             $GLOBALS['_DATE_TIMEZONE_DEFAULT'$id;
  440.         else {
  441.             return PEAR::raiseError("Invalid time zone ID '$id'");
  442.         }
  443.     }
  444.  
  445.  
  446.     // }}}
  447.     // {{{ isValidID()
  448.  
  449.     /**
  450.      * Tests if given time zone ID (e.g. 'London/Europe') is valid and unique
  451.      *
  452.      * Checks if given ID is either represented in the $_DATE_TIMEZONE_DATA
  453.      * time zone data, or is a UTC offset in one of the following forms,
  454.      * i.e. an offset with no geographical or political base:
  455.      *
  456.      *  UTC[+/-][hh]:[mm] - e.g. UTC+03:00
  457.      *  UTC[+/-][hh][mm]  - e.g. UTC-0530
  458.      *  UTC[+/-][hh]      - e.g. UTC+03
  459.      *  UTC[+/-][h]       - e.g. UTC-1     (the last is not ISO 8601
  460.      *                                     standard but is the preferred
  461.      *                                     form)
  462.      *
  463.      * N.B. these are not sanctioned by any ISO standard, but the form of
  464.      * the offset itself, i.e. the part after the characters 'UTC', is the
  465.      * ISO 8601 standard form for representing this part.
  466.      *
  467.      * The form '[+/-][h]' is not ISO conformant, but ISO 8601 only
  468.      * defines the form of the time zone offset of a particular time, that
  469.      * is, it actually defines the form '<time>UTC[+/-][hh]', and its
  470.      * purview does not apparently cover the name of the time zone itself.
  471.      * For this there is no official international standard (or even a non-
  472.      * international standard).  The closest thing to a sanctioning body
  473.      * is the 'tz' database (http://www.twinsun.com/tz/tz-link.htm) which
  474.      * is run by volunteers but which is heavily relied upon by various
  475.      * programming languages and the internet community.  However they
  476.      * mainly define geographical/political time zone names of the
  477.      * form 'London/Europe' because their main aim is to collate the time
  478.      * zone definitions which are set by individual countries/states, not
  479.      * to prescribe any standard.
  480.      *
  481.      * However it seems that the de facto standard to describe time zones
  482.      * as non-geographically/politically-based areas where the local time
  483.      * on all clocks reads the same seems to be the form 'UTC[+/-][h]'
  484.      * for integral numbers of hours, and 'UTC[+/-][hh]:[mm]' otherwise.
  485.      * (See http://en.wikipedia.org/wiki/List_of_time_zones)
  486.      *
  487.      * N.B. 'GMT' is also commonly used instead of 'UTC', but 'UTC' seems
  488.      * to be technically preferred.  GMT-based IDs still exist in the 'tz
  489.      * data-base', but beware of POSIX-style offsets which are the opposite
  490.      * way round to what people normally expect.
  491.      *
  492.      * @param string $ps_id the time zone ID to test
  493.      *
  494.      * @return   bool       true if the supplied ID is valid
  495.      * @access   public
  496.      * @see      Date::setTZByID(), Date_TimeZone::Date_TimeZone()
  497.      */
  498.     function isValidID($ps_id)
  499.     {
  500.         if (isset($GLOBALS['_DATE_TIMEZONE_DATA'][$ps_id])) {
  501.             return true;
  502.         else if (preg_match('/^UTC[+\-]([0-9]{2,2}:?[0-5][0-9]|[0-9]{1,2})$/',
  503.                    $ps_id)) {
  504.             return true;
  505.         else {
  506.             return false;
  507.         }
  508.     }
  509.  
  510.  
  511.     // }}}
  512.     // {{{ isEqual()
  513.  
  514.     /**
  515.      * Is this time zone equal to another
  516.      *
  517.      * Tests to see if this time zone is equal (ids match)
  518.      * to a given Date_TimeZone object.
  519.      *
  520.      * @param object $tz the Date_TimeZone object to test
  521.      *
  522.      * @return   bool       true if this time zone is equal to the supplied
  523.      *                        time zone
  524.      * @access   public
  525.      */
  526.     function isEqual($tz)
  527.     {
  528.         if (strcasecmp($this->id$tz->id== 0{
  529.             return true;
  530.         else {
  531.             return false;
  532.         }
  533.     }
  534.  
  535.  
  536.     // }}}
  537.     // {{{ isEquivalent()
  538.  
  539.     /**
  540.      * Is this time zone equivalent to another
  541.      *
  542.      * Tests to see if this time zone is equivalent to a given time zone object.
  543.      * Equivalence in this context consists in the two time zones having:
  544.      *
  545.      *  an equal offset from UTC in both standard and Summer time (if
  546.      *   the time zones observe Summer time)
  547.      *  the same Summer time start and end rules, that is, the two time zones
  548.      *   must switch from standard time to Summer time, and vice versa, on the
  549.      *   same day and at the same time
  550.      *
  551.      * @param object $pm_tz the Date_TimeZone object to test, or a valid time
  552.      *                        zone ID
  553.      *
  554.      * @return   bool       true if this time zone is equivalent to the supplied
  555.      *                        time zone
  556.      * @access   public
  557.      */
  558.     function isEquivalent($pm_tz)
  559.     {
  560.         if (is_a($pm_tz"Date_TimeZone")) {
  561.             if ($pm_tz->getID(== $this->id{
  562.                 return true;
  563.             }
  564.         else {
  565.             if (!Date_TimeZone::isValidID($pm_tz)) {
  566.                 return PEAR::raiseError("Invalid time zone ID '$pm_tz'",
  567.                                         DATE_ERROR_INVALIDTIMEZONE);
  568.             }
  569.             if ($pm_tz == $this->id)
  570.                 return true;
  571.  
  572.             $pm_tz = new Date_TimeZone($pm_tz);
  573.         }
  574.  
  575.         if ($this->getRawOffset(== $pm_tz->getRawOffset(&&
  576.             $this->hasDaylightTime(== $pm_tz->hasDaylightTime(&&
  577.             $this->getDSTSavings(== $pm_tz->getDSTSavings(&&
  578.             $this->getSummerTimeStartMonth(== $pm_tz->getSummerTimeStartMonth(&&
  579.             $this->getSummerTimeStartDay(== $pm_tz->getSummerTimeStartDay(&&
  580.             $this->getSummerTimeStartTime(== $pm_tz->getSummerTimeStartTime(&&
  581.             $this->getSummerTimeEndMonth(== $pm_tz->getSummerTimeEndMonth(&&
  582.             $this->getSummerTimeEndDay(== $pm_tz->getSummerTimeEndDay(&&
  583.             $this->getSummerTimeEndTime(== $pm_tz->getSummerTimeEndTime()
  584.             {
  585.             return true;
  586.         else {
  587.             return false;
  588.         }
  589.     }
  590.  
  591.  
  592.     // }}}
  593.     // {{{ hasDaylightTime()
  594.  
  595.     /**
  596.      * Returns true if this zone observes daylight savings time
  597.      *
  598.      * @return   bool       true if this time zone has DST
  599.      * @access   public
  600.      */
  601.     function hasDaylightTime()
  602.     {
  603.         return $this->hasdst;
  604.     }
  605.  
  606.  
  607.     // }}}
  608.     // {{{ getSummerTimeLimitDay()
  609.  
  610.     /**
  611.      * Returns day on which Summer time starts or ends for given year
  612.      *
  613.      * The limit (start or end) code can take the following forms:
  614.      *  5                 the fifth of the month
  615.      *  lastSun           the last Sunday in the month
  616.      *  lastMon           the last Monday in the month
  617.      *  Sun>=8            first Sunday on or after the 8th
  618.      *  Sun<=25           last Sunday on or before the 25th
  619.      *
  620.      * @param string $ps_summertimelimitcode code which specifies Summer time
  621.      *                                         limit day
  622.      * @param int    $pn_month               start or end month
  623.      * @param int    $pn_year                year for which to calculate Summer
  624.      *                                         time limit day
  625.      *
  626.      * @return   int 
  627.      * @access   private
  628.      * @since    Method available since Release 1.5.0
  629.      */
  630.     function getSummerTimeLimitDay($ps_summertimelimitcode$pn_month$pn_year)
  631.     {
  632.         if (preg_match('/^[0-9]+$/'$ps_summertimelimitcode)) {
  633.             $hn_day $ps_summertimelimitcode;
  634.         else {
  635.             if (!isset($ha_daysofweek))
  636.                 static $ha_daysofweek = array("Sun" => 0,
  637.                                               "Mon" => 1,
  638.                                               "Tue" => 2,
  639.                                               "Wed" => 3,
  640.                                               "Thu" => 4,
  641.                                               "Fri" => 5,
  642.                                               "Sat" => 6);
  643.  
  644.             if (preg_match('/^last(Sun|Mon|Tue|Wed|Thu|Fri|Sat)$/',
  645.                            $ps_summertimelimitcode,
  646.                            $ha_matches)) {
  647.                 list($hn_nmyear$hn_nextmonth$hn_nmday=
  648.                     explode(" "Date_Calc::beginOfMonthBySpan(1,
  649.                                                                $pn_month,
  650.                                                                $pn_year,
  651.                                                                "%Y %m %d"));
  652.                 list($hn_year$hn_month$hn_day=
  653.                     explode(" ",
  654.                             Date_Calc::prevDayOfWeek($ha_daysofweek[$ha_matches[1]],
  655.                                                      $hn_nmday,
  656.                                                      $hn_nextmonth
  657.                                                      $hn_nmyear,
  658.                                                      "%Y %m %d",
  659.                                                      false))// not including
  660.                                                               // this day
  661.  
  662.                 if ($hn_month != $pn_month{
  663.                     // This code happen legitimately if the calendar jumped some days
  664.                     // e.g. in a calendar switch, or the limit day is badly defined:
  665.                     //
  666.                     $hn_day Date_Calc::getFirstDayOfMonth($pn_month$pn_year);
  667.                 }
  668.             else if (preg_match('/^(Sun|Mon|Tue|Wed|Thu|Fri|Sat)([><]=)([0-9]+)$/',
  669.                                   $ps_summertimelimitcode,
  670.                                   $ha_matches)) {
  671.                 if ($ha_matches[2== "<="{
  672.                     list($hn_year$hn_month$hn_day=
  673.                         explode(" ",
  674.                                 Date_Calc::prevDayOfWeek($ha_daysofweek[$ha_matches[1]],
  675.                                                          $ha_matches[3],
  676.                                                          $pn_month,
  677.                                                          $pn_year,
  678.                                                          "%Y %m %d",
  679.                                                          true))// including
  680.                                                                  // this day
  681.  
  682.                     if ($hn_month != $pn_month{
  683.                         $hn_day Date_Calc::getFirstDayOfMonth($pn_month$pn_year);
  684.                     }
  685.                 else {
  686.                     list($hn_year$hn_month$hn_day=
  687.                         explode(" ",
  688.                                 Date_Calc::nextDayOfWeek($ha_daysofweek[$ha_matches[1]],
  689.                                                          $ha_matches[3],
  690.                                                          $pn_month,
  691.                                                          $pn_year,
  692.                                                          "%Y %m %d",
  693.                                                          true))// including
  694.                                                                  // this day
  695.  
  696.                     if ($hn_month != $pn_month{
  697.                         $hn_day Date_Calc::daysInMonth($pn_month$pn_year);
  698.                     }
  699.                 }
  700.             }
  701.         }
  702.  
  703.         return $hn_day;
  704.     }
  705.  
  706.  
  707.     // }}}
  708.     // {{{ inDaylightTime()
  709.  
  710.     /**
  711.      * Is the given date/time in DST for this time zone
  712.      *
  713.      * Works for all years, positive and negative.  Possible problems
  714.      * are that when the clocks go forward, there is an invalid hour
  715.      * which is skipped.  If a time in this hour is specified, this
  716.      * function returns an error.  When the clocks go back, there is an
  717.      * hour which is repeated, that is, the hour is gone through twice -
  718.      * once in Summer time and once in standard time.  If this time
  719.      * is specified, then this function returns '$pb_repeatedhourdefault',
  720.      * because there is no way of knowing which is correct, and
  721.      * both possibilities are equally likely.
  722.      *
  723.      * Also bear in mind that the clocks go forward at the instant of
  724.      * the hour specified in the time-zone array below, and if this
  725.      * exact hour is specified then the clocks have actually changed,
  726.      * and this function reflects this.
  727.      *
  728.      * @param object $pm_date                Date object to test or array of
  729.      *                                         day, month, year, seconds past
  730.      *                                         midnight
  731.      * @param bool   $pb_repeatedhourdefault value to return if repeated hour is
  732.      *                                         specified (defaults to false)
  733.      *
  734.      * @return   bool       true if this date is in Summer time for this time
  735.      *                        zone
  736.      * @access   public
  737.      */
  738.     function inDaylightTime($pm_date$pb_repeatedhourdefault = false)
  739.     {
  740.         if (!$this->hasdst{
  741.             return false;
  742.         }
  743.  
  744.         if (is_a($pm_date"Date")) {
  745.             $hn_day     $pm_date->getDay();
  746.             $hn_month   $pm_date->getMonth();
  747.             $hn_year    $pm_date->getYear();
  748.             $hn_seconds $pm_date->getSecondsPastMidnight();
  749.         else {
  750.             $hn_day     $pm_date[0];
  751.             $hn_month   $pm_date[1];
  752.             $hn_year    $pm_date[2];
  753.             $hn_seconds $pm_date[3];  // seconds past midnight
  754.         }
  755.  
  756.         if (($this->on_summertimestartmonth < $this->on_summertimeendmonth &&
  757.              $hn_month >= $this->on_summertimestartmonth &&
  758.              $hn_month <= $this->on_summertimeendmonth||
  759.             ($this->on_summertimestartmonth > $this->on_summertimeendmonth &&
  760.              $hn_month >= $this->on_summertimestartmonth &&
  761.              $hn_month <= $this->on_summertimeendmonth)
  762.             {
  763.  
  764.             if ($hn_month == $this->on_summertimestartmonth{
  765.                 $hn_startday =
  766.                     $this->getSummerTimeLimitDay($this->os_summertimestartday,
  767.                                                  $this->on_summertimestartmonth,
  768.                                                  $hn_year);
  769.  
  770.                 if ($hn_day $hn_startday{
  771.                     return false;
  772.                 else if ($hn_day $hn_startday{
  773.                     return true;
  774.                 else if (($hn_gmt $hn_seconds * 1000 - $this->offset-
  775.                            $this->on_summertimeoffset >=
  776.                            $this->on_summertimestarttime{
  777.                     return true;
  778.                 else if (($hn_gmt $hn_seconds * 1000 - $this->offset>=
  779.                            $this->on_summertimestarttime{
  780.                     return PEAR::raiseError("Invalid time specified for date '" .
  781.                                             Date_Calc::dateFormat($hn_day,
  782.                                                                   $hn_month,
  783.                                                                   $hn_year,
  784.                                                                   "%Y-%m-%d".
  785.                                             "'",
  786.                                             DATE_ERROR_INVALIDTIME);
  787.                 else {
  788.                     return false;
  789.                 }
  790.             else if ($hn_month == $this->on_summertimeendmonth{
  791.                 $hn_endday =
  792.                     $this->getSummerTimeLimitDay($this->os_summertimeendday,
  793.                                                  $this->on_summertimeendmonth,
  794.                                                  $hn_year);
  795.  
  796.                 if ($hn_day $hn_endday{
  797.                     return true;
  798.                 else if ($hn_day $hn_endday{
  799.                     return false;
  800.                 else if (($hn_gmt $hn_seconds * 1000 - $this->offset-
  801.                            $this->on_summertimeoffset >=
  802.                            $this->on_summertimeendtime{
  803.                     return false;
  804.                 else if ($hn_gmt >= $this->on_summertimeendtime{
  805.                     // There is a 50:50 chance that it's Summer time, but there
  806.                     // is no way of knowing (the hour is repeated), so return
  807.                     // default:
  808.                     //
  809.                     return $pb_repeatedhourdefault;
  810.                 else {
  811.                     return true;
  812.                 }
  813.             }
  814.  
  815.             return true;
  816.         }
  817.  
  818.         return false;
  819.     }
  820.  
  821.  
  822.     // }}}
  823.     // {{{ inDaylightTimeStandard()
  824.  
  825.     /**
  826.      * Returns whether the given date/time in local standard time is
  827.      * in Summer time
  828.      *
  829.      * For example, if the clocks go forward at 1.00 standard time,
  830.      * then if the specified date/time is at 1.00, the function will
  831.      * return true, although the correct local time will actually
  832.      * be 2.00.
  833.      *
  834.      * This function is reliable for all dates and times, unlike the
  835.      * related function 'inDaylightTime()', which will fail if passed
  836.      * an invalid time (the skipped hour) and will be wrong half the
  837.      * time if passed an ambiguous time (the repeated hour).
  838.      *
  839.      * @param object $pm_date Date object to test or array of day, month, year,
  840.      *                          seconds past midnight
  841.      *
  842.      * @return   bool       true if this date is in Summer time for this time
  843.      *                        zone
  844.      * @access   public
  845.      * @since    Method available since Release 1.5.0
  846.      */
  847.     function inDaylightTimeStandard($pm_date)
  848.     {
  849.         if (!$this->hasdst{
  850.             return false;
  851.         }
  852.  
  853.         if (is_a($pm_date"Date")) {
  854.             $hn_day     $pm_date->getDay();
  855.             $hn_month   $pm_date->getMonth();
  856.             $hn_year    $pm_date->getYear();
  857.             $hn_seconds $pm_date->getSecondsPastMidnight();
  858.         else {
  859.             $hn_day     $pm_date[0];
  860.             $hn_month   $pm_date[1];
  861.             $hn_year    $pm_date[2];
  862.             $hn_seconds $pm_date[3];
  863.         }
  864.  
  865.         if (($this->on_summertimestartmonth < $this->on_summertimeendmonth &&
  866.              $hn_month >= $this->on_summertimestartmonth &&
  867.              $hn_month <= $this->on_summertimeendmonth||
  868.             ($this->on_summertimestartmonth > $this->on_summertimeendmonth &&
  869.              $hn_month >= $this->on_summertimestartmonth &&
  870.              $hn_month <= $this->on_summertimeendmonth)
  871.             {
  872.  
  873.             if ($hn_month == $this->on_summertimestartmonth{
  874.                 $hn_startday =
  875.                     $this->getSummerTimeLimitDay($this->os_summertimestartday,
  876.                                                  $this->on_summertimestartmonth,
  877.                                                  $hn_year);
  878.  
  879.                 if ($hn_day $hn_startday{
  880.                     return false;
  881.                 else if ($hn_day $hn_startday{
  882.                     return true;
  883.                 else if ($hn_seconds * 1000 - $this->offset >=
  884.                            $this->on_summertimestarttime{
  885.                     return true;
  886.                 else {
  887.                     return false;
  888.                 }
  889.             else if ($hn_month == $this->on_summertimeendmonth{
  890.                 $hn_endday =
  891.                     $this->getSummerTimeLimitDay($this->os_summertimeendday,
  892.                                                  $this->on_summertimeendmonth,
  893.                                                  $hn_year);
  894.  
  895.                 if ($hn_day $hn_endday{
  896.                     return true;
  897.                 else if ($hn_day $hn_endday{
  898.                     return false;
  899.                 else if ($hn_seconds * 1000 - $this->offset >=
  900.                            $this->on_summertimeendtime{
  901.                     return false;
  902.                 else {
  903.                     return true;
  904.                 }
  905.             }
  906.  
  907.             return true;
  908.         }
  909.  
  910.         return false;
  911.     }
  912.  
  913.  
  914.     // }}}
  915.     // {{{ getDSTSavings()
  916.  
  917.     /**
  918.      * Get the DST offset for this time zone
  919.      *
  920.      * Returns the DST offset of this time zone, in milliseconds,
  921.      * if the zone observes DST, zero otherwise.  Currently the
  922.      * DST offset is hard-coded to one hour.
  923.      *
  924.      * @return   int        the DST offset, in milliseconds or nought if the
  925.      *                        zone does not observe DST
  926.      * @access   public
  927.      */
  928.     function getDSTSavings()
  929.     {
  930.         if ($this->hasdst{
  931.             // If offset is not specified, guess one hour.  (This is almost
  932.             // always correct anyway).  This cannot be improved upon, because
  933.             // where it is unset, the offset is either unknowable because the
  934.             // time-zone covers more than one political area (which may have
  935.             // different Summer time policies), or they might all have the
  936.             // same policy, but there is no way to automatically maintain
  937.             // this data at the moment, and manually it is simply not worth
  938.             // the bother.  If a user wants this functionality and refuses
  939.             // to use the standard time-zone IDs, then he can always update
  940.             // the array himself.
  941.             //
  942.             return isset($this->on_summertimeoffset?
  943.                          $this->on_summertimeoffset :
  944.                          3600000;
  945.         else {
  946.             return 0;
  947.         }
  948.     }
  949.  
  950.  
  951.     // }}}
  952.     // {{{ getRawOffset()
  953.  
  954.     /**
  955.      * Returns the raw (non-DST-corrected) offset from UTC/GMT for this time
  956.      * zone
  957.      *
  958.      * @return   int        the offset, in milliseconds
  959.      * @access   public
  960.      */
  961.     function getRawOffset()
  962.     {
  963.         return $this->offset;
  964.     }
  965.  
  966.  
  967.     // }}}
  968.     // {{{ getOffset()
  969.  
  970.     /**
  971.      * Returns the DST-corrected offset from UTC for the given date
  972.      *
  973.      * Gets the offset to UTC for a given date/time, taking into
  974.      * account daylight savings time, if the time zone observes it and if
  975.      * it is in effect.
  976.      *
  977.      * N.B. that the offset is calculated historically
  978.      * and in the future according to the current Summer time rules,
  979.      * and so this function is proleptically correct, but not necessarily
  980.      * historically correct.  (Although if you want to be correct about
  981.      * times in the distant past, this class is probably not for you
  982.      * because the whole notion of time zones does not apply, and
  983.      * historically there are so many time zone changes, Summer time
  984.      * rule changes, name changes, calendar changes, that calculating
  985.      * this sort of information is beyond the scope of this package
  986.      * altogether.)
  987.      *
  988.      * @param mixed $pm_insummertime a boolean specifying whether or not the
  989.      *                                 date is in Summer time, or,
  990.      *                                a Date object to test for this condition
  991.      *
  992.      * @return   int        the corrected offset to UTC in milliseconds
  993.      * @access   public
  994.      */
  995.     function getOffset($pm_insummertime)
  996.     {
  997.         if ($this->hasdst{
  998.             if (is_a($pm_insummertime"Date")) {
  999.                 $hb_insummertime $pm_insummertime->inDaylightTime();
  1000.                 if (PEAR::isError($hb_insummertime))
  1001.                     return $hb_insummertime;
  1002.             else {
  1003.                 $hb_insummertime $pm_insummertime;
  1004.             }
  1005.  
  1006.             if ($hb_insummertime{
  1007.                 return $this->offset + $this->getDSTSavings();
  1008.             }
  1009.         }
  1010.  
  1011.         return $this->offset;
  1012.     }
  1013.  
  1014.  
  1015.     // }}}
  1016.     // {{{ getAvailableIDs()
  1017.  
  1018.     /**
  1019.      * Returns the list of valid time zone id strings
  1020.      *
  1021.      * @return   array      an array of strings with the valid time zone IDs
  1022.      * @access   public
  1023.      */
  1024.     function getAvailableIDs()
  1025.     {
  1026.         return array_keys($GLOBALS['_DATE_TIMEZONE_DATA']);
  1027.     }
  1028.  
  1029.  
  1030.     // }}}
  1031.     // {{{ getID()
  1032.  
  1033.     /**
  1034.      * Returns the time zone id for this time zone, i.e. "America/Chicago"
  1035.      *
  1036.      * @return   string     the time zone ID
  1037.      * @access   public
  1038.      */
  1039.     function getID()
  1040.     {
  1041.         return $this->id;
  1042.     }
  1043.  
  1044.  
  1045.     // }}}
  1046.     // {{{ getLongName()
  1047.  
  1048.     /**
  1049.      * Returns the long name for this time zone
  1050.      *
  1051.      * Long form of time zone name, e.g. 'Greenwich Mean Time'. Additionally
  1052.      * a Date object can be passed in which case the Summer time name will
  1053.      * be returned instead if the date falls in Summer time, e.g. 'British
  1054.      * Summer Time'.
  1055.      *
  1056.      * N.B. this is not a unique identifier - for this purpose use the
  1057.      * time zone ID.
  1058.      *
  1059.      * @param mixed $pm_insummertime a boolean specifying whether or not the
  1060.      *                                 date is in Summer time, or,
  1061.      *                                a Date object to test for this condition
  1062.      *
  1063.      * @return   string     the long name
  1064.      * @access   public
  1065.      */
  1066.     function getLongName($pm_insummertime = false)
  1067.     {
  1068.         if ($this->hasdst{
  1069.             if (is_a($pm_insummertime"Date")) {
  1070.                 $hb_insummertime $pm_insummertime->inDaylightTime();
  1071.                 if (PEAR::isError($hb_insummertime))
  1072.                     return $hb_insummertime;
  1073.             else {
  1074.                 $hb_insummertime $pm_insummertime;
  1075.             }
  1076.  
  1077.             if ($hb_insummertime{
  1078.                 return $this->dstlongname;
  1079.             }
  1080.         }
  1081.  
  1082.         return $this->longname;
  1083.     }
  1084.  
  1085.  
  1086.     // }}}
  1087.     // {{{ getShortName()
  1088.  
  1089.     /**
  1090.      * Returns the short name for this time zone
  1091.      *
  1092.      * Returns abbreviated form of time zone name, e.g. 'GMT'. Additionally
  1093.      * a Date object can be passed in which case the Summer time name will
  1094.      * be returned instead if the date falls in Summer time, e.g. 'BST'.
  1095.      *
  1096.      * N.B. this is not a unique identifier - for this purpose use the
  1097.      * time zone ID.
  1098.      *
  1099.      * @param mixed $pm_insummertime a boolean specifying whether or not the
  1100.      *                                 date is in Summer time, or,
  1101.      *                                a Date object to test for this condition
  1102.      *
  1103.      * @return   string     the short name
  1104.      * @access   public
  1105.      */
  1106.     function getShortName($pm_insummertime = false)
  1107.     {
  1108.         if ($this->hasdst{
  1109.             if (is_a($pm_insummertime"Date")) {
  1110.                 $hb_insummertime $pm_insummertime->inDaylightTime();
  1111.                 if (PEAR::isError($hb_insummertime))
  1112.                     return $hb_insummertime;
  1113.             else {
  1114.                 $hb_insummertime $pm_insummertime;
  1115.             }
  1116.  
  1117.             if ($hb_insummertime{
  1118.                 return $this->dstshortname;
  1119.             }
  1120.         }
  1121.  
  1122.         return $this->shortname;
  1123.     }
  1124.  
  1125.  
  1126.     // }}}
  1127.     // {{{ getDSTLongName()
  1128.  
  1129.     /**
  1130.      * Returns the DST long name for this time zone, e.g.
  1131.      * 'Central Daylight Time'
  1132.      *
  1133.      * @return   string     the daylight savings time long name
  1134.      * @access   public
  1135.      */
  1136.     function getDSTLongName()
  1137.     {
  1138.         return $this->hasdst ? $this->dstlongname : $this->longname;
  1139.     }
  1140.  
  1141.  
  1142.     // }}}
  1143.     // {{{ getDSTShortName()
  1144.  
  1145.     /**
  1146.      * Returns the DST short name for this time zone, e.g. 'CDT'
  1147.      *
  1148.      * @return   string     the daylight savings time short name
  1149.      * @access   public
  1150.      */
  1151.     function getDSTShortName()
  1152.     {
  1153.         return $this->hasdst ? $this->dstshortname : $this->shortname;
  1154.     }
  1155.  
  1156.  
  1157.     // }}}
  1158.     // {{{ getSummerTimeStartMonth()
  1159.  
  1160.     /**
  1161.      * Returns the month number in which Summer time starts
  1162.      *
  1163.      * @return   int        integer representing the month (1 to 12)
  1164.      * @access   public
  1165.      * @since    Method available since Release 1.5.0
  1166.      */
  1167.     function getSummerTimeStartMonth()
  1168.     {
  1169.         return $this->hasdst ? $this->on_summertimestartmonth : null;
  1170.     }
  1171.  
  1172.  
  1173.     // }}}
  1174.     // {{{ getSummerTimeStartDay()
  1175.  
  1176.     /**
  1177.      * Returns the a code representing the day on which Summer time starts
  1178.      *
  1179.      * Returns a string in one of the following forms:
  1180.      *
  1181.      *  5        the fifth of the month
  1182.      *  lastSun  the last Sunday in the month
  1183.      *  lastMon  the last Monday in the month
  1184.      *  Sun>=8   first Sunday on or after the 8th
  1185.      *  Sun<=25  last Sunday on or before the 25th
  1186.      *
  1187.      * @return   string 
  1188.      * @access   public
  1189.      * @since    Method available since Release 1.5.0
  1190.      */
  1191.     function getSummerTimeStartDay()
  1192.     {
  1193.         return $this->hasdst ? $this->os_summertimestartday : null;
  1194.     }
  1195.  
  1196.  
  1197.     // }}}
  1198.     // {{{ getSummerTimeStartTime()
  1199.  
  1200.     /**
  1201.      * Returns the time of day at which which Summer time starts
  1202.      *
  1203.      * The returned time is an offset, in milliseconds, from midnight UTC.  Note
  1204.      * that the offset can be negative, which represents the fact that the time
  1205.      * zone is East of Greenwich, and that when the clocks change locally, the
  1206.      * time in Greenwich is actually a time belonging to the previous day in
  1207.      * UTC.  This, obviously, is unhelpful if you want to know the local time
  1208.      * at which the clocks change, but it is of immense value for the purpose
  1209.      * of calculation.
  1210.      *
  1211.      * @return   int        integer representing the month (1 to 12)
  1212.      * @access   public
  1213.      * @since    Method available since Release 1.5.0
  1214.      */
  1215.     function getSummerTimeStartTime()
  1216.     {
  1217.         return $this->hasdst ? $this->on_summertimestarttime : null;
  1218.     }
  1219.  
  1220.  
  1221.     // }}}
  1222.     // {{{ getSummerTimeEndMonth()
  1223.  
  1224.     /**
  1225.      * Returns the month number in which Summer time ends
  1226.      *
  1227.      * @return   int        integer representing the month (1 to 12)
  1228.      * @access   public
  1229.      * @see      Date_TimeZone::getSummerTimeStartMonth()
  1230.      * @since    Method available since Release 1.5.0
  1231.      */
  1232.     function getSummerTimeEndMonth()
  1233.     {
  1234.         return $this->hasdst ? $this->on_summertimeendmonth : null;
  1235.     }
  1236.  
  1237.  
  1238.     // }}}
  1239.     // {{{ getSummerTimeEndDay()
  1240.  
  1241.     /**
  1242.      * Returns the a code representing the day on which Summer time ends
  1243.      *
  1244.      * @return   string 
  1245.      * @access   public
  1246.      * @see      Date_TimeZone::getSummerTimeStartDay()
  1247.      * @since    Method available since Release 1.5.0
  1248.      */
  1249.     function getSummerTimeEndDay()
  1250.     {
  1251.         return $this->hasdst ? $this->os_summertimeendday : null;
  1252.     }
  1253.  
  1254.  
  1255.     // }}}
  1256.     // {{{ getSummerTimeEndTime()
  1257.  
  1258.     /**
  1259.      * Returns the time of day at which which Summer time ends
  1260.      *
  1261.      * @return   int        integer representing the month (1 to 12)
  1262.      * @access   public
  1263.      * @see      Date_TimeZone::getSummerTimeStartTime()
  1264.      * @since    Method available since Release 1.5.0
  1265.      */
  1266.     function getSummerTimeEndTime()
  1267.     {
  1268.         return $this->hasdst ? $this->on_summertimeendtime : null;
  1269.     }
  1270.  
  1271.  
  1272.     // }}}
  1273.  
  1274. }
  1275.  
  1276. // }}}
  1277.  
  1278. /**
  1279.  * Time Zone Data offset is in miliseconds
  1280.  *
  1281.  * @global array $GLOBALS['_DATE_TIMEZONE_DATA'] 
  1282.  */
  1283. $GLOBALS['_DATE_TIMEZONE_DATA'= array(
  1284.     //
  1285.     // Time zone data is correct as of 15.iii.2007
  1286.     //
  1287.     'Africa/Abidjan' => array(
  1288.         'offset' => 0,
  1289.         'shortname' => 'GMT',
  1290.         'dstshortname' => null,
  1291.         'longname' => 'Greenwich Mean Time' ),
  1292.     'Africa/Accra' => array(
  1293.         'offset' => 0,
  1294.         'shortname' => 'GMT',
  1295.         'dstshortname' => null,
  1296.         'longname' => 'Greenwich Mean Time' ),
  1297.     'Africa/Addis_Ababa' => array(
  1298.         'offset' => 10800000,
  1299.         'shortname' => 'EAT',
  1300.         'dstshortname' => null,
  1301.         'longname' => 'Eastern African Time' ),
  1302.     'Africa/Algiers' => array(
  1303.         'offset' => 3600000,
  1304.         'shortname' => 'CET',
  1305.         'dstshortname' => null,
  1306.         'longname' => 'Central European Time' ),
  1307.     'Africa/Asmara' => array(
  1308.         'offset' => 10800000,
  1309.         'shortname' => 'EAT',
  1310.         'dstshortname' => null ),
  1311.     'Africa/Asmera' => array(
  1312.         'offset' => 10800000,
  1313.         'shortname' => 'EAT',
  1314.         'dstshortname' => null,
  1315.         'longname' => 'Eastern African Time' ),
  1316.     'Africa/Bamako' => array(
  1317.         'offset' => 0,
  1318.         'shortname' => 'GMT',
  1319.         'dstshortname' => null,
  1320.         'longname' => 'Greenwich Mean Time' ),
  1321.     'Africa/Bangui' => array(
  1322.         'offset' => 3600000,
  1323.         'shortname' => 'WAT',
  1324.         'dstshortname' => null,
  1325.         'longname' => 'Western African Time' ),
  1326.     'Africa/Banjul' => array(
  1327.         'offset' => 0,
  1328.         'shortname' => 'GMT',
  1329.         'dstshortname' => null,
  1330.         'longname' => 'Greenwich Mean Time' ),
  1331.     'Africa/Bissau' => array(
  1332.         'offset' => 0,
  1333.         'shortname' => 'GMT',
  1334.         'dstshortname' => null,
  1335.         'longname' => 'Greenwich Mean Time' ),
  1336.     'Africa/Blantyre' => array(
  1337.         'offset' => 7200000,
  1338.         'shortname' => 'CAT',
  1339.         'dstshortname' => null,
  1340.         'longname' => 'Central African Time' ),
  1341.     'Africa/Brazzaville' => array(
  1342.         'offset' => 3600000,
  1343.         'shortname' => 'WAT',
  1344.         'dstshortname' => null,
  1345.         'longname' => 'Western African Time' ),
  1346.     'Africa/Bujumbura' => array(
  1347.         'offset' => 7200000,
  1348.         'shortname' => 'CAT',
  1349.         'dstshortname' => null,
  1350.         'longname' => 'Central African Time' ),
  1351.     'Africa/Cairo' => array(
  1352.         'offset' => 7200000,
  1353.         'shortname' => 'EET',
  1354.         'dstshortname' => 'EEST',
  1355.         'longname' => 'Eastern European Time',
  1356.         'dstlongname' => 'Eastern European Summer Time',
  1357.         'summertimeoffset' => 3600000,
  1358.         'summertimestartmonth' => 4,
  1359.         'summertimestartday' => 'lastFri',
  1360.         'summertimestarttime' => -7200000,
  1361.         'summertimeendmonth' => 8,
  1362.         'summertimeendday' => 'lastThu',
  1363.         'summertimeendtime' => 75600000 ),
  1364.     'Africa/Casablanca' => array(
  1365.         'offset' => 0,
  1366.         'shortname' => 'WET',
  1367.         'dstshortname' => null,
  1368.         'longname' => 'Western European Time' ),
  1369.     'Africa/Ceuta' => array(
  1370.         'offset' => 3600000,
  1371.         'shortname' => 'CET',
  1372.         'dstshortname' => 'CEST',
  1373.         'longname' => 'Central European Time',
  1374.         'dstlongname' => 'Central European Summer Time',
  1375.         'summertimeoffset' => 3600000,
  1376.         'summertimestartmonth' => 3,
  1377.         'summertimestartday' => 'lastSun',
  1378.         'summertimestarttime' => 3600000,
  1379.         'summertimeendmonth' => 10,
  1380.         'summertimeendday' => 'lastSun',
  1381.         'summertimeendtime' => 3600000 ),
  1382.     'Africa/Conakry' => array(
  1383.         'offset' => 0,
  1384.         'shortname' => 'GMT',
  1385.         'dstshortname' => null,
  1386.         'longname' => 'Greenwich Mean Time' ),
  1387.     'Africa/Dakar' => array(
  1388.         'offset' => 0,
  1389.         'shortname' => 'GMT',
  1390.         'dstshortname' => null,
  1391.         'longname' => 'Greenwich Mean Time' ),
  1392.     'Africa/Dar_es_Salaam' => array(
  1393.         'offset' => 10800000,
  1394.         'shortname' => 'EAT',
  1395.         'dstshortname' => null,
  1396.         'longname' => 'Eastern African Time' ),
  1397.     'Africa/Djibouti' => array(
  1398.         'offset' => 10800000,
  1399.         'shortname' => 'EAT',
  1400.         'dstshortname' => null,
  1401.         'longname' => 'Eastern African Time' ),
  1402.     'Africa/Douala' => array(
  1403.         'offset' => 3600000,
  1404.         'shortname' => 'WAT',
  1405.         'dstshortname' => null,
  1406.         'longname' => 'Western African Time' ),
  1407.     'Africa/El_Aaiun' => array(
  1408.         'offset' => 0,
  1409.         'shortname' => 'WET',
  1410.         'dstshortname' => null,
  1411.         'longname' => 'Western European Time' ),
  1412.     'Africa/Freetown' => array(
  1413.         'offset' => 0,
  1414.         'shortname' => 'GMT',
  1415.         'dstshortname' => null,
  1416.         'longname' => 'Greenwich Mean Time' ),
  1417.     'Africa/Gaborone' => array(
  1418.         'offset' => 7200000,
  1419.         'shortname' => 'CAT',
  1420.         'dstshortname' => null,
  1421.         'longname' => 'Central African Time' ),
  1422.     'Africa/Harare' => array(
  1423.         'offset' => 7200000,
  1424.         'shortname' => 'CAT',
  1425.         'dstshortname' => null,
  1426.         'longname' => 'Central African Time' ),
  1427.     'Africa/Johannesburg' => array(
  1428.         'offset' => 7200000,
  1429.         'shortname' => 'SAST',
  1430.         'dstshortname' => null,
  1431.         'longname' => 'South Africa Standard Time' ),
  1432.     'Africa/Kampala' => array(
  1433.         'offset' => 10800000,
  1434.         'shortname' => 'EAT',
  1435.         'dstshortname' => null,
  1436.         'longname' => 'Eastern African Time' ),
  1437.     'Africa/Khartoum' => array(
  1438.         'offset' => 10800000,
  1439.         'shortname' => 'EAT',
  1440.         'dstshortname' => null,
  1441.         'longname' => 'Eastern African Time' ),
  1442.     'Africa/Kigali' => array(
  1443.         'offset' => 7200000,
  1444.         'shortname' => 'CAT',
  1445.         'dstshortname' => null,
  1446.         'longname' => 'Central African Time' ),
  1447.     'Africa/Kinshasa' => array(
  1448.         'offset' => 3600000,
  1449.         'shortname' => 'WAT',
  1450.         'dstshortname' => null,
  1451.         'longname' => 'Western African Time' ),
  1452.     'Africa/Lagos' => array(
  1453.         'offset' => 3600000,
  1454.         'shortname' => 'WAT',
  1455.         'dstshortname' => null,
  1456.         'longname' => 'Western African Time' ),
  1457.     'Africa/Libreville' => array(
  1458.         'offset' => 3600000,
  1459.         'shortname' => 'WAT',
  1460.         'dstshortname' => null,
  1461.         'longname' => 'Western African Time' ),
  1462.     'Africa/Lome' => array(
  1463.         'offset' => 0,
  1464.         'shortname' => 'GMT',
  1465.         'dstshortname' => null,
  1466.         'longname' => 'Greenwich Mean Time' ),
  1467.     'Africa/Luanda' => array(
  1468.         'offset' => 3600000,
  1469.         'shortname' => 'WAT',
  1470.         'dstshortname' => null,
  1471.         'longname' => 'Western African Time' ),
  1472.     'Africa/Lubumbashi' => array(
  1473.         'offset' => 7200000,
  1474.         'shortname' => 'CAT',
  1475.         'dstshortname' => null,
  1476.         'longname' => 'Central African Time' ),
  1477.     'Africa/Lusaka' => array(
  1478.         'offset' => 7200000,
  1479.         'shortname' => 'CAT',
  1480.         'dstshortname' => null,
  1481.         'longname' => 'Central African Time' ),
  1482.     'Africa/Malabo' => array(
  1483.         'offset' => 3600000,
  1484.         'shortname' => 'WAT',
  1485.         'dstshortname' => null,
  1486.         'longname' => 'Western African Time' ),
  1487.     'Africa/Maputo' => array(
  1488.         'offset' => 7200000,
  1489.         'shortname' => 'CAT',
  1490.         'dstshortname' => null,
  1491.         'longname' => 'Central African Time' ),
  1492.     'Africa/Maseru' => array(
  1493.         'offset' => 7200000,
  1494.         'shortname' => 'SAST',
  1495.         'dstshortname' => null,
  1496.         'longname' => 'South Africa Standard Time' ),
  1497.     'Africa/Mbabane' => array(
  1498.         'offset' => 7200000,
  1499.         'shortname' => 'SAST',
  1500.         'dstshortname' => null,
  1501.         'longname' => 'South Africa Standard Time' ),
  1502.     'Africa/Mogadishu' => array(
  1503.         'offset' => 10800000,
  1504.         'shortname' => 'EAT',
  1505.         'dstshortname' => null,
  1506.         'longname' => 'Eastern African Time' ),
  1507.     'Africa/Monrovia' => array(
  1508.         'offset' => 0,
  1509.         'shortname' => 'GMT',
  1510.         'dstshortname' => null,
  1511.         'longname' => 'Greenwich Mean Time' ),
  1512.     'Africa/Nairobi' => array(
  1513.         'offset' => 10800000,
  1514.         'shortname' => 'EAT',
  1515.         'dstshortname' => null,
  1516.         'longname' => 'Eastern African Time' ),
  1517.     'Africa/Ndjamena' => array(
  1518.         'offset' => 3600000,
  1519.         'shortname' => 'WAT',
  1520.         'dstshortname' => null,
  1521.         'longname' => 'Western African Time' ),
  1522.     'Africa/Niamey' => array(
  1523.         'offset' => 3600000,
  1524.         'shortname' => 'WAT',
  1525.         'dstshortname' => null,
  1526.         'longname' => 'Western African Time' ),
  1527.     'Africa/Nouakchott' => array(
  1528.         'offset' => 0,
  1529.         'shortname' => 'GMT',
  1530.         'dstshortname' => null,
  1531.         'longname' => 'Greenwich Mean Time' ),
  1532.     'Africa/Ouagadougou' => array(
  1533.         'offset' => 0,
  1534.         'shortname' => 'GMT',
  1535.         'dstshortname' => null,
  1536.         'longname' => 'Greenwich Mean Time' ),
  1537.     'Africa/Porto-Novo' => array(
  1538.         'offset' => 3600000,
  1539.         'shortname' => 'WAT',
  1540.         'dstshortname' => null,
  1541.         'longname' => 'Western African Time' ),
  1542.     'Africa/Sao_Tome' => array(
  1543.         'offset' => 0,
  1544.         'shortname' => 'GMT',
  1545.         'dstshortname' => null,
  1546.         'longname' => 'Greenwich Mean Time' ),
  1547.     'Africa/Timbuktu' => array(
  1548.         'offset' => 0,
  1549.         'shortname' => 'GMT',
  1550.         'dstshortname' => null,
  1551.         'longname' => 'Greenwich Mean Time' ),
  1552.     'Africa/Tripoli' => array(
  1553.         'offset' => 7200000,
  1554.         'shortname' => 'EET',
  1555.         'dstshortname' => null,
  1556.         'longname' => 'Eastern European Time' ),
  1557.     'Africa/Tunis' => array(
  1558.         'offset' => 3600000,
  1559.         'shortname' => 'CET',
  1560.         'dstshortname' => 'CEST',
  1561.         'longname' => 'Central European Time',
  1562.         'summertimeoffset' => 3600000,
  1563.         'summertimestartmonth' => 3,
  1564.         'summertimestartday' => 'lastSun',
  1565.         'summertimestarttime' => 3600000,
  1566.         'summertimeendmonth' => 10,
  1567.         'summertimeendday' => 'lastSun',
  1568.         'summertimeendtime' => 3600000 ),
  1569.     'Africa/Windhoek' => array(
  1570.         'offset' => 3600000,
  1571.         'shortname' => 'WAT',
  1572.         'dstshortname' => 'WAST',
  1573.         'longname' => 'Western African Time',
  1574.         'dstlongname' => 'Western African Summer Time',
  1575.         'summertimeoffset' => 3600000,
  1576.         'summertimestartmonth' => 9,
  1577.         'summertimestartday' => 'Sun>=1',
  1578.         'summertimestarttime' => 3600000,
  1579.         'summertimeendmonth' => 4,
  1580.         'summertimeendday' => 'Sun>=1',
  1581.         'summertimeendtime' => 0 ),
  1582.     'America/Adak' => array(
  1583.         'offset' => -36000000,
  1584.         'shortname' => 'HAST',
  1585.         'dstshortname' => 'HADT',
  1586.         'longname' => 'Hawaii-Aleutian Standard Time',
  1587.         'dstlongname' => 'Hawaii-Aleutian Daylight Time',
  1588.         'summertimeoffset' => 3600000,
  1589.         'summertimestartmonth' => 3,
  1590.         'summertimestartday' => 'Sun>=8',
  1591.         'summertimestarttime' => 43200000,
  1592.         'summertimeendmonth' => 11,
  1593.         'summertimeendday' => 'Sun>=1',
  1594.         'summertimeendtime' => 39600000 ),
  1595.     'America/Anchorage' => array(
  1596.         'offset' => -32400000,
  1597.         'shortname' => 'AKST',
  1598.         'dstshortname' => 'AKDT',
  1599.         'longname' => 'Alaska Standard Time',
  1600.         'dstlongname' => 'Alaska Daylight Time',
  1601.         'summertimeoffset' => 3600000,
  1602.         'summertimestartmonth' => 3,
  1603.         'summertimestartday' => 'Sun>=8',
  1604.         'summertimestarttime' => 39600000,
  1605.         'summertimeendmonth' => 11,
  1606.         'summertimeendday' => 'Sun>=1',
  1607.         'summertimeendtime' => 36000000 ),
  1608.     'America/Anguilla' => array(
  1609.         'offset' => -14400000,
  1610.         'shortname' => 'AST',
  1611.         'dstshortname' => null,
  1612.         'longname' => 'Atlantic Standard Time' ),
  1613.     'America/Antigua' => array(
  1614.         'offset' => -14400000,
  1615.         'shortname' => 'AST',
  1616.         'dstshortname' => null,
  1617.         'longname' => 'Atlantic Standard Time' ),
  1618.     'America/Araguaina' => array(
  1619.         'offset' => -10800000,
  1620.         'shortname' => 'BRT',
  1621.         'dstshortname' => null,
  1622.         'longname' => 'Brazil Time',
  1623.         'dstlongname' => 'Brazil Summer Time' ),
  1624.     'America/Argentina/Buenos_Aires' => array(
  1625.         'offset' => -10800000,
  1626.         'shortname' => 'ART',
  1627.         'dstshortname' => 'ARST',
  1628.         'summertimeoffset' => 3600000,
  1629.         'summertimestartmonth' => 10,
  1630.         'summertimestartday' => 'Sun>=1',
  1631.         'summertimestarttime' => 0,
  1632.         'summertimeendmonth' => 3,
  1633.         'summertimeendday' => 'Sun>=15',
  1634.         'summertimeendtime' => 0 ),
  1635.     'America/Argentina/Catamarca' => array(
  1636.         'offset' => -10800000,
  1637.         'shortname' => 'ART',
  1638.         'dstshortname' => 'ARST',
  1639.         'summertimeoffset' => 3600000,
  1640.         'summertimestartmonth' => 10,
  1641.         'summertimestartday' => 'Sun>=1',
  1642.         'summertimestarttime' => 0,
  1643.         'summertimeendmonth' => 3,
  1644.         'summertimeendday' => 'Sun>=15',
  1645.         'summertimeendtime' => 0 ),
  1646.     'America/Argentina/ComodRivadavia' => array(
  1647.         'offset' => -10800000,
  1648.         'shortname' => 'ART',
  1649.         'dstshortname' => 'ARST',
  1650.         'summertimeoffset' => 3600000,
  1651.         'summertimestartmonth' => 10,
  1652.         'summertimestartday' => 'Sun>=1',
  1653.         'summertimestarttime' => 0,
  1654.         'summertimeendmonth' => 3,
  1655.         'summertimeendday' => 'Sun>=15',
  1656.         'summertimeendtime' => 0 ),
  1657.     'America/Argentina/Cordoba' => array(
  1658.         'offset' => -10800000,
  1659.         'shortname' => 'ART',
  1660.         'dstshortname' => 'ARST',
  1661.         'summertimeoffset' => 3600000,
  1662.         'summertimestartmonth' => 10,
  1663.         'summertimestartday' => 'Sun>=1',
  1664.         'summertimestarttime' => 0,
  1665.         'summertimeendmonth' => 3,
  1666.         'summertimeendday' => 'Sun>=15',
  1667.         'summertimeendtime' => 0 ),
  1668.     'America/Argentina/Jujuy' => array(
  1669.         'offset' => -10800000,
  1670.         'shortname' => 'ART',
  1671.         'dstshortname' => 'ARST',
  1672.         'summertimeoffset' => 3600000,
  1673.         'summertimestartmonth' => 10,
  1674.         'summertimestartday' => 'Sun>=1',
  1675.         'summertimestarttime' => 0,
  1676.         'summertimeendmonth' => 3,
  1677.         'summertimeendday' => 'Sun>=15',
  1678.         'summertimeendtime' => 0 ),
  1679.     'America/Argentina/La_Rioja' => array(
  1680.         'offset' => -10800000,
  1681.         'shortname' => 'ART',
  1682.         'dstshortname' => 'ARST',
  1683.         'summertimeoffset' => 3600000,
  1684.         'summertimestartmonth' => 10,
  1685.         'summertimestartday' => 'Sun>=1',
  1686.         'summertimestarttime' => 0,
  1687.         'summertimeendmonth' => 3,
  1688.         'summertimeendday' => 'Sun>=15',
  1689.         'summertimeendtime' => 0 ),
  1690.     'America/Argentina/Mendoza' => array(
  1691.         'offset' => -10800000,
  1692.         'shortname' => 'ART',
  1693.         'dstshortname' => 'ARST',
  1694.         'summertimeoffset' => 3600000,
  1695.         'summertimestartmonth' => 10,
  1696.         'summertimestartday' => 'Sun>=1',
  1697.         'summertimestarttime' => 0,
  1698.         'summertimeendmonth' => 3,
  1699.         'summertimeendday' => 'Sun>=15',
  1700.         'summertimeendtime' => 0 ),
  1701.     'America/Argentina/Rio_Gallegos' => array(
  1702.         'offset' => -10800000,
  1703.         'shortname' => 'ART',
  1704.         'dstshortname' => 'ARST',
  1705.         'summertimeoffset' => 3600000,
  1706.         'summertimestartmonth' => 10,
  1707.         'summertimestartday' => 'Sun>=1',
  1708.         'summertimestarttime' => 0,
  1709.         'summertimeendmonth' => 3,
  1710.         'summertimeendday' => 'Sun>=15',
  1711.         'summertimeendtime' => 0 ),
  1712.     'America/Argentina/San_Juan' => array(
  1713.         'offset' => -10800000,
  1714.         'shortname' => 'ART',
  1715.         'dstshortname' => 'ARST',
  1716.         'summertimeoffset' => 3600000,
  1717.         'summertimestartmonth' => 10,
  1718.         'summertimestartday' => 'Sun>=1',
  1719.         'summertimestarttime' => 0,
  1720.         'summertimeendmonth' => 3,
  1721.         'summertimeendday' => 'Sun>=15',
  1722.         'summertimeendtime' => 0 ),
  1723.     'America/Argentina/Tucuman' => array(
  1724.         'offset' => -10800000,
  1725.         'shortname' => 'ART',
  1726.         'dstshortname' => 'ARST',
  1727.         'summertimeoffset' => 3600000,
  1728.         'summertimestartmonth' => 10,
  1729.         'summertimestartday' => 'Sun>=1',
  1730.         'summertimestarttime' => 0,
  1731.         'summertimeendmonth' => 3,
  1732.         'summertimeendday' => 'Sun>=15',
  1733.         'summertimeendtime' => 0 ),
  1734.     'America/Argentina/Ushuaia' => array(
  1735.         'offset' => -10800000,
  1736.         'shortname' => 'ART',
  1737.         'dstshortname' => 'ARST',
  1738.         'summertimeoffset' => 3600000,
  1739.         'summertimestartmonth' => 10,
  1740.         'summertimestartday' => 'Sun>=1',
  1741.         'summertimestarttime' => 0,
  1742.         'summertimeendmonth' => 3,
  1743.         'summertimeendday' => 'Sun>=15',
  1744.         'summertimeendtime' => 0 ),
  1745.     'America/Aruba' => array(
  1746.         'offset' => -14400000,
  1747.         'shortname' => 'AST',
  1748.         'dstshortname' => null,
  1749.         'longname' => 'Atlantic Standard Time' ),
  1750.     'America/Asuncion' => array(
  1751.         'offset' => -14400000,
  1752.         'shortname' => 'PYT',
  1753.         'dstshortname' => 'PYST',
  1754.         'longname' => 'Paraguay Time',
  1755.         'dstlongname' => 'Paraguay Summer Time',
  1756.         'summertimeoffset' => 3600000,
  1757.         'summertimestartmonth' => 10,
  1758.         'summertimestartday' => 'Sun>=15',
  1759.         'summertimestarttime' => 14400000,
  1760.         'summertimeendmonth' => 3,
  1761.         'summertimeendday' => 'Sun>=8',
  1762.         'summertimeendtime' => 10800000 ),
  1763.     'America/Atikokan' => array(
  1764.         'offset' => -18000000,
  1765.         'shortname' => 'EST',
  1766.         'dstshortname' => null ),
  1767.     'America/Atka' => array(
  1768.         'offset' => -36000000,
  1769.         'shortname' => 'HAST',
  1770.         'dstshortname' => 'HADT',
  1771.         'longname' => 'Hawaii-Aleutian Standard Time',
  1772.         'dstlongname' => 'Hawaii-Aleutian Daylight Time',
  1773.         'summertimeoffset' => 3600000,
  1774.         'summertimestartmonth' => 3,
  1775.         'summertimestartday' => 'Sun>=8',
  1776.         'summertimestarttime' => 43200000,
  1777.         'summertimeendmonth' => 11,
  1778.         'summertimeendday' => 'Sun>=1',
  1779.         'summertimeendtime' => 39600000 ),
  1780.     'America/Bahia' => array(
  1781.         'offset' => -10800000,
  1782.         'shortname' => 'BRT',
  1783.         'dstshortname' => null ),
  1784.     'America/Barbados' => array(
  1785.         'offset' => -14400000,
  1786.         'shortname' => 'AST',
  1787.         'dstshortname' => null,
  1788.         'longname' => 'Atlantic Standard Time' ),
  1789.     'America/Belem' => array(
  1790.         'offset' => -10800000,
  1791.         'shortname' => 'BRT',
  1792.         'dstshortname' => null,
  1793.         'longname' => 'Brazil Time' ),
  1794.     'America/Belize' => array(
  1795.         'offset' => -21600000,
  1796.         'shortname' => 'CST',
  1797.         'dstshortname' => null,
  1798.         'longname' => 'Central Standard Time' ),
  1799.     'America/Blanc-Sablon' => array(
  1800.         'offset' => -14400000,
  1801.         'shortname' => 'AST',
  1802.         'dstshortname' => null ),
  1803.     'America/Boa_Vista' => array(
  1804.         'offset' => -14400000,
  1805.         'shortname' => 'AMT',
  1806.         'dstshortname' => null,
  1807.         'longname' => 'Amazon Standard Time' ),
  1808.     'America/Bogota' => array(
  1809.         'offset' => -18000000,
  1810.         'shortname' => 'COT',
  1811.         'dstshortname' => null,
  1812.         'longname' => 'Colombia Time' ),
  1813.     'America/Boise' => array(
  1814.         'offset' => -25200000,
  1815.         'shortname' => 'MST',
  1816.         'dstshortname' => 'MDT',
  1817.         'longname' => 'Mountain Standard Time',
  1818.         'dstlongname' => 'Mountain Daylight Time',
  1819.         'summertimeoffset' => 3600000,
  1820.         'summertimestartmonth' => 3,
  1821.         'summertimestartday' => 'Sun>=8',
  1822.         'summertimestarttime' => 32400000,
  1823.         'summertimeendmonth' => 11,
  1824.         'summertimeendday' => 'Sun>=1',
  1825.         'summertimeendtime' => 28800000 ),
  1826.     'America/Buenos_Aires' => array(
  1827.         'offset' => -10800000,
  1828.         'shortname' => 'ART',
  1829.         'dstshortname' => 'ARST',
  1830.         'longname' => 'Argentine Time',
  1831.         'summertimeoffset' => 3600000,
  1832.         'summertimestartmonth' => 10,
  1833.         'summertimestartday' => 'Sun>=1',
  1834.         'summertimestarttime' => 0,
  1835.         'summertimeendmonth' => 3,
  1836.         'summertimeendday' => 'Sun>=15',
  1837.         'summertimeendtime' => 0 ),
  1838.     'America/Cambridge_Bay' => array(
  1839.         'offset' => -25200000,
  1840.         'shortname' => 'MST',
  1841.         'dstshortname' => 'MDT',
  1842.         'longname' => 'Mountain Standard Time',
  1843.         'dstlongname' => 'Mountain Daylight Time',
  1844.         'summertimeoffset' => 3600000,
  1845.         'summertimestartmonth' => 3,
  1846.         'summertimestartday' => 'Sun>=8',
  1847.         'summertimestarttime' => 32400000,
  1848.         'summertimeendmonth' => 11,
  1849.         'summertimeendday' => 'Sun>=1',
  1850.         'summertimeendtime' => 28800000 ),
  1851.     'America/Campo_Grande' => array(
  1852.         'offset' => -14400000,
  1853.         'shortname' => 'AMT',
  1854.         'dstshortname' => 'AMST',
  1855.         'summertimeoffset' => 3600000,
  1856.         'summertimestartmonth' => 10,
  1857.         'summertimestartday' => 'Sun>=8',
  1858.         'summertimestarttime' => 14400000,
  1859.         'summertimeendmonth' => 2,
  1860.         'summertimeendday' => 'Sun>=15',
  1861.         'summertimeendtime' => 10800000 ),
  1862.     'America/Cancun' => array(
  1863.         'offset' => -21600000,
  1864.         'shortname' => 'CST',
  1865.         'dstshortname' => 'CDT',
  1866.         'longname' => 'Central Standard Time',
  1867.         'dstlongname' => 'Central Daylight Time',
  1868.         'summertimeoffset' => 3600000,
  1869.         'summertimestartmonth' => 4,
  1870.         'summertimestartday' => 'Sun>=1',
  1871.         'summertimestarttime' => 28800000,
  1872.         'summertimeendmonth' => 10,
  1873.         'summertimeendday' => 'lastSun',
  1874.         'summertimeendtime' => 25200000 ),
  1875.     'America/Caracas' => array(
  1876.         'offset' => -16200000,
  1877.         'shortname' => 'VET',
  1878.         'dstshortname' => null,
  1879.         'longname' => 'Venezuela Time' ),
  1880.     'America/Catamarca' => array(
  1881.         'offset' => -10800000,
  1882.         'shortname' => 'ART',
  1883.         'dstshortname' => 'ARST',
  1884.         'longname' => 'Argentine Time',
  1885.         'summertimeoffset' => 3600000,
  1886.         'summertimestartmonth' => 10,
  1887.         'summertimestartday' => 'Sun>=1',
  1888.         'summertimestarttime' => 0,
  1889.         'summertimeendmonth' => 3,
  1890.         'summertimeendday' => 'Sun>=15',
  1891.         'summertimeendtime' => 0 ),
  1892.     'America/Cayenne' => array(
  1893.         'offset' => -10800000,
  1894.         'shortname' => 'GFT',
  1895.         'dstshortname' => null,
  1896.         'longname' => 'French Guiana Time' ),
  1897.     'America/Cayman' => array(
  1898.         'offset' => -18000000,
  1899.         'shortname' => 'EST',
  1900.         'dstshortname' => null,
  1901.         'longname' => 'Eastern Standard Time' ),
  1902.     'America/Chicago' => array(
  1903.         'offset' => -21600000,
  1904.         'shortname' => 'CST',
  1905.         'dstshortname' => 'CDT',
  1906.         'longname' => 'Central Standard Time',
  1907.         'dstlongname' => 'Central Daylight Time',
  1908.         'summertimeoffset' => 3600000,
  1909.         'summertimestartmonth' => 3,
  1910.         'summertimestartday' => 'Sun>=8',
  1911.         'summertimestarttime' => 28800000,
  1912.         'summertimeendmonth' => 11,
  1913.         'summertimeendday' => 'Sun>=1',
  1914.         'summertimeendtime' => 25200000 ),
  1915.     'America/Chihuahua' => array(
  1916.         'offset' => -25200000,
  1917.         'shortname' => 'MST',
  1918.         'dstshortname' => 'MDT',
  1919.         'longname' => 'Mountain Standard Time',
  1920.         'dstlongname' => 'Mountain Daylight Time',
  1921.         'summertimeoffset' => 3600000,
  1922.         'summertimestartmonth' => 4,
  1923.         'summertimestartday' => 'Sun>=1',
  1924.         'summertimestarttime' => 32400000,
  1925.         'summertimeendmonth' => 10,
  1926.         'summertimeendday' => 'lastSun',
  1927.         'summertimeendtime' => 28800000 ),
  1928.     'America/Coral_Harbour' => array(
  1929.         'offset' => -18000000,
  1930.         'shortname' => 'EST',
  1931.         'dstshortname' => null ),
  1932.     'America/Cordoba' => array(
  1933.         'offset' => -10800000,
  1934.         'shortname' => 'ART',
  1935.         'dstshortname' => 'ARST',
  1936.         'longname' => 'Argentine Time',
  1937.         'summertimeoffset' => 3600000,
  1938.         'summertimestartmonth' => 10,
  1939.         'summertimestartday' => 'Sun>=1',
  1940.         'summertimestarttime' => 0,
  1941.         'summertimeendmonth' => 3,
  1942.         'summertimeendday' => 'Sun>=15',
  1943.         'summertimeendtime' => 0 ),
  1944.     'America/Costa_Rica' => array(
  1945.         'offset' => -21600000,
  1946.         'shortname' => 'CST',
  1947.         'dstshortname' => null,
  1948.         'longname' => 'Central Standard Time' ),
  1949.     'America/Cuiaba' => array(
  1950.         'offset' => -14400000,
  1951.         'shortname' => 'AMT',
  1952.         'dstshortname' => 'AMST',
  1953.         'longname' => 'Amazon Standard Time',
  1954.         'dstlongname' => 'Amazon Summer Time',
  1955.         'summertimeoffset' => 3600000,
  1956.         'summertimestartmonth' => 10,
  1957.         'summertimestartday' => 'Sun>=8',
  1958.         'summertimestarttime' => 14400000,
  1959.         'summertimeendmonth' => 2,
  1960.         'summertimeendday' => 'Sun>=15',
  1961.         'summertimeendtime' => 10800000 ),
  1962.     'America/Curacao' => array(
  1963.         'offset' => -14400000,
  1964.         'shortname' => 'AST',
  1965.         'dstshortname' => null,
  1966.         'longname' => 'Atlantic Standard Time' ),
  1967.     'America/Danmarkshavn' => array(
  1968.         'offset' => 0,
  1969.         'shortname' => 'GMT',
  1970.         'dstshortname' => null,
  1971.         'longname' => 'Greenwich Mean Time' ),
  1972.     'America/Dawson' => array(
  1973.         'offset' => -28800000,
  1974.         'shortname' => 'PST',
  1975.         'dstshortname' => 'PDT',
  1976.         'longname' => 'Pacific Standard Time',
  1977.         'dstlongname' => 'Pacific Daylight Time',
  1978.         'summertimeoffset' => 3600000,
  1979.         'summertimestartmonth' => 3,
  1980.         'summertimestartday' => 'Sun>=8',
  1981.         'summertimestarttime' => 36000000,
  1982.         'summertimeendmonth' => 11,
  1983.         'summertimeendday' => 'Sun>=1',
  1984.         'summertimeendtime' => 32400000 ),
  1985.     'America/Dawson_Creek' => array(
  1986.         'offset' => -25200000,
  1987.         'shortname' => 'MST',
  1988.         'dstshortname' => null,
  1989.         'longname' => 'Mountain Standard Time' ),
  1990.     'America/Denver' => array(
  1991.         'offset' => -25200000,
  1992.         'shortname' => 'MST',
  1993.         'dstshortname' => 'MDT',
  1994.         'longname' => 'Mountain Standard Time',
  1995.         'dstlongname' => 'Mountain Daylight Time',
  1996.         'summertimeoffset' => 3600000,
  1997.         'summertimestartmonth' => 3,
  1998.         'summertimestartday' => 'Sun>=8',
  1999.         'summertimestarttime' => 32400000,
  2000.         'summertimeendmonth' => 11,
  2001.         'summertimeendday' => 'Sun>=1',
  2002.         'summertimeendtime' => 28800000 ),
  2003.     'America/Detroit' => array(
  2004.         'offset' => -18000000,
  2005.         'shortname' => 'EST',
  2006.         'dstshortname' => 'EDT',
  2007.         'longname' => 'Eastern Standard Time',
  2008.         'dstlongname' => 'Eastern Daylight Time',
  2009.         'summertimeoffset' => 3600000,
  2010.         'summertimestartmonth' => 3,
  2011.         'summertimestartday' => 'Sun>=8',
  2012.         'summertimestarttime' => 25200000,
  2013.         'summertimeendmonth' => 11,
  2014.         'summertimeendday' => 'Sun>=1',
  2015.         'summertimeendtime' => 21600000 ),
  2016.     'America/Dominica' => array(
  2017.         'offset' => -14400000,
  2018.         'shortname' => 'AST',
  2019.         'dstshortname' => null,
  2020.         'longname' => 'Atlantic Standard Time' ),
  2021.     'America/Edmonton' => array(
  2022.         'offset' => -25200000,
  2023.         'shortname' => 'MST',
  2024.         'dstshortname' => 'MDT',
  2025.         'longname' => 'Mountain Standard Time',
  2026.         'dstlongname' => 'Mountain Daylight Time',
  2027.         'summertimeoffset' => 3600000,
  2028.         'summertimestartmonth' => 3,
  2029.         'summertimestartday' => 'Sun>=8',
  2030.         'summertimestarttime' => 32400000,
  2031.         'summertimeendmonth' => 11,
  2032.         'summertimeendday' => 'Sun>=1',
  2033.         'summertimeendtime' => 28800000 ),
  2034.     'America/Eirunepe' => array(
  2035.         'offset' => -18000000,
  2036.         'shortname' => 'ACT',
  2037.         'dstshortname' => null,
  2038.         'longname' => 'Acre Time' ),
  2039.     'America/El_Salvador' => array(
  2040.         'offset' => -21600000,
  2041.         'shortname' => 'CST',
  2042.         'dstshortname' => null,
  2043.         'longname' => 'Central Standard Time' ),
  2044.     'America/Ensenada' => array(
  2045.         'offset' => -28800000,
  2046.         'shortname' => 'PST',
  2047.         'dstshortname' => 'PDT',
  2048.         'longname' => 'Pacific Standard Time',
  2049.         'dstlongname' => 'Pacific Daylight Time',
  2050.         'summertimeoffset' => 3600000,
  2051.         'summertimestartmonth' => 4,
  2052.         'summertimestartday' => 'Sun>=1',
  2053.         'summertimestarttime' => 36000000,
  2054.         'summertimeendmonth' => 10,
  2055.         'summertimeendday' => 'lastSun',
  2056.         'summertimeendtime' => 32400000 ),
  2057.     'America/Fort_Wayne' => array(
  2058.         'offset' => -18000000,
  2059.         'shortname' => 'EST',
  2060.         'dstshortname' => 'EDT',
  2061.         'longname' => 'Eastern Standard Time',
  2062.         'summertimeoffset' => 3600000,
  2063.         'summertimestartmonth' => 3,
  2064.         'summertimestartday' => 'Sun>=8',
  2065.         'summertimestarttime' => 25200000,
  2066.         'summertimeendmonth' => 11,
  2067.         'summertimeendday' => 'Sun>=1',
  2068.         'summertimeendtime' => 21600000 ),
  2069.     'America/Fortaleza' => array(
  2070.         'offset' => -10800000,
  2071.         'shortname' => 'BRT',
  2072.         'dstshortname' => null,
  2073.         'longname' => 'Brazil Time',
  2074.         'dstlongname' => 'Brazil Summer Time' ),
  2075.     'America/Glace_Bay' => array(
  2076.         'offset' => -14400000,
  2077.         'shortname' => 'AST',
  2078.         'dstshortname' => 'ADT',
  2079.         'longname' => 'Atlantic Standard Time',
  2080.         'dstlongname' => 'Atlantic Daylight Time',
  2081.         'summertimeoffset' => 3600000,
  2082.         'summertimestartmonth' => 3,
  2083.         'summertimestartday' => 'Sun>=8',
  2084.         'summertimestarttime' => 21600000,
  2085.         'summertimeendmonth' => 11,
  2086.         'summertimeendday' => 'Sun>=1',
  2087.         'summertimeendtime' => 18000000 ),
  2088.     'America/Godthab' => array(
  2089.         'offset' => -10800000,
  2090.         'shortname' => 'WGT',
  2091.         'dstshortname' => 'WGST',
  2092.         'longname' => 'Western Greenland Time',
  2093.         'dstlongname' => 'Western Greenland Summer Time',
  2094.         'summertimeoffset' => 3600000,
  2095.         'summertimestartmonth' => 3,
  2096.         'summertimestartday' => 'lastSun',
  2097.         'summertimestarttime' => 3600000,
  2098.         'summertimeendmonth' => 10,
  2099.         'summertimeendday' => 'lastSun',
  2100.         'summertimeendtime' => 3600000 ),
  2101.     'America/Goose_Bay' => array(
  2102.         'offset' => -14400000,
  2103.         'shortname' => 'AST',
  2104.         'dstshortname' => 'ADT',
  2105.         'longname' => 'Atlantic Standard Time',
  2106.         'dstlongname' => 'Atlantic Daylight Time',
  2107.         'summertimeoffset' => 3600000,
  2108.         'summertimestartmonth' => 3,
  2109.         'summertimestartday' => 'Sun>=8',
  2110.         'summertimestarttime' => 14460000,
  2111.         'summertimeendmonth' => 11,
  2112.         'summertimeendday' => 'Sun>=1',
  2113.         'summertimeendtime' => 10860000 ),
  2114.     'America/Grand_Turk' => array(
  2115.         'offset' => -18000000,
  2116.         'shortname' => 'EST',
  2117.         'dstshortname' => 'EDT',
  2118.         'longname' => 'Eastern Standard Time',
  2119.         'dstlongname' => 'Eastern Daylight Time',
  2120.         'summertimeoffset' => 3600000,
  2121.         'summertimestartmonth' => 3,
  2122.         'summertimestartday' => 'Sun>=8',
  2123.         'summertimestarttime' => 25200000,
  2124.         'summertimeendmonth' => 11,
  2125.         'summertimeendday' => 'Sun>=1',
  2126.         'summertimeendtime' => 21600000 ),
  2127.     'America/Grenada' => array(
  2128.         'offset' => -14400000,
  2129.         'shortname' => 'AST',
  2130.         'dstshortname' => null,
  2131.         'longname' => 'Atlantic Standard Time' ),
  2132.     'America/Guadeloupe' => array(
  2133.         'offset' => -14400000,
  2134.         'shortname' => 'AST',
  2135.         'dstshortname' => null,
  2136.         'longname' => 'Atlantic Standard Time' ),
  2137.     'America/Guatemala' => array(
  2138.         'offset' => -21600000,
  2139.         'shortname' => 'CST',
  2140.         'dstshortname' => null,
  2141.         'longname' => 'Central Standard Time' ),
  2142.     'America/Guayaquil' => array(
  2143.         'offset' => -18000000,
  2144.         'shortname' => 'ECT',
  2145.         'dstshortname' => null,
  2146.         'longname' => 'Ecuador Time' ),
  2147.     'America/Guyana' => array(
  2148.         'offset' => -14400000,
  2149.         'shortname' => 'GYT',
  2150.         'dstshortname' => null,
  2151.         'longname' => 'Guyana Time' ),
  2152.     'America/Halifax' => array(
  2153.         'offset' => -14400000,
  2154.         'shortname' => 'AST',
  2155.         'dstshortname' => 'ADT',
  2156.         'longname' => 'Atlantic Standard Time',
  2157.         'dstlongname' => 'Atlantic Daylight Time',
  2158.         'summertimeoffset' => 3600000,
  2159.         'summertimestartmonth' => 3,
  2160.         'summertimestartday' => 'Sun>=8',
  2161.         'summertimestarttime' => 21600000,
  2162.         'summertimeendmonth' => 11,
  2163.         'summertimeendday' => 'Sun>=1',
  2164.         'summertimeendtime' => 18000000 ),
  2165.     'America/Havana' => array(
  2166.         'offset' => -18000000,
  2167.         'shortname' => 'CST',
  2168.         'dstshortname' => 'CDT',
  2169.         'longname' => 'Central Standard Time',
  2170.         'dstlongname' => 'Central Daylight Time',
  2171.         'summertimeoffset' => 3600000,
  2172.         'summertimestartmonth' => 3,
  2173.         'summertimestartday' => 'Sun>=8',
  2174.         'summertimestarttime' => 18000000,
  2175.         'summertimeendmonth' => 10,
  2176.         'summertimeendday' => 'lastSun',
  2177.         'summertimeendtime' => 18000000 ),
  2178.     'America/Hermosillo' => array(
  2179.         'offset' => -25200000,
  2180.         'shortname' => 'MST',
  2181.         'dstshortname' => null,
  2182.         'longname' => 'Mountain Standard Time' ),
  2183.     'America/Indiana/Indianapolis' => array(
  2184.         'offset' => -18000000,
  2185.         'shortname' => 'EST',
  2186.         'dstshortname' => 'EDT',
  2187.         'longname' => 'Eastern Standard Time',
  2188.         'summertimeoffset' => 3600000,
  2189.         'summertimestartmonth' => 3,
  2190.         'summertimestartday' => 'Sun>=8',
  2191.         'summertimestarttime' => 25200000,
  2192.         'summertimeendmonth' => 11,
  2193.         'summertimeendday' => 'Sun>=1',
  2194.         'summertimeendtime' => 21600000 ),
  2195.     'America/Indiana/Knox' => array(
  2196.         'offset' => -21600000,
  2197.         'shortname' => 'CST',
  2198.         'dstshortname' => 'CDT',
  2199.         'longname' => 'Central Standard Time',
  2200.         'dstlongname' => 'Central Daylight Time',
  2201.         'summertimeoffset' => 3600000,
  2202.         'summertimestartmonth' => 3,
  2203.         'summertimestartday' => 'Sun>=8',
  2204.         'summertimestarttime' => 28800000,
  2205.         'summertimeendmonth' => 11,
  2206.         'summertimeendday' => 'Sun>=1',
  2207.         'summertimeendtime' => 25200000 ),
  2208.     'America/Indiana/Marengo' => array(
  2209.         'offset' => -18000000,
  2210.         'shortname' => 'EST',
  2211.         'dstshortname' => 'EDT',
  2212.         'longname' => 'Eastern Standard Time',
  2213.         'summertimeoffset' => 3600000,
  2214.         'summertimestartmonth' => 3,
  2215.         'summertimestartday' => 'Sun>=8',
  2216.         'summertimestarttime' => 25200000,
  2217.         'summertimeendmonth' => 11,
  2218.         'summertimeendday' => 'Sun>=1',
  2219.         'summertimeendtime' => 21600000 ),
  2220.     'America/Indiana/Petersburg' => array(
  2221.         'offset' => -18000000,
  2222.         'shortname' => 'EST',
  2223.         'dstshortname' => 'EDT',
  2224.         'summertimeoffset' => 3600000,
  2225.         'summertimestartmonth' => 3,
  2226.         'summertimestartday' => 'Sun>=8',
  2227.         'summertimestarttime' => 25200000,
  2228.         'summertimeendmonth' => 11,
  2229.         'summertimeendday' => 'Sun>=1',
  2230.         'summertimeendtime' => 21600000 ),
  2231.     'America/Indiana/Tell_City' => array(
  2232.         'offset' => -21600000,
  2233.         'shortname' => 'CST',
  2234.         'dstshortname' => 'CDT',
  2235.         'summertimeoffset' => 3600000,
  2236.         'summertimestartmonth' => 3,
  2237.         'summertimestartday' => 'Sun>=8',
  2238.         'summertimestarttime' => 28800000,
  2239.         'summertimeendmonth' => 11,
  2240.         'summertimeendday' => 'Sun>=1',
  2241.         'summertimeendtime' => 25200000 ),
  2242.     'America/Indiana/Vevay' => array(
  2243.         'offset' => -18000000,
  2244.         'shortname' => 'EST',
  2245.         'dstshortname' => 'EDT',
  2246.         'longname' => 'Eastern Standard Time',
  2247.         'summertimeoffset' => 3600000,
  2248.         'summertimestartmonth' => 3,
  2249.         'summertimestartday' => 'Sun>=8',
  2250.         'summertimestarttime' => 25200000,
  2251.         'summertimeendmonth' => 11,
  2252.         'summertimeendday' => 'Sun>=1',
  2253.         'summertimeendtime' => 21600000 ),
  2254.     'America/Indiana/Vincennes' => array(
  2255.         'offset' => -18000000,
  2256.         'shortname' => 'EST',
  2257.         'dstshortname' => 'EDT',
  2258.         'summertimeoffset' => 3600000,
  2259.         'summertimestartmonth' => 3,
  2260.         'summertimestartday' => 'Sun>=8',
  2261.         'summertimestarttime' => 25200000,
  2262.         'summertimeendmonth' => 11,
  2263.         'summertimeendday' => 'Sun>=1',
  2264.         'summertimeendtime' => 21600000 ),
  2265.     'America/Indiana/Winamac' => array(
  2266.         'offset' => -18000000,
  2267.         'shortname' => 'EST',
  2268.         'dstshortname' => 'EDT',
  2269.         'summertimeoffset' => 3600000,
  2270.         'summertimestartmonth' => 3,
  2271.         'summertimestartday' => 'Sun>=8',
  2272.         'summertimestarttime' => 25200000,
  2273.         'summertimeendmonth' => 11,
  2274.         'summertimeendday' => 'Sun>=1',
  2275.         'summertimeendtime' => 21600000 ),
  2276.     'America/Indianapolis' => array(
  2277.         'offset' => -18000000,
  2278.         'shortname' => 'EST',
  2279.         'dstshortname' => 'EDT',
  2280.         'longname' => 'Eastern Standard Time',
  2281.         'summertimeoffset' => 3600000,
  2282.         'summertimestartmonth' => 3,
  2283.         'summertimestartday' => 'Sun>=8',
  2284.         'summertimestarttime' => 25200000,
  2285.         'summertimeendmonth' => 11,
  2286.         'summertimeendday' => 'Sun>=1',
  2287.         'summertimeendtime' => 21600000 ),
  2288.     'America/Inuvik' => array(
  2289.         'offset' => -25200000,
  2290.         'shortname' => 'MST',
  2291.         'dstshortname' => 'MDT',
  2292.         'longname' => 'Mountain Standard Time',
  2293.         'dstlongname' => 'Mountain Daylight Time',
  2294.         'summertimeoffset' => 3600000,
  2295.         'summertimestartmonth' => 3,
  2296.         'summertimestartday' => 'Sun>=8',
  2297.         'summertimestarttime' => 32400000,
  2298.         'summertimeendmonth' => 11,
  2299.         'summertimeendday' => 'Sun>=1',
  2300.         'summertimeendtime' => 28800000 ),
  2301.     'America/Iqaluit' => array(
  2302.         'offset' => -18000000,
  2303.         'shortname' => 'EST',
  2304.         'dstshortname' => 'EDT',
  2305.         'longname' => 'Eastern Standard Time',
  2306.         'dstlongname' => 'Eastern Daylight Time',
  2307.         'summertimeoffset' => 3600000,
  2308.         'summertimestartmonth' => 3,
  2309.         'summertimestartday' => 'Sun>=8',
  2310.         'summertimestarttime' => 25200000,
  2311.         'summertimeendmonth' => 11,
  2312.         'summertimeendday' => 'Sun>=1',
  2313.         'summertimeendtime' => 21600000 ),
  2314.     'America/Jamaica' => array(
  2315.         'offset' => -18000000,
  2316.         'shortname' => 'EST',
  2317.         'dstshortname' => null,
  2318.         'longname' => 'Eastern Standard Time' ),
  2319.     'America/Jujuy' => array(
  2320.         'offset' => -10800000,
  2321.         'shortname' => 'ART',
  2322.         'dstshortname' => 'ARST',
  2323.         'longname' => 'Argentine Time',
  2324.         'summertimeoffset' => 3600000,
  2325.         'summertimestartmonth' => 10,
  2326.         'summertimestartday' => 'Sun>=1',
  2327.         'summertimestarttime' => 0,
  2328.         'summertimeendmonth' => 3,
  2329.         'summertimeendday' => 'Sun>=15',
  2330.         'summertimeendtime' => 0 ),
  2331.     'America/Juneau' => array(
  2332.         'offset' => -32400000,
  2333.         'shortname' => 'AKST',
  2334.         'dstshortname' => 'AKDT',
  2335.         'longname' => 'Alaska Standard Time',
  2336.         'dstlongname' => 'Alaska Daylight Time',
  2337.         'summertimeoffset' => 3600000,
  2338.         'summertimestartmonth' => 3,
  2339.         'summertimestartday' => 'Sun>=8',
  2340.         'summertimestarttime' => 39600000,
  2341.         'summertimeendmonth' => 11,
  2342.         'summertimeendday' => 'Sun>=1',
  2343.         'summertimeendtime' => 36000000 ),
  2344.     'America/Kentucky/Louisville' => array(
  2345.         'offset' => -18000000,
  2346.         'shortname' => 'EST',
  2347.         'dstshortname' => 'EDT',
  2348.         'longname' => 'Eastern Standard Time',
  2349.         'dstlongname' => 'Eastern Daylight Time',
  2350.         'summertimeoffset' => 3600000,
  2351.         'summertimestartmonth' => 3,
  2352.         'summertimestartday' => 'Sun>=8',
  2353.         'summertimestarttime' => 25200000,
  2354.         'summertimeendmonth' => 11,
  2355.         'summertimeendday' => 'Sun>=1',
  2356.         'summertimeendtime' => 21600000 ),
  2357.     'America/Kentucky/Monticello' => array(
  2358.         'offset' => -18000000,
  2359.         'shortname' => 'EST',
  2360.         'dstshortname' => 'EDT',
  2361.         'longname' => 'Eastern Standard Time',
  2362.         'dstlongname' => 'Eastern Daylight Time',
  2363.         'summertimeoffset' => 3600000,
  2364.         'summertimestartmonth' => 3,
  2365.         'summertimestartday' => 'Sun>=8',
  2366.         'summertimestarttime' => 25200000,
  2367.         'summertimeendmonth' => 11,
  2368.         'summertimeendday' => 'Sun>=1',
  2369.         'summertimeendtime' => 21600000 ),
  2370.     'America/Knox_IN' => array(
  2371.         'offset' => -21600000,
  2372.         'shortname' => 'CST',
  2373.         'dstshortname' => 'CDT',
  2374.         'longname' => 'Central Standard Time',
  2375.         'dstlongname' => 'Central Daylight Time',
  2376.         'summertimeoffset' => 3600000,
  2377.         'summertimestartmonth' => 3,
  2378.         'summertimestartday' => 'Sun>=8',
  2379.         'summertimestarttime' => 28800000,
  2380.         'summertimeendmonth' => 11,
  2381.         'summertimeendday' => 'Sun>=1',
  2382.         'summertimeendtime' => 25200000 ),
  2383.     'America/La_Paz' => array(
  2384.         'offset' => -14400000,
  2385.         'shortname' => 'BOT',
  2386.         'dstshortname' => null,
  2387.         'longname' => 'Bolivia Time' ),
  2388.     'America/Lima' => array(
  2389.         'offset' => -18000000,
  2390.         'shortname' => 'PET',
  2391.         'dstshortname' => null,
  2392.         'longname' => 'Peru Time' ),
  2393.     'America/Los_Angeles' => array(
  2394.         'offset' => -28800000,
  2395.         'shortname' => 'PST',
  2396.         'dstshortname' => 'PDT',
  2397.         'longname' => 'Pacific Standard Time',
  2398.         'dstlongname' => 'Pacific Daylight Time',
  2399.         'summertimeoffset' => 3600000,
  2400.         'summertimestartmonth' => 3,
  2401.         'summertimestartday' => 'Sun>=8',
  2402.         'summertimestarttime' => 36000000,
  2403.         'summertimeendmonth' => 11,
  2404.         'summertimeendday' => 'Sun>=1',
  2405.         'summertimeendtime' => 32400000 ),
  2406.     'America/Louisville' => array(
  2407.         'offset' => -18000000,
  2408.         'shortname' => 'EST',
  2409.         'dstshortname' => 'EDT',
  2410.         'longname' => 'Eastern Standard Time',
  2411.         'dstlongname' => 'Eastern Daylight Time',
  2412.         'summertimeoffset' => 3600000,
  2413.         'summertimestartmonth' => 3,
  2414.         'summertimestartday' => 'Sun>=8',
  2415.         'summertimestarttime' => 25200000,
  2416.         'summertimeendmonth' => 11,
  2417.         'summertimeendday' => 'Sun>=1',
  2418.         'summertimeendtime' => 21600000 ),
  2419.     'America/Maceio' => array(
  2420.         'offset' => -10800000,
  2421.         'shortname' => 'BRT',
  2422.         'dstshortname' => null,
  2423.         'longname' => 'Brazil Time',
  2424.         'dstlongname' => 'Brazil Summer Time' ),
  2425.     'America/Managua' => array(
  2426.         'offset' => -21600000,
  2427.         'shortname' => 'CST',
  2428.         'dstshortname' => null,
  2429.         'longname' => 'Central Standard Time' ),
  2430.     'America/Manaus' => array(
  2431.         'offset' => -14400000,
  2432.         'shortname' => 'AMT',
  2433.         'dstshortname' => null,
  2434.         'longname' => 'Amazon Standard Time' ),
  2435.     'America/Marigot' => array(
  2436.         'offset' => -14400000,
  2437.         'shortname' => 'AST',
  2438.         'dstshortname' => null ),
  2439.     'America/Martinique' => array(
  2440.         'offset' => -14400000,
  2441.         'shortname' => 'AST',
  2442.         'dstshortname' => null,
  2443.         'longname' => 'Atlantic Standard Time' ),
  2444.     'America/Mazatlan' => array(
  2445.         'offset' => -25200000,
  2446.         'shortname' => 'MST',
  2447.         'dstshortname' => 'MDT',