home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 6 / AACD06.ISO / AACD / Programming / ICU / src / icu / source / i18n / timezone.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1999-10-28  |  120.3 KB  |  2,255 lines

  1. /*
  2. ********************************************************************************
  3. *                                                                              *
  4. * COPYRIGHT:                                                                   *
  5. *   (C) Copyright Taligent, Inc.,  1997                                        *
  6. *   (C) Copyright International Business Machines Corporation,  1997-1998      *
  7. *   Licensed Material - Program-Property of IBM - All Rights Reserved.         *
  8. *   US Government Users Restricted Rights - Use, duplication, or disclosure    *
  9. *   restricted by GSA ADP Schedule Contract with IBM Corp.                     *
  10. *                                                                              *
  11. ********************************************************************************
  12. *
  13. * File TIMEZONE.CPP
  14. *
  15. * Modification History:
  16. *
  17. *   Date        Name        Description
  18. *   12/05/96    clhuang     Creation.
  19. *   04/21/97    aliu        General clean-up and bug fixing.
  20. *   05/08/97    aliu        Fixed Hashtable code per code review.
  21. *   07/09/97    helena      Changed createInstance to createDefault.
  22. *   07/29/97    aliu        Updated with all-new list of 96 UNIX-derived
  23. *                           TimeZones.  Changed mechanism to load from static
  24. *                           array rather than resource bundle.
  25. *   07/07/1998  srl         Bugfixes from the Java side: UTC GMT CAT NST
  26. *                           Added getDisplayName API
  27. *                           going to add custom parsing.
  28. *
  29. *                           ISSUES:
  30. *                               - should getDisplayName cache something?
  31. *                               - should custom time zones be cached? [probably]
  32. *  08/10/98     stephen     Brought getDisplayName() API in-line w/ conventions
  33. *  08/19/98     stephen     Changed createTimeZone() to never return 0
  34. *  09/02/98     stephen     Added getOffset(monthLen) and hasSameRules()
  35. *  09/15/98     stephen     Added getStaticClassID()
  36. *  02/22/99     stephen     Removed character literals for EBCDIC safety
  37. *  05/04/99     stephen     Changed initDefault() for Mutex issues
  38. *  07/12/99     helena      HPUX 11 CC Port.
  39. *********************************************************************************/
  40.  
  41. #include "uhash.h"
  42. #include "simpletz.h"
  43. #include "smpdtfmt.h"
  44. #include "calendar.h"
  45. #include "mutex.h"
  46.  
  47. #ifdef _DEBUG
  48. #include "unistrm.h"
  49. #endif
  50.  
  51. // static initialization
  52. char TimeZone::fgClassID = 0; // Value is irrelevant
  53. int32_t TimeZone::fTimezoneCount = 0;
  54. TimeZone*  TimeZone::fgDefaultZone = NULL;
  55. UHashtable* TimeZone::fgHashtable   = NULL;
  56.  
  57. /**
  58.  * Delete the given object, assuming it is a TimeZone.  Used by Hashtable.
  59.  */
  60. void
  61. TimeZone::deleteTimeZone(void* obj)
  62. {
  63.     delete (TimeZone*)obj;
  64. }
  65.  
  66. // ResourceBundle file, locale, and resource name
  67. //const char* TimeZone::kTimeZoneResource = "timezone";
  68.  
  69. // There MUST be a TimeZone with this ID within kSystemTimeZones
  70. UnicodeString TimeZone::kLastResortID("Africa/Casablanca"); // GMT
  71. //const int32_t TimeZone::kLastResortOffset = 0;
  72.  
  73. // Array of UnicodeString objects for available IDs
  74. UnicodeString* TimeZone::fgAvailableIDs = 0;
  75. int32_t TimeZone::fgAvailableIDsCount = 0; 
  76.  
  77. const int32_t TimeZone::millisPerHour = U_MILLIS_PER_HOUR;
  78.  
  79. const UnicodeString     TimeZone::GMT_ID        = "GMT";
  80. const int32_t             TimeZone::GMT_ID_LENGTH = 3;
  81. const UnicodeString     TimeZone::CUSTOM_ID     = "Custom";
  82.  
  83. const TimeZone*            TimeZone::GMT = new SimpleTimeZone(0, GMT_ID);
  84.  
  85. UErrorCode                TimeZone::fgStatus = U_ZERO_ERROR;
  86.  
  87. /* Lazy evaluated.  HPUX CC compiler can't handle array initialization 
  88. with complex objects */
  89. /*const int32_t TimeZone::kSystemTimeZonesCount = 320;*/
  90. /* {sfb} illegal to have non-const array dimension */
  91. #define kSystemTimeZonesCount 500
  92. bool_t TimeZone::kSystemInited = FALSE;
  93. SimpleTimeZone* TimeZone::kSystemTimeZones[kSystemTimeZonesCount];
  94.  
  95. void
  96. TimeZone::initSystemTimeZones(void)
  97. {
  98.   if (kSystemInited == FALSE) {
  99.     kSystemInited = TRUE;
  100.     // Migration from Java:
  101.     //  - replace ONE_HOUR with U_MILLIS_PER_HOUR
  102.     //  - replace (int) with (int32_t)
  103.  
  104.     // The following data is current as of 1998.
  105.     // Total Unix zones: 343
  106.     // Total Java zones: 289
  107.     // Not all Unix zones become Java zones due to duplication and overlap.
  108.     //----------------------------------------------------------
  109.     int n = 0;
  110.     kSystemTimeZones[n++] =
  111.     new SimpleTimeZone(-11*U_MILLIS_PER_HOUR, "Pacific/Niue" /*NUT*/);
  112.     // Pacific/Niue Niue(NU)    -11:00  -   NUT
  113.     //----------------------------------------------------------
  114.     kSystemTimeZones[n++] =
  115.     new SimpleTimeZone(-11*U_MILLIS_PER_HOUR, "Pacific/Apia" /*WST*/);
  116.     // Pacific/Apia W Samoa(WS) -11:00  -   WST # W Samoa Time
  117.     kSystemTimeZones[n++] =
  118.     new SimpleTimeZone(-11*U_MILLIS_PER_HOUR, "MIT" /*alias for Pacific/Apia*/);
  119.     //----------------------------------------------------------
  120.     kSystemTimeZones[n++] =
  121.     new SimpleTimeZone(-11*U_MILLIS_PER_HOUR, "Pacific/Pago_Pago" /*SST*/);
  122.     // Pacific/Pago_Pago    American Samoa(US)  -11:00  -   SST # S=Samoa
  123.     //----------------------------------------------------------
  124.     kSystemTimeZones[n++] =
  125.     new SimpleTimeZone(-10*U_MILLIS_PER_HOUR, "Pacific/Tahiti" /*TAHT*/);
  126.     // Pacific/Tahiti   French Polynesia(PF)    -10:00  -   TAHT    # Tahiti Time
  127.     //----------------------------------------------------------
  128.     kSystemTimeZones[n++] =
  129.     new SimpleTimeZone(-10*U_MILLIS_PER_HOUR, "Pacific/Fakaofo" /*TKT*/);
  130.     // Pacific/Fakaofo  Tokelau Is(TK)  -10:00  -   TKT # Tokelau Time
  131.     //----------------------------------------------------------
  132.     kSystemTimeZones[n++] =
  133.     new SimpleTimeZone(-10*U_MILLIS_PER_HOUR, "Pacific/Honolulu" /*HST*/);
  134.     // Pacific/Honolulu Hawaii(US)  -10:00  -   HST
  135.     kSystemTimeZones[n++] =
  136.     new SimpleTimeZone(-10*U_MILLIS_PER_HOUR, "HST" /*alias for Pacific/Honolulu*/);
  137.     //----------------------------------------------------------
  138.     kSystemTimeZones[n++] =
  139.     new SimpleTimeZone(-10*U_MILLIS_PER_HOUR, "America/Adak" /*HA%sT*/,
  140.       Calendar::APRIL, 1, -Calendar::SUNDAY /*DOW>=DOM*/, 2*U_MILLIS_PER_HOUR,
  141.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR, fgStatus);
  142.     // Rule US  1967    max -   Oct lastSun 2:00    0   S
  143.     // Rule US  1987    max -   Apr Sun>=1  2:00    1:00    D
  144.     // America/Adak Alaska(US)  -10:00  US  HA%sT
  145.     //----------------------------------------------------------
  146.     kSystemTimeZones[n++] =
  147.     new SimpleTimeZone(-10*U_MILLIS_PER_HOUR, "Pacific/Rarotonga" /*CK%sT*/,
  148.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 0*U_MILLIS_PER_HOUR,
  149.       Calendar::MARCH, 1, -Calendar::SUNDAY /*DOW>=DOM*/, 0*U_MILLIS_PER_HOUR, (int32_t)(0.5*U_MILLIS_PER_HOUR), fgStatus);
  150.     // Rule Cook    1979    max -   Mar Sun>=1  0:00    0   -
  151.     // Rule Cook    1979    max -   Oct lastSun 0:00    0:30    HS
  152.     // Pacific/Rarotonga    Cook Is(CK) -10:00  Cook    CK%sT
  153.     //----------------------------------------------------------
  154.     kSystemTimeZones[n++] =
  155.     new SimpleTimeZone((int32_t)(-9.5*U_MILLIS_PER_HOUR), "Pacific/Marquesas" /*MART*/);
  156.     // Pacific/Marquesas    French Polynesia(PF)    -9:30   -   MART    # Marquesas Time
  157.     //----------------------------------------------------------
  158.     kSystemTimeZones[n++] =
  159.     new SimpleTimeZone(-9*U_MILLIS_PER_HOUR, "Pacific/Gambier" /*GAMT*/);
  160.     // Pacific/Gambier  French Polynesia(PF)    -9:00   -   GAMT    # Gambier Time
  161.     //----------------------------------------------------------
  162.     kSystemTimeZones[n++] =
  163.     new SimpleTimeZone(-9*U_MILLIS_PER_HOUR, "America/Anchorage" /*AK%sT*/,
  164.       Calendar::APRIL, 1, -Calendar::SUNDAY /*DOW>=DOM*/, 2*U_MILLIS_PER_HOUR,
  165.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  166.     // Rule US  1967    max -   Oct lastSun 2:00    0   S
  167.     // Rule US  1987    max -   Apr Sun>=1  2:00    1:00    D
  168.     // America/Anchorage    Alaska(US)  -9:00   US  AK%sT
  169.     kSystemTimeZones[n++] =
  170.     new SimpleTimeZone(-9*U_MILLIS_PER_HOUR, "AST" /*alias for America/Anchorage*/,
  171.       Calendar::APRIL, 1, -Calendar::SUNDAY /*DOW>=DOM*/, 2*U_MILLIS_PER_HOUR,
  172.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  173.     //----------------------------------------------------------
  174.     kSystemTimeZones[n++] =
  175.     new SimpleTimeZone((int32_t)(-8.5*U_MILLIS_PER_HOUR), "Pacific/Pitcairn" /*PNT*/);
  176.     // Pacific/Pitcairn Pitcairn(PN)    -8:30   -   PNT # Pitcairn Time
  177.     //----------------------------------------------------------
  178.     kSystemTimeZones[n++] =
  179.     new SimpleTimeZone(-8*U_MILLIS_PER_HOUR, "America/Vancouver" /*P%sT*/,
  180.       Calendar::APRIL, 1, -Calendar::SUNDAY /*DOW>=DOM*/, 2*U_MILLIS_PER_HOUR,
  181.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  182.     // Rule Vanc    1962    max -   Oct lastSun 2:00    0   S
  183.     // Rule Vanc    1987    max -   Apr Sun>=1  2:00    1:00    D
  184.     // America/Vancouver    British Columbia(CA)    -8:00   Vanc    P%sT
  185.     //----------------------------------------------------------
  186.     kSystemTimeZones[n++] =
  187.     new SimpleTimeZone(-8*U_MILLIS_PER_HOUR, "America/Tijuana" /*P%sT*/,
  188.       Calendar::APRIL, 1, -Calendar::SUNDAY /*DOW>=DOM*/, 2*U_MILLIS_PER_HOUR,
  189.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  190.     // Rule Mexico  1996    max -   Apr Sun>=1  2:00    1:00    D
  191.     // Rule Mexico  1996    max -   Oct lastSun 2:00    0   S
  192.     // America/Tijuana  Mexico(MX)  -8:00   Mexico  P%sT
  193.     //----------------------------------------------------------
  194.     kSystemTimeZones[n++] =
  195.     new SimpleTimeZone(-8*U_MILLIS_PER_HOUR, "America/Los_Angeles" /*P%sT*/,
  196.       Calendar::APRIL, 1, -Calendar::SUNDAY /*DOW>=DOM*/, 2*U_MILLIS_PER_HOUR,
  197.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  198.     // Rule US  1967    max -   Oct lastSun 2:00    0   S
  199.     // Rule US  1987    max -   Apr Sun>=1  2:00    1:00    D
  200.     // America/Los_Angeles  US Pacific time, represented by Los Angeles(US) -8:00   US  P%sT
  201.     kSystemTimeZones[n++] =
  202.     new SimpleTimeZone(-8*U_MILLIS_PER_HOUR, "PST" /*alias for America/Los_Angeles*/,
  203.       Calendar::APRIL, 1, -Calendar::SUNDAY /*DOW>=DOM*/, 2*U_MILLIS_PER_HOUR,
  204.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  205.     //----------------------------------------------------------
  206.     kSystemTimeZones[n++] =
  207.     new SimpleTimeZone(-7*U_MILLIS_PER_HOUR, "America/Dawson_Creek" /*MST*/);
  208.     // America/Dawson_Creek British Columbia(CA)    -7:00   -   MST
  209.     //----------------------------------------------------------
  210.     kSystemTimeZones[n++] =
  211.     new SimpleTimeZone(-7*U_MILLIS_PER_HOUR, "America/Phoenix" /*MST*/);
  212.     // America/Phoenix  ?(US)   -7:00   -   MST     
  213.     kSystemTimeZones[n++] =
  214.     new SimpleTimeZone(-7*U_MILLIS_PER_HOUR, "America/Edmonton" /*M%sT*/,
  215.       Calendar::APRIL, 1, -Calendar::SUNDAY /*DOW>=DOM*/, 2*U_MILLIS_PER_HOUR,
  216.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  217.     // Rule Edm 1972    max -   Oct lastSun 2:00    0   S
  218.     // Rule Edm 1987    max -   Apr Sun>=1  2:00    1:00    D
  219.     // America/Edmonton Alberta(CA) -7:00   Edm M%sT
  220.     //----------------------------------------------------------
  221.     kSystemTimeZones[n++] =
  222.     new SimpleTimeZone(-7*U_MILLIS_PER_HOUR, "America/Mazatlan" /*M%sT*/,
  223.       Calendar::APRIL, 1, -Calendar::SUNDAY /*DOW>=DOM*/, 2*U_MILLIS_PER_HOUR,
  224.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  225.     // Rule Mexico  1996    max -   Apr Sun>=1  2:00    1:00    D
  226.     // Rule Mexico  1996    max -   Oct lastSun 2:00    0   S
  227.     // America/Mazatlan Mexico(MX)  -7:00   Mexico  M%sT
  228.     //----------------------------------------------------------
  229.     kSystemTimeZones[n++] =
  230.     new SimpleTimeZone(-7*U_MILLIS_PER_HOUR, "America/Denver" /*M%sT*/,
  231.       Calendar::APRIL, 1, -Calendar::SUNDAY /*DOW>=DOM*/, 2*U_MILLIS_PER_HOUR,
  232.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  233.     // Rule US  1967    max -   Oct lastSun 2:00    0   S
  234.     // Rule US  1987    max -   Apr Sun>=1  2:00    1:00    D
  235.     // America/Denver   US Mountain time, represented by Denver(US) -7:00   US  M%sT
  236.     kSystemTimeZones[n++] =
  237.     new SimpleTimeZone(-7*U_MILLIS_PER_HOUR, "MST" /*alias for America/Denver*/,
  238.       Calendar::APRIL, 1, -Calendar::SUNDAY /*DOW>=DOM*/, 2*U_MILLIS_PER_HOUR,
  239.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  240.     //----------------------------------------------------------
  241.     kSystemTimeZones[n++] =
  242.     new SimpleTimeZone(-6*U_MILLIS_PER_HOUR, "America/Belize" /*C%sT*/);
  243.     // America/Belize   Belize(BZ)  -6:00   -   C%sT
  244.     //----------------------------------------------------------
  245.     kSystemTimeZones[n++] =
  246.     new SimpleTimeZone(-6*U_MILLIS_PER_HOUR, "America/Regina" /*CST*/);
  247.     // America/Regina   Saskatchewan(CA)    -6:00   -   CST
  248.     //----------------------------------------------------------
  249.     kSystemTimeZones[n++] =
  250.     new SimpleTimeZone(-6*U_MILLIS_PER_HOUR, "Pacific/Galapagos" /*GALT*/);
  251.     // Pacific/Galapagos    Ecuador(EC) -6:00   -   GALT    # Galapagos Time
  252.     //----------------------------------------------------------
  253.     kSystemTimeZones[n++] =
  254.     new SimpleTimeZone(-6*U_MILLIS_PER_HOUR, "America/Guatemala" /*C%sT*/);
  255.     // America/Guatemala    Guatemala(GT)   -6:00   -   C%sT
  256.     //----------------------------------------------------------
  257.     kSystemTimeZones[n++] =
  258.     new SimpleTimeZone(-6*U_MILLIS_PER_HOUR, "America/Tegucigalpa" /*C%sT*/);
  259.     // America/Tegucigalpa  Honduras(HN)    -6:00   -   C%sT
  260.     //----------------------------------------------------------
  261.     kSystemTimeZones[n++] =
  262.     new SimpleTimeZone(-6*U_MILLIS_PER_HOUR, "America/El_Salvador" /*C%sT*/);
  263.     // America/El_Salvador  El Salvador(SV) -6:00   -   C%sT
  264.     //----------------------------------------------------------
  265.     kSystemTimeZones[n++] =
  266.     new SimpleTimeZone(-6*U_MILLIS_PER_HOUR, "America/Costa_Rica" /*C%sT*/);
  267.     // America/Costa_Rica   Costa Rica(CR)  -6:00   -   C%sT
  268.     //----------------------------------------------------------
  269.     kSystemTimeZones[n++] =
  270.     new SimpleTimeZone(-6*U_MILLIS_PER_HOUR, "America/Winnipeg" /*C%sT*/,
  271.       Calendar::APRIL, 1, -Calendar::SUNDAY /*DOW>=DOM*/, 2*U_MILLIS_PER_HOUR,
  272.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  273.     // Rule Winn    1966    max -   Oct lastSun 2:00    0   S
  274.     // Rule Winn    1987    max -   Apr Sun>=1  2:00    1:00    D
  275.     // America/Winnipeg Manitoba(CA)    -6:00   Winn    C%sT
  276.     //----------------------------------------------------------
  277.     kSystemTimeZones[n++] =
  278.     new SimpleTimeZone(-6*U_MILLIS_PER_HOUR, "Pacific/Easter" /*EAS%sT*/,
  279.       Calendar::OCTOBER, 9, -Calendar::SUNDAY /*DOW>=DOM*/, 0*U_MILLIS_PER_HOUR,
  280.       Calendar::MARCH, 9, -Calendar::SUNDAY /*DOW>=DOM*/, 0*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  281.     // Rule Chile   1969    max -   Oct Sun>=9  0:00    1:00    S
  282.     // Rule Chile   1970    max -   Mar Sun>=9  0:00    0   -
  283.     // Pacific/Easter   Chile(CL)   -6:00   Chile   EAS%sT
  284.     //----------------------------------------------------------
  285.     kSystemTimeZones[n++] =
  286.     new SimpleTimeZone(-6*U_MILLIS_PER_HOUR, "America/Mexico_City" /*C%sT*/,
  287.       Calendar::APRIL, 1, -Calendar::SUNDAY /*DOW>=DOM*/, 2*U_MILLIS_PER_HOUR,
  288.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  289.     // Rule Mexico  1996    max -   Apr Sun>=1  2:00    1:00    D
  290.     // Rule Mexico  1996    max -   Oct lastSun 2:00    0   S
  291.     // America/Mexico_City  Mexico(MX)  -6:00   Mexico  C%sT
  292.     //----------------------------------------------------------
  293.     kSystemTimeZones[n++] =
  294.     new SimpleTimeZone(-6*U_MILLIS_PER_HOUR, "America/Chicago" /*C%sT*/,
  295.       Calendar::APRIL, 1, -Calendar::SUNDAY /*DOW>=DOM*/, 2*U_MILLIS_PER_HOUR,
  296.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  297.     // Rule US  1967    max -   Oct lastSun 2:00    0   S
  298.     // Rule US  1987    max -   Apr Sun>=1  2:00    1:00    D
  299.     // America/Chicago  US Central time, represented by Chicago(US) -6:00   US  C%sT
  300.     kSystemTimeZones[n++] =
  301.     new SimpleTimeZone(-6*U_MILLIS_PER_HOUR, "CST" /*alias for America/Chicago*/,
  302.       Calendar::APRIL, 1, -Calendar::SUNDAY /*DOW>=DOM*/, 2*U_MILLIS_PER_HOUR,
  303.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  304.     //----------------------------------------------------------
  305.     kSystemTimeZones[n++] =
  306.     new SimpleTimeZone(-5*U_MILLIS_PER_HOUR, "America/Porto_Acre" /*AST*/);
  307.     // America/Porto_Acre   Brazil(BR)  -5:00   -   AST
  308.     //----------------------------------------------------------
  309.     kSystemTimeZones[n++] =
  310.     new SimpleTimeZone(-5*U_MILLIS_PER_HOUR, "America/Bogota" /*CO%sT*/);
  311.     // America/Bogota   Colombia(CO)    -5:00   -   CO%sT   # Colombia Time
  312.     //----------------------------------------------------------
  313.     kSystemTimeZones[n++] =
  314.     new SimpleTimeZone(-5*U_MILLIS_PER_HOUR, "America/Guayaquil" /*ECT*/);
  315.     // America/Guayaquil    Ecuador(EC) -5:00   -   ECT # Ecuador Time
  316.     //----------------------------------------------------------
  317.     kSystemTimeZones[n++] =
  318.     new SimpleTimeZone(-5*U_MILLIS_PER_HOUR, "America/Jamaica" /*EST*/);
  319.     // America/Jamaica  Jamaica(JM) -5:00   -   EST
  320.     //----------------------------------------------------------
  321.     kSystemTimeZones[n++] =
  322.     new SimpleTimeZone(-5*U_MILLIS_PER_HOUR, "America/Cayman" /*EST*/);
  323.     // America/Cayman   Cayman Is(KY)   -5:00   -   EST
  324.     //----------------------------------------------------------
  325.     kSystemTimeZones[n++] =
  326.     new SimpleTimeZone(-5*U_MILLIS_PER_HOUR, "America/Managua" /*EST*/);
  327.     // America/Managua  Nicaragua(NI)   -5:00   -   EST
  328.     //----------------------------------------------------------
  329.     kSystemTimeZones[n++] =
  330.     new SimpleTimeZone(-5*U_MILLIS_PER_HOUR, "America/Panama" /*EST*/);
  331.     // America/Panama   Panama(PA)  -5:00   -   EST
  332.     //----------------------------------------------------------
  333.     kSystemTimeZones[n++] =
  334.     new SimpleTimeZone(-5*U_MILLIS_PER_HOUR, "America/Lima" /*PE%sT*/);
  335.     // America/Lima Peru(PE)    -5:00   -   PE%sT   # Peru Time
  336.     //----------------------------------------------------------
  337.     kSystemTimeZones[n++] =
  338.     new SimpleTimeZone(-5*U_MILLIS_PER_HOUR, "America/Indianapolis" /*EST*/);
  339.     // America/Indianapolis Indiana(US) -5:00   -   EST
  340.     kSystemTimeZones[n++] =
  341.     new SimpleTimeZone(-5*U_MILLIS_PER_HOUR, "IET" /*alias for America/Indianapolis*/);
  342.     //----------------------------------------------------------
  343.     kSystemTimeZones[n++] =
  344.     new SimpleTimeZone(-5*U_MILLIS_PER_HOUR, "America/Nassau" /*E%sT*/,
  345.       Calendar::APRIL, 1, -Calendar::SUNDAY /*DOW>=DOM*/, 2*U_MILLIS_PER_HOUR,
  346.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  347.     // Rule Bahamas 1964    max -   Oct lastSun 2:00    0   S
  348.     // Rule Bahamas 1987    max -   Apr Sun>=1  2:00    1:00    D
  349.     // America/Nassau   Bahamas(BS) -5:00   Bahamas E%sT
  350.     //----------------------------------------------------------
  351.     kSystemTimeZones[n++] =
  352.     new SimpleTimeZone(-5*U_MILLIS_PER_HOUR, "America/Montreal" /*E%sT*/,
  353.       Calendar::APRIL, 1, -Calendar::SUNDAY /*DOW>=DOM*/, 2*U_MILLIS_PER_HOUR,
  354.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  355.     // Rule Mont    1957    max -   Oct lastSun 2:00    0   S
  356.     // Rule Mont    1987    max -   Apr Sun>=1  2:00    1:00    D
  357.     // America/Montreal Ontario, Quebec(CA) -5:00   Mont    E%sT
  358.     //----------------------------------------------------------
  359.     kSystemTimeZones[n++] =
  360.     new SimpleTimeZone(-5*U_MILLIS_PER_HOUR, "America/Havana" /*C%sT*/,
  361.       Calendar::APRIL, 1, -Calendar::SUNDAY /*DOW>=DOM*/, 0*U_MILLIS_PER_HOUR,
  362.       Calendar::OCTOBER, 8, -Calendar::SUNDAY /*DOW>=DOM*/, 1*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  363.     // Rule Cuba    1990    max -   Apr Sun>=1  0:00    1:00    D
  364.     // Rule Cuba    1997    max -   Oct Sun>=8  0:00s   0   S
  365.     // America/Havana   Cuba(CU)    -5:00   Cuba    C%sT
  366.     //----------------------------------------------------------
  367.     kSystemTimeZones[n++] =
  368.     new SimpleTimeZone(-5*U_MILLIS_PER_HOUR, "America/Port-au-Prince" /*E%sT*/,
  369.       Calendar::APRIL, 1, -Calendar::SUNDAY /*DOW>=DOM*/, 1*U_MILLIS_PER_HOUR,
  370.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  371.     // Rule Haiti   1988    max -   Apr Sun>=1  1:00s   1:00    D
  372.     // Rule Haiti   1988    max -   Oct lastSun 1:00s   0   S
  373.     // America/Port-au-Prince   Haiti(HT)   -5:00   Haiti   E%sT
  374.     //----------------------------------------------------------
  375.     kSystemTimeZones[n++] =
  376.     new SimpleTimeZone(-5*U_MILLIS_PER_HOUR, "America/Grand_Turk" /*E%sT*/,
  377.       Calendar::APRIL, 1, -Calendar::SUNDAY /*DOW>=DOM*/, 0*U_MILLIS_PER_HOUR,
  378.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 0*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  379.     // Rule TC  1979    max -   Oct lastSun 0:00    0   S
  380.     // Rule TC  1987    max -   Apr Sun>=1  0:00    1:00    D
  381.     // America/Grand_Turk   Turks and Caicos(TC)    -5:00   TC  E%sT
  382.     //----------------------------------------------------------
  383.     kSystemTimeZones[n++] =
  384.     new SimpleTimeZone(-5*U_MILLIS_PER_HOUR, "America/New_York" /*E%sT*/,
  385.       Calendar::APRIL, 1, -Calendar::SUNDAY /*DOW>=DOM*/, 2*U_MILLIS_PER_HOUR,
  386.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  387.     // Rule US  1967    max -   Oct lastSun 2:00    0   S
  388.     // Rule US  1987    max -   Apr Sun>=1  2:00    1:00    D
  389.     // America/New_York US Eastern time, represented by New York(US)    -5:00   US  E%sT
  390.     kSystemTimeZones[n++] =
  391.     new SimpleTimeZone(-5*U_MILLIS_PER_HOUR, "EST" /*alias for America/New_York*/,
  392.       Calendar::APRIL, 1, -Calendar::SUNDAY /*DOW>=DOM*/, 2*U_MILLIS_PER_HOUR,
  393.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  394.     //----------------------------------------------------------
  395.     kSystemTimeZones[n++] =
  396.     new SimpleTimeZone(-4*U_MILLIS_PER_HOUR, "America/Antigua" /*AST*/);
  397.     // America/Antigua  Antigua and Barbuda(AG) -4:00   -   AST
  398.     //----------------------------------------------------------
  399.     kSystemTimeZones[n++] =
  400.     new SimpleTimeZone(-4*U_MILLIS_PER_HOUR, "America/Anguilla" /*AST*/);
  401.     // America/Anguilla Anguilla(AI)    -4:00   -   AST
  402.     //----------------------------------------------------------
  403.     kSystemTimeZones[n++] =
  404.     new SimpleTimeZone(-4*U_MILLIS_PER_HOUR, "America/Curacao" /*AST*/);
  405.     // America/Curacao  Curacao(AN) -4:00   -   AST
  406.     //----------------------------------------------------------
  407.     kSystemTimeZones[n++] =
  408.     new SimpleTimeZone(-4*U_MILLIS_PER_HOUR, "America/Aruba" /*AST*/);
  409.     // America/Aruba    Aruba(AW)   -4:00   -   AST
  410.     //----------------------------------------------------------
  411.     kSystemTimeZones[n++] =
  412.     new SimpleTimeZone(-4*U_MILLIS_PER_HOUR, "America/Barbados" /*A%sT*/);
  413.     // America/Barbados Barbados(BB)    -4:00   -   A%sT
  414.     //----------------------------------------------------------
  415.     kSystemTimeZones[n++] =
  416.     new SimpleTimeZone(-4*U_MILLIS_PER_HOUR, "America/La_Paz" /*BOT*/);
  417.     // America/La_Paz   Bolivia(BO) -4:00   -   BOT # Bolivia Time
  418.     //----------------------------------------------------------
  419.     kSystemTimeZones[n++] =
  420.     new SimpleTimeZone(-4*U_MILLIS_PER_HOUR, "America/Manaus" /*WST*/);
  421.     // America/Manaus   Brazil(BR)  -4:00   -   WST
  422.     //----------------------------------------------------------
  423.     kSystemTimeZones[n++] =
  424.     new SimpleTimeZone(-4*U_MILLIS_PER_HOUR, "America/Dominica" /*AST*/);
  425.     // America/Dominica Dominica(DM)    -4:00   -   AST
  426.     //----------------------------------------------------------
  427.     kSystemTimeZones[n++] =
  428.     new SimpleTimeZone(-4*U_MILLIS_PER_HOUR, "America/Santo_Domingo" /*AST*/);
  429.     // America/Santo_Domingo    Dominican Republic(DO)  -4:00   -   AST
  430.     //----------------------------------------------------------
  431.     kSystemTimeZones[n++] =
  432.     new SimpleTimeZone(-4*U_MILLIS_PER_HOUR, "America/Grenada" /*AST*/);
  433.     // America/Grenada  Grenada(GD) -4:00   -   AST
  434.     //----------------------------------------------------------
  435.     kSystemTimeZones[n++] =
  436.     new SimpleTimeZone(-4*U_MILLIS_PER_HOUR, "America/Guadeloupe" /*AST*/);
  437.     // America/Guadeloupe   Guadeloupe(GP)  -4:00   -   AST
  438.     //----------------------------------------------------------
  439.     kSystemTimeZones[n++] =
  440.     new SimpleTimeZone(-4*U_MILLIS_PER_HOUR, "America/Guyana" /*GYT*/);
  441.     // America/Guyana   Guyana(GY)  -4:00   -   GYT
  442.     //----------------------------------------------------------
  443.     kSystemTimeZones[n++] =
  444.     new SimpleTimeZone(-4*U_MILLIS_PER_HOUR, "America/St_Kitts" /*AST*/);
  445.     // America/St_Kitts St Kitts-Nevis(KN)  -4:00   -   AST
  446.     //----------------------------------------------------------
  447.     kSystemTimeZones[n++] =
  448.     new SimpleTimeZone(-4*U_MILLIS_PER_HOUR, "America/St_Lucia" /*AST*/);
  449.     // America/St_Lucia St Lucia(LC)    -4:00   -   AST
  450.     //----------------------------------------------------------
  451.     kSystemTimeZones[n++] =
  452.     new SimpleTimeZone(-4*U_MILLIS_PER_HOUR, "America/Martinique" /*AST*/);
  453.     // America/Martinique   Martinique(MQ)  -4:00   -   AST
  454.     //----------------------------------------------------------
  455.     kSystemTimeZones[n++] =
  456.     new SimpleTimeZone(-4*U_MILLIS_PER_HOUR, "America/Montserrat" /*AST*/);
  457.     // America/Montserrat   Montserrat(MS)  -4:00   -   AST
  458.     //----------------------------------------------------------
  459.     kSystemTimeZones[n++] =
  460.     new SimpleTimeZone(-4*U_MILLIS_PER_HOUR, "America/Puerto_Rico" /*AST*/);
  461.     // America/Puerto_Rico  Puerto Rico(PR) -4:00   -   AST
  462.     kSystemTimeZones[n++] =
  463.     new SimpleTimeZone(-4*U_MILLIS_PER_HOUR, "PRT" /*alias for America/Puerto_Rico*/);
  464.     //----------------------------------------------------------
  465.     kSystemTimeZones[n++] =
  466.     new SimpleTimeZone(-4*U_MILLIS_PER_HOUR, "America/Port_of_Spain" /*AST*/);
  467.     // America/Port_of_Spain    Trinidad and Tobago(TT) -4:00   -   AST
  468.     //----------------------------------------------------------
  469.     kSystemTimeZones[n++] =
  470.     new SimpleTimeZone(-4*U_MILLIS_PER_HOUR, "America/St_Vincent" /*AST*/);
  471.     // America/St_Vincent   St Vincent and the Grenadines(VC)   -4:00   -   AST
  472.     //----------------------------------------------------------
  473.     kSystemTimeZones[n++] =
  474.     new SimpleTimeZone(-4*U_MILLIS_PER_HOUR, "America/Tortola" /*AST*/);
  475.     // America/Tortola  British Virgin Is(VG)   -4:00   -   AST
  476.     //----------------------------------------------------------
  477.     kSystemTimeZones[n++] =
  478.     new SimpleTimeZone(-4*U_MILLIS_PER_HOUR, "America/St_Thomas" /*AST*/);
  479.     // America/St_Thomas    Virgin Is(VI)   -4:00   -   AST
  480.     //----------------------------------------------------------
  481.     kSystemTimeZones[n++] =
  482.     new SimpleTimeZone(-4*U_MILLIS_PER_HOUR, "America/Caracas" /*VET*/);
  483.     // America/Caracas  Venezuela(VE)   -4:00   -   VET
  484.     //----------------------------------------------------------
  485.     kSystemTimeZones[n++] =
  486.     new SimpleTimeZone(-4*U_MILLIS_PER_HOUR, "Antarctica/Palmer" /*CL%sT*/,
  487.       Calendar::OCTOBER, 9, -Calendar::SUNDAY /*DOW>=DOM*/, 0*U_MILLIS_PER_HOUR,
  488.       Calendar::MARCH, 9, -Calendar::SUNDAY /*DOW>=DOM*/, 0*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  489.     // Rule ChileAQ 1969    max -   Oct Sun>=9  0:00    1:00    S
  490.     // Rule ChileAQ 1970    max -   Mar Sun>=9  0:00    0   -
  491.     // Antarctica/Palmer    USA - year-round bases(AQ)  -4:00   ChileAQ CL%sT
  492.     //----------------------------------------------------------
  493.     kSystemTimeZones[n++] =
  494.     new SimpleTimeZone(-4*U_MILLIS_PER_HOUR, "Atlantic/Bermuda" /*A%sT*/,
  495.       Calendar::APRIL, 1, -Calendar::SUNDAY /*DOW>=DOM*/, 2*U_MILLIS_PER_HOUR,
  496.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  497.     // Rule Bahamas 1964    max -   Oct lastSun 2:00    0   S
  498.     // Rule Bahamas 1987    max -   Apr Sun>=1  2:00    1:00    D
  499.     // Atlantic/Bermuda Bermuda(BM) -4:00   Bahamas A%sT
  500.     //----------------------------------------------------------
  501.     kSystemTimeZones[n++] =
  502.     new SimpleTimeZone(-4*U_MILLIS_PER_HOUR, "America/Cuiaba" /*W%sT*/,
  503.       Calendar::OCTOBER, 1, -Calendar::SUNDAY /*DOW>=DOM*/, 0*U_MILLIS_PER_HOUR,
  504.       Calendar::FEBRUARY, 11, -Calendar::SUNDAY /*DOW>=DOM*/, 0*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  505.     // Rule Brazil  1998    max -   Oct Sun>=1  0:00    1:00    D
  506.     // Rule Brazil  1999    max -   Feb Sun>=11 0:00    0   S
  507.     // America/Cuiaba   Brazil(BR)  -4:00   Brazil  W%sT
  508.     //----------------------------------------------------------
  509.     kSystemTimeZones[n++] =
  510.     new SimpleTimeZone(-4*U_MILLIS_PER_HOUR, "America/Halifax" /*A%sT*/,
  511.       Calendar::APRIL, 1, -Calendar::SUNDAY /*DOW>=DOM*/, 2*U_MILLIS_PER_HOUR,
  512.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  513.     // Rule Halifax 1962    max -   Oct lastSun 2:00    0   S
  514.     // Rule Halifax 1987    max -   Apr Sun>=1  2:00    1:00    D
  515.     // America/Halifax  ?(CA)   -4:00   Halifax A%sT
  516.     //----------------------------------------------------------
  517.     kSystemTimeZones[n++] =
  518.     new SimpleTimeZone(-4*U_MILLIS_PER_HOUR, "Atlantic/Stanley" /*FK%sT*/,
  519.       Calendar::SEPTEMBER, 8, -Calendar::SUNDAY /*DOW>=DOM*/, 0*U_MILLIS_PER_HOUR,
  520.       Calendar::APRIL, 16, -Calendar::SUNDAY /*DOW>=DOM*/, 0*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  521.     // Rule Falk    1986    max -   Apr Sun>=16 0:00    0   -
  522.     // Rule Falk    1996    max -   Sep Sun>=8  0:00    1:00    S
  523.     // Atlantic/Stanley Falklands(FK)   -4:00   Falk    FK%sT
  524.     //----------------------------------------------------------
  525.     kSystemTimeZones[n++] =
  526.     new SimpleTimeZone(-4*U_MILLIS_PER_HOUR, "America/Thule" /*A%sT*/,
  527.       Calendar::APRIL, 1, -Calendar::SUNDAY /*DOW>=DOM*/, 2*U_MILLIS_PER_HOUR,
  528.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  529.     // Rule Thule   1993    max -   Apr Sun>=1  2:00    1:00    D
  530.     // Rule Thule   1993    max -   Oct lastSun 2:00    0   S
  531.     // America/Thule    ?(GL)   -4:00   Thule   A%sT
  532.     //----------------------------------------------------------
  533.     kSystemTimeZones[n++] =
  534.     new SimpleTimeZone(-4*U_MILLIS_PER_HOUR, "America/Asuncion" /*PY%sT*/,
  535.       Calendar::OCTOBER, 1, 0 /*DOM*/, 0*U_MILLIS_PER_HOUR,
  536.       Calendar::MARCH, 1, 0 /*DOM*/, 0*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  537.     // Rule Para    1996    max -   Mar 1   0:00    0   -
  538.     // Rule Para    1997    max -   Oct 1   0:00    1:00    S
  539.     // America/Asuncion Paraguay(PY)    -4:00   Para    PY%sT
  540.     //----------------------------------------------------------
  541.     kSystemTimeZones[n++] =
  542.     new SimpleTimeZone(-4*U_MILLIS_PER_HOUR, "America/Santiago" /*CL%sT*/,
  543.       Calendar::OCTOBER, 9, -Calendar::SUNDAY /*DOW>=DOM*/, 0*U_MILLIS_PER_HOUR,
  544.       Calendar::MARCH, 9, -Calendar::SUNDAY /*DOW>=DOM*/, 0*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  545.     // Rule Chile   1969    max -   Oct Sun>=9  0:00    1:00    S
  546.     // Rule Chile   1970    max -   Mar Sun>=9  0:00    0   -
  547.     // America/Santiago Chile(CL)   -4:00   Chile   CL%sT
  548.     //----------------------------------------------------------
  549.     kSystemTimeZones[n++] =
  550.     new SimpleTimeZone((int32_t)(-3.5*U_MILLIS_PER_HOUR), "America/St_Johns" /*N%sT*/,
  551.       Calendar::APRIL, 1, -Calendar::SUNDAY /*DOW>=DOM*/, 2*U_MILLIS_PER_HOUR,
  552.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  553.     // Rule StJohns 1960    max -   Oct lastSun 2:00    0   S
  554.     // Rule StJohns 1989    max -   Apr Sun>=1  2:00    1:00    D
  555.     // America/St_Johns Canada(CA)  -3:30   StJohns N%sT
  556.     kSystemTimeZones[n++] =
  557.     new SimpleTimeZone(-3*U_MILLIS_PER_HOUR, "America/Fortaleza" /*EST*/);
  558.     // America/Fortaleza    Brazil(BR)  -3:00   -   EST
  559.     //----------------------------------------------------------
  560.     kSystemTimeZones[n++] =
  561.     new SimpleTimeZone(-3*U_MILLIS_PER_HOUR, "America/Cayenne" /*GFT*/);
  562.     // America/Cayenne  French Guiana(GF)   -3:00   -   GFT
  563.     //----------------------------------------------------------
  564.     kSystemTimeZones[n++] =
  565.     new SimpleTimeZone(-3*U_MILLIS_PER_HOUR, "America/Paramaribo" /*SRT*/);
  566.     // America/Paramaribo   Suriname(SR)    -3:00   -   SRT
  567.     //----------------------------------------------------------
  568.     kSystemTimeZones[n++] =
  569.     new SimpleTimeZone(-3*U_MILLIS_PER_HOUR, "America/Montevideo" /*UY%sT*/);
  570.     // America/Montevideo   Uruguay(UY) -3:00   -   UY%sT
  571.     //----------------------------------------------------------
  572.     kSystemTimeZones[n++] =
  573.     new SimpleTimeZone(-3*U_MILLIS_PER_HOUR, "America/Buenos_Aires" /*AR%sT*/);
  574.     // America/Buenos_Aires Argentina(AR)   -3:00   -   AR%sT
  575.     kSystemTimeZones[n++] =
  576.     new SimpleTimeZone(-3*U_MILLIS_PER_HOUR, "AGT" /*alias for America/Buenos_Aires*/);
  577.     //----------------------------------------------------------
  578.     kSystemTimeZones[n++] =
  579.     new SimpleTimeZone(-3*U_MILLIS_PER_HOUR, "America/Godthab" /*WG%sT*/,
  580.       Calendar::MARCH, -1, Calendar::SATURDAY /*DOW_IN_DOM*/, 22*U_MILLIS_PER_HOUR,
  581.       Calendar::OCTOBER, -1, Calendar::SATURDAY /*DOW_IN_DOM*/, 22*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  582.     // Rule EU  1981    max -   Mar lastSun 1:00u   1:00    S
  583.     // Rule EU  1996    max -   Oct lastSun 1:00u   0   -
  584.     // America/Godthab  ?(GL)   -3:00   EU  WG%sT
  585.     //----------------------------------------------------------
  586.     kSystemTimeZones[n++] =
  587.     new SimpleTimeZone(-3*U_MILLIS_PER_HOUR, "America/Miquelon" /*PM%sT*/,
  588.       Calendar::APRIL, 1, -Calendar::SUNDAY /*DOW>=DOM*/, 2*U_MILLIS_PER_HOUR,
  589.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  590.     // Rule Mont    1957    max -   Oct lastSun 2:00    0   S
  591.     // Rule Mont    1987    max -   Apr Sun>=1  2:00    1:00    D
  592.     // America/Miquelon St Pierre and Miquelon(PM)  -3:00   Mont    PM%sT   # Pierre & Miquelon Time
  593.     //----------------------------------------------------------
  594.     kSystemTimeZones[n++] =
  595.     new SimpleTimeZone(-3*U_MILLIS_PER_HOUR, "America/Sao_Paulo" /*E%sT*/,
  596.       Calendar::OCTOBER, 1, -Calendar::SUNDAY /*DOW>=DOM*/, 0*U_MILLIS_PER_HOUR,
  597.       Calendar::FEBRUARY, 11, -Calendar::SUNDAY /*DOW>=DOM*/, 0*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  598.     // Rule Brazil  1998    max -   Oct Sun>=1  0:00    1:00    D
  599.     // Rule Brazil  1999    max -   Feb Sun>=11 0:00    0   S
  600.     // America/Sao_Paulo    Brazil(BR)  -3:00   Brazil  E%sT
  601.     kSystemTimeZones[n++] =
  602.     new SimpleTimeZone(-3*U_MILLIS_PER_HOUR, "BET" /*alias for America/Sao_Paulo*/,
  603.       Calendar::OCTOBER, 1, -Calendar::SUNDAY /*DOW>=DOM*/, 0*U_MILLIS_PER_HOUR,
  604.       Calendar::FEBRUARY, 11, -Calendar::SUNDAY /*DOW>=DOM*/, 0*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  605.     //----------------------------------------------------------
  606.     kSystemTimeZones[n++] =
  607.     new SimpleTimeZone(-2*U_MILLIS_PER_HOUR, "America/Noronha" /*FST*/);
  608.     // America/Noronha  Brazil(BR)  -2:00   -   FST
  609.     //----------------------------------------------------------
  610.     kSystemTimeZones[n++] =
  611.     new SimpleTimeZone(-2*U_MILLIS_PER_HOUR, "Atlantic/South_Georgia" /*GST*/);
  612.     // Atlantic/South_Georgia   South Georgia(GS)   -2:00   -   GST # South Georgia Time
  613.     //----------------------------------------------------------
  614.     kSystemTimeZones[n++] =
  615.     new SimpleTimeZone(-1*U_MILLIS_PER_HOUR, "Atlantic/Jan_Mayen" /*EGT*/);
  616.     // Atlantic/Jan_Mayen   ?(NO)   -1:00   -   EGT
  617.     //----------------------------------------------------------
  618.     kSystemTimeZones[n++] =
  619.     new SimpleTimeZone(-1*U_MILLIS_PER_HOUR, "Atlantic/Cape_Verde" /*CVT*/);
  620.     // Atlantic/Cape_Verde  Cape Verde(CV)  -1:00   -   CVT
  621.     //----------------------------------------------------------
  622.     kSystemTimeZones[n++] =
  623.     new SimpleTimeZone(-1*U_MILLIS_PER_HOUR, "America/Scoresbysund" /*EG%sT*/,
  624.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 0*U_MILLIS_PER_HOUR,
  625.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 0*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  626.     // Rule EU  1981    max -   Mar lastSun 1:00u   1:00    S
  627.     // Rule EU  1996    max -   Oct lastSun 1:00u   0   -
  628.     // America/Scoresbysund ?(GL)   -1:00   EU  EG%sT
  629.     //----------------------------------------------------------
  630.     kSystemTimeZones[n++] =
  631.     new SimpleTimeZone(-1*U_MILLIS_PER_HOUR, "Atlantic/Azores" /*AZO%sT*/,
  632.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 0*U_MILLIS_PER_HOUR,
  633.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 0*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  634.     // Rule EU  1981    max -   Mar lastSun 1:00u   1:00    S
  635.     // Rule EU  1996    max -   Oct lastSun 1:00u   0   -
  636.     // Atlantic/Azores  Portugal(PT)    -1:00   EU  AZO%sT
  637.     //----------------------------------------------------------
  638.     kSystemTimeZones[n++] =
  639.     new SimpleTimeZone(0*U_MILLIS_PER_HOUR, "Africa/Ouagadougou" /*GMT*/);
  640.     // Africa/Ouagadougou   Burkina Faso(BF)    0:00    -   GMT
  641.     //----------------------------------------------------------
  642.     kSystemTimeZones[n++] =
  643.     new SimpleTimeZone(0*U_MILLIS_PER_HOUR, "Africa/Abidjan" /*GMT*/);
  644.     // Africa/Abidjan   Cote D'Ivoire(CI)   0:00    -   GMT
  645.     //----------------------------------------------------------
  646.     kSystemTimeZones[n++] =
  647.     new SimpleTimeZone(0*U_MILLIS_PER_HOUR, "Africa/Accra" /*%s*/);
  648.     // Africa/Accra Ghana(GH)   0:00    -   %s
  649.     //----------------------------------------------------------
  650.     kSystemTimeZones[n++] =
  651.     new SimpleTimeZone(0*U_MILLIS_PER_HOUR, "Africa/Banjul" /*GMT*/);
  652.     // Africa/Banjul    Gambia(GM)  0:00    -   GMT
  653.     //----------------------------------------------------------
  654.     kSystemTimeZones[n++] =
  655.     new SimpleTimeZone(0*U_MILLIS_PER_HOUR, "Africa/Conakry" /*GMT*/);
  656.     // Africa/Conakry   Guinea(GN)  0:00    -   GMT
  657.     //----------------------------------------------------------
  658.     kSystemTimeZones[n++] =
  659.     new SimpleTimeZone(0*U_MILLIS_PER_HOUR, "Africa/Bissau" /*GMT*/);
  660.     // Africa/Bissau    Guinea-Bissau(GW)   0:00    -   GMT
  661.     //----------------------------------------------------------
  662.     kSystemTimeZones[n++] =
  663.     new SimpleTimeZone(0*U_MILLIS_PER_HOUR, "Atlantic/Reykjavik" /*GMT*/);
  664.     // Atlantic/Reykjavik   Iceland(IS) 0:00    -   GMT
  665.     //----------------------------------------------------------
  666.     kSystemTimeZones[n++] =
  667.     new SimpleTimeZone(0*U_MILLIS_PER_HOUR, "Africa/Monrovia" /*GMT*/);
  668.     // Africa/Monrovia  Liberia(LR) 0:00    -   GMT
  669.     //----------------------------------------------------------
  670.     kSystemTimeZones[n++] =
  671.     new SimpleTimeZone(0*U_MILLIS_PER_HOUR, "Africa/Casablanca" /*WET*/);
  672.     // Africa/Casablanca    Morocco(MA) 0:00    -   WET
  673.     //----------------------------------------------------------
  674.     kSystemTimeZones[n++] =
  675.     new SimpleTimeZone(0*U_MILLIS_PER_HOUR, "Africa/Timbuktu" /*GMT*/);
  676.     // Africa/Timbuktu  Mali(ML)    0:00    -   GMT
  677.     //----------------------------------------------------------
  678.     kSystemTimeZones[n++] =
  679.     new SimpleTimeZone(0*U_MILLIS_PER_HOUR, "Africa/Nouakchott" /*GMT*/);
  680.     // Africa/Nouakchott    Mauritania(MR)  0:00    -   GMT
  681.     //----------------------------------------------------------
  682.     kSystemTimeZones[n++] =
  683.     new SimpleTimeZone(0*U_MILLIS_PER_HOUR, "Atlantic/St_Helena" /*GMT*/);
  684.     // Atlantic/St_Helena   St Helena(SH)   0:00    -   GMT
  685.     //----------------------------------------------------------
  686.     kSystemTimeZones[n++] =
  687.     new SimpleTimeZone(0*U_MILLIS_PER_HOUR, "Africa/Freetown" /*%s*/);
  688.     // Africa/Freetown  Sierra Leone(SL)    0:00    -   %s
  689.     //----------------------------------------------------------
  690.     kSystemTimeZones[n++] =
  691.     new SimpleTimeZone(0*U_MILLIS_PER_HOUR, "Africa/Dakar" /*GMT*/);
  692.     // Africa/Dakar Senegal(SN) 0:00    -   GMT
  693.     //----------------------------------------------------------
  694.     kSystemTimeZones[n++] =
  695.     new SimpleTimeZone(0*U_MILLIS_PER_HOUR, "Africa/Sao_Tome" /*GMT*/);
  696.     // Africa/Sao_Tome  Sao Tome and Principe(ST)   0:00    -   GMT
  697.     //----------------------------------------------------------
  698.     kSystemTimeZones[n++] =
  699.     new SimpleTimeZone(0*U_MILLIS_PER_HOUR, "Africa/Lome" /*GMT*/);
  700.     // Africa/Lome  Togo(TG)    0:00    -   GMT
  701.     //----------------------------------------------------------
  702.     kSystemTimeZones[n++] =
  703.     new SimpleTimeZone(0*U_MILLIS_PER_HOUR, "GMT" /*GMT*/);
  704.     // GMT  -(-)    0:00    -   GMT
  705.     kSystemTimeZones[n++] =
  706.     new SimpleTimeZone(0*U_MILLIS_PER_HOUR, "UTC" /*alias for GMT*/);
  707.     //----------------------------------------------------------
  708.     kSystemTimeZones[n++] =
  709.     new SimpleTimeZone(0*U_MILLIS_PER_HOUR, "Atlantic/Faeroe" /*WE%sT*/,
  710.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 1*U_MILLIS_PER_HOUR,
  711.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 1*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  712.     // Rule EU  1981    max -   Mar lastSun 1:00u   1:00    S
  713.     // Rule EU  1996    max -   Oct lastSun 1:00u   0   -
  714.     // Atlantic/Faeroe  Denmark, Faeroe Islands, and Greenland(DK)  0:00    EU  WE%sT
  715.     //----------------------------------------------------------
  716.     kSystemTimeZones[n++] =
  717.     new SimpleTimeZone(0*U_MILLIS_PER_HOUR, "Atlantic/Canary" /*WE%sT*/,
  718.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 1*U_MILLIS_PER_HOUR,
  719.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 1*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  720.     // Rule EU  1981    max -   Mar lastSun 1:00u   1:00    S
  721.     // Rule EU  1996    max -   Oct lastSun 1:00u   0   -
  722.     // Atlantic/Canary  Spain(ES)   0:00    EU  WE%sT
  723.     //----------------------------------------------------------
  724.     kSystemTimeZones[n++] =
  725.     new SimpleTimeZone(0*U_MILLIS_PER_HOUR, "Europe/Dublin" /*GMT/IST*/,
  726.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 1*U_MILLIS_PER_HOUR,
  727.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 1*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  728.     // Rule EU  1981    max -   Mar lastSun 1:00u   1:00    S
  729.     // Rule EU  1996    max -   Oct lastSun 1:00u   0   -
  730.     // Europe/Dublin    ---(IE) 0:00    EU  GMT/IST
  731.     //----------------------------------------------------------
  732.     kSystemTimeZones[n++] =
  733.     new SimpleTimeZone(0*U_MILLIS_PER_HOUR, "Europe/Lisbon" /*WE%sT*/,
  734.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 1*U_MILLIS_PER_HOUR,
  735.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 1*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  736.     // Rule EU  1981    max -   Mar lastSun 1:00u   1:00    S
  737.     // Rule EU  1996    max -   Oct lastSun 1:00u   0   -
  738.     // Europe/Lisbon    Portugal(PT)    0:00    EU  WE%sT
  739.     //----------------------------------------------------------
  740.     kSystemTimeZones[n++] =
  741.     new SimpleTimeZone(0*U_MILLIS_PER_HOUR, "Europe/London" /*GMT/BST*/,
  742.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 1*U_MILLIS_PER_HOUR,
  743.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 1*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  744.     // Rule EU  1981    max -   Mar lastSun 1:00u   1:00    S
  745.     // Rule EU  1996    max -   Oct lastSun 1:00u   0   -
  746.     // Europe/London    ---(GB) 0:00    EU  GMT/BST
  747.     //----------------------------------------------------------
  748.     kSystemTimeZones[n++] =
  749.     new SimpleTimeZone(1*U_MILLIS_PER_HOUR, "Africa/Luanda" /*WAT*/);
  750.     // Africa/Luanda    Angola(AO)  1:00    -   WAT
  751.     //----------------------------------------------------------
  752.     kSystemTimeZones[n++] =
  753.     new SimpleTimeZone(1*U_MILLIS_PER_HOUR, "Africa/Porto-Novo" /*WAT*/);
  754.     // Africa/Porto-Novo    Benin(BJ)   1:00    -   WAT
  755.     //----------------------------------------------------------
  756.     kSystemTimeZones[n++] =
  757.     new SimpleTimeZone(1*U_MILLIS_PER_HOUR, "Africa/Bangui" /*WAT*/);
  758.     // Africa/Bangui    Central African Republic(CF)    1:00    -   WAT
  759.     //----------------------------------------------------------
  760.     kSystemTimeZones[n++] =
  761.     new SimpleTimeZone(1*U_MILLIS_PER_HOUR, "Africa/Kinshasa" /*WAT*/);
  762.     // Africa/Kinshasa  Democratic Republic of Congo(CG)    1:00    -   WAT
  763.     //----------------------------------------------------------
  764.     kSystemTimeZones[n++] =
  765.     new SimpleTimeZone(1*U_MILLIS_PER_HOUR, "Africa/Douala" /*WAT*/);
  766.     // Africa/Douala    Cameroon(CM)    1:00    -   WAT
  767.     //----------------------------------------------------------
  768.     kSystemTimeZones[n++] =
  769.     new SimpleTimeZone(1*U_MILLIS_PER_HOUR, "Africa/Libreville" /*WAT*/);
  770.     // Africa/Libreville    Gabon(GA)   1:00    -   WAT
  771.     //----------------------------------------------------------
  772.     kSystemTimeZones[n++] =
  773.     new SimpleTimeZone(1*U_MILLIS_PER_HOUR, "Africa/Malabo" /*WAT*/);
  774.     // Africa/Malabo    Equatorial Guinea(GQ)   1:00    -   WAT
  775.     //----------------------------------------------------------
  776.     kSystemTimeZones[n++] =
  777.     new SimpleTimeZone(1*U_MILLIS_PER_HOUR, "Africa/Niamey" /*WAT*/);
  778.     // Africa/Niamey    Niger(NE)   1:00    -   WAT
  779.     //----------------------------------------------------------
  780.     kSystemTimeZones[n++] =
  781.     new SimpleTimeZone(1*U_MILLIS_PER_HOUR, "Africa/Lagos" /*WAT*/);
  782.     // Africa/Lagos Nigeria(NG) 1:00    -   WAT
  783.     //----------------------------------------------------------
  784.     kSystemTimeZones[n++] =
  785.     new SimpleTimeZone(1*U_MILLIS_PER_HOUR, "Africa/Ndjamena" /*WAT*/);
  786.     // Africa/Ndjamena  Chad(TD)    1:00    -   WAT
  787.     //----------------------------------------------------------
  788.     kSystemTimeZones[n++] =
  789.     new SimpleTimeZone(1*U_MILLIS_PER_HOUR, "Africa/Tunis" /*CE%sT*/);
  790.     // Africa/Tunis Tunisia(TN) 1:00    -   CE%sT
  791.     //----------------------------------------------------------
  792.     kSystemTimeZones[n++] =
  793.     new SimpleTimeZone(1*U_MILLIS_PER_HOUR, "Africa/Algiers" /*CET*/);
  794.     // Africa/Algiers   Algeria(DZ) 1:00    -   CET
  795.     //----------------------------------------------------------
  796.     kSystemTimeZones[n++] =
  797.     new SimpleTimeZone(1*U_MILLIS_PER_HOUR, "Europe/Andorra" /*CE%sT*/,
  798.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR,
  799.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  800.     // Rule EU  1981    max -   Mar lastSun 1:00u   1:00    S
  801.     // Rule EU  1996    max -   Oct lastSun 1:00u   0   -
  802.     // Europe/Andorra   Andorra(AD) 1:00    EU  CE%sT
  803.     //----------------------------------------------------------
  804.     kSystemTimeZones[n++] =
  805.     new SimpleTimeZone(1*U_MILLIS_PER_HOUR, "Europe/Tirane" /*CE%sT*/,
  806.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR,
  807.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  808.     // Rule EU  1981    max -   Mar lastSun 1:00u   1:00    S
  809.     // Rule EU  1996    max -   Oct lastSun 1:00u   0   -
  810.     // Europe/Tirane    Albania(AL) 1:00    EU  CE%sT
  811.     //----------------------------------------------------------
  812.     kSystemTimeZones[n++] =
  813.     new SimpleTimeZone(1*U_MILLIS_PER_HOUR, "Europe/Vienna" /*CE%sT*/,
  814.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR,
  815.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  816.     // Rule EU  1981    max -   Mar lastSun 1:00u   1:00    S
  817.     // Rule EU  1996    max -   Oct lastSun 1:00u   0   -
  818.     // Europe/Vienna    Austria(AT) 1:00    EU  CE%sT
  819.     //----------------------------------------------------------
  820.     kSystemTimeZones[n++] =
  821.     new SimpleTimeZone(1*U_MILLIS_PER_HOUR, "Europe/Brussels" /*CE%sT*/,
  822.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR,
  823.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  824.     // Rule EU  1981    max -   Mar lastSun 1:00u   1:00    S
  825.     // Rule EU  1996    max -   Oct lastSun 1:00u   0   -
  826.     // Europe/Brussels  Belgium(BE) 1:00    EU  CE%sT
  827.     //----------------------------------------------------------
  828.     kSystemTimeZones[n++] =
  829.     new SimpleTimeZone(1*U_MILLIS_PER_HOUR, "Europe/Zurich" /*CE%sT*/,
  830.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR,
  831.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  832.     // Rule EU  1981    max -   Mar lastSun 1:00u   1:00    S
  833.     // Rule EU  1996    max -   Oct lastSun 1:00u   0   -
  834.     // Europe/Zurich    Switzerland(CH) 1:00    EU  CE%sT
  835.     //----------------------------------------------------------
  836.     kSystemTimeZones[n++] =
  837.     new SimpleTimeZone(1*U_MILLIS_PER_HOUR, "Europe/Prague" /*CE%sT*/,
  838.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR,
  839.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  840.     // Rule EU  1981    max -   Mar lastSun 1:00u   1:00    S
  841.     // Rule EU  1996    max -   Oct lastSun 1:00u   0   -
  842.     // Europe/Prague    Czech Republic(CZ)  1:00    EU  CE%sT
  843.     //----------------------------------------------------------
  844.     kSystemTimeZones[n++] =
  845.     new SimpleTimeZone(1*U_MILLIS_PER_HOUR, "Europe/Berlin" /*CE%sT*/,
  846.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR,
  847.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  848.     // Rule EU  1981    max -   Mar lastSun 1:00u   1:00    S
  849.     // Rule EU  1996    max -   Oct lastSun 1:00u   0   -
  850.     // Europe/Berlin    Germany(DE) 1:00    EU  CE%sT
  851.     //----------------------------------------------------------
  852.     kSystemTimeZones[n++] =
  853.     new SimpleTimeZone(1*U_MILLIS_PER_HOUR, "Europe/Copenhagen" /*CE%sT*/,
  854.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR,
  855.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  856.     // Rule EU  1981    max -   Mar lastSun 1:00u   1:00    S
  857.     // Rule EU  1996    max -   Oct lastSun 1:00u   0   -
  858.     // Europe/Copenhagen    Denmark, Faeroe Islands, and Greenland(DK)  1:00    EU  CE%sT
  859.     //----------------------------------------------------------
  860.     kSystemTimeZones[n++] =
  861.     new SimpleTimeZone(1*U_MILLIS_PER_HOUR, "Europe/Madrid" /*CE%sT*/,
  862.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR,
  863.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  864.     // Rule EU  1981    max -   Mar lastSun 1:00u   1:00    S
  865.     // Rule EU  1996    max -   Oct lastSun 1:00u   0   -
  866.     // Europe/Madrid    Spain(ES)   1:00    EU  CE%sT
  867.     //----------------------------------------------------------
  868.     kSystemTimeZones[n++] =
  869.     new SimpleTimeZone(1*U_MILLIS_PER_HOUR, "Europe/Gibraltar" /*CE%sT*/,
  870.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR,
  871.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  872.     // Rule EU  1981    max -   Mar lastSun 1:00u   1:00    S
  873.     // Rule EU  1996    max -   Oct lastSun 1:00u   0   -
  874.     // Europe/Gibraltar Gibraltar(GI)   1:00    EU  CE%sT
  875.     //----------------------------------------------------------
  876.     kSystemTimeZones[n++] =
  877.     new SimpleTimeZone(1*U_MILLIS_PER_HOUR, "Europe/Budapest" /*CE%sT*/,
  878.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR,
  879.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  880.     // Rule EU  1981    max -   Mar lastSun 1:00u   1:00    S
  881.     // Rule EU  1996    max -   Oct lastSun 1:00u   0   -
  882.     // Europe/Budapest  Hungary(HU) 1:00    EU  CE%sT
  883.     //----------------------------------------------------------
  884.     kSystemTimeZones[n++] =
  885.     new SimpleTimeZone(1*U_MILLIS_PER_HOUR, "Europe/Rome" /*CE%sT*/,
  886.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR,
  887.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  888.     // Rule EU  1981    max -   Mar lastSun 1:00u   1:00    S
  889.     // Rule EU  1996    max -   Oct lastSun 1:00u   0   -
  890.     // Europe/Rome  Italy(IT)   1:00    EU  CE%sT
  891.     //----------------------------------------------------------
  892.     kSystemTimeZones[n++] =
  893.     new SimpleTimeZone(1*U_MILLIS_PER_HOUR, "Europe/Vaduz" /*CE%sT*/,
  894.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR,
  895.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  896.     // Rule EU  1981    max -   Mar lastSun 1:00u   1:00    S
  897.     // Rule EU  1996    max -   Oct lastSun 1:00u   0   -
  898.     // Europe/Vaduz Liechtenstein(LI)   1:00    EU  CE%sT
  899.     //----------------------------------------------------------
  900.     kSystemTimeZones[n++] =
  901.     new SimpleTimeZone(1*U_MILLIS_PER_HOUR, "Europe/Luxembourg" /*CE%sT*/,
  902.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR,
  903.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  904.     // Rule EU  1981    max -   Mar lastSun 1:00u   1:00    S
  905.     // Rule EU  1996    max -   Oct lastSun 1:00u   0   -
  906.     // Europe/Luxembourg    Luxembourg(LU)  1:00    EU  CE%sT
  907.     //----------------------------------------------------------
  908.     kSystemTimeZones[n++] =
  909.     new SimpleTimeZone(1*U_MILLIS_PER_HOUR, "Africa/Tripoli" /*CE%sT*/,
  910.       Calendar::MARCH, -1, Calendar::THURSDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR,
  911.       Calendar::OCTOBER, 1, -Calendar::THURSDAY /*DOW>=DOM*/, 3*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  912.     // Rule Libya   1997    max -   Mar lastThu 2:00s   1:00    S
  913.     // Rule Libya   1997    max -   Oct Thu>=1  2:00s   0   -
  914.     // Africa/Tripoli   Libya(LY)   1:00    Libya   CE%sT
  915.     //----------------------------------------------------------
  916.     kSystemTimeZones[n++] =
  917.     new SimpleTimeZone(1*U_MILLIS_PER_HOUR, "Europe/Monaco" /*CE%sT*/,
  918.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR,
  919.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  920.     // Rule EU  1981    max -   Mar lastSun 1:00u   1:00    S
  921.     // Rule EU  1996    max -   Oct lastSun 1:00u   0   -
  922.     // Europe/Monaco    Monaco(MC)  1:00    EU  CE%sT
  923.     //----------------------------------------------------------
  924.     kSystemTimeZones[n++] =
  925.     new SimpleTimeZone(1*U_MILLIS_PER_HOUR, "Europe/Malta" /*CE%sT*/,
  926.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR,
  927.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  928.     // Rule EU  1981    max -   Mar lastSun 1:00u   1:00    S
  929.     // Rule EU  1996    max -   Oct lastSun 1:00u   0   -
  930.     // Europe/Malta Malta(MT)   1:00    EU  CE%sT
  931.     //----------------------------------------------------------
  932.     kSystemTimeZones[n++] =
  933.     new SimpleTimeZone(1*U_MILLIS_PER_HOUR, "Africa/Windhoek" /*WA%sT*/,
  934.       Calendar::SEPTEMBER, 1, -Calendar::SUNDAY /*DOW>=DOM*/, 2*U_MILLIS_PER_HOUR,
  935.       Calendar::APRIL, 1, -Calendar::SUNDAY /*DOW>=DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  936.     // Rule Namibia 1994    max -   Sep Sun>=1  2:00    1:00    S
  937.     // Rule Namibia 1995    max -   Apr Sun>=1  2:00    0   -
  938.     // Africa/Windhoek  Namibia(NA) 1:00    Namibia WA%sT
  939.     //----------------------------------------------------------
  940.     kSystemTimeZones[n++] =
  941.     new SimpleTimeZone(1*U_MILLIS_PER_HOUR, "Europe/Amsterdam" /*CE%sT*/,
  942.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR,
  943.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  944.     // Rule EU  1981    max -   Mar lastSun 1:00u   1:00    S
  945.     // Rule EU  1996    max -   Oct lastSun 1:00u   0   -
  946.     // Europe/Amsterdam Netherlands(NL) 1:00    EU  CE%sT
  947.     //----------------------------------------------------------
  948.     kSystemTimeZones[n++] =
  949.     new SimpleTimeZone(1*U_MILLIS_PER_HOUR, "Europe/Oslo" /*CE%sT*/,
  950.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR,
  951.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  952.     // Rule EU  1981    max -   Mar lastSun 1:00u   1:00    S
  953.     // Rule EU  1996    max -   Oct lastSun 1:00u   0   -
  954.     // Europe/Oslo  Norway(NO)  1:00    EU  CE%sT
  955.     //----------------------------------------------------------
  956.     kSystemTimeZones[n++] =
  957.     new SimpleTimeZone(1*U_MILLIS_PER_HOUR, "Europe/Warsaw" /*CE%sT*/,
  958.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 1*U_MILLIS_PER_HOUR,
  959.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  960.     // Rule W-Eur   1981    max -   Mar lastSun 1:00s   1:00    S
  961.     // Rule W-Eur   1996    max -   Oct lastSun 1:00s   0   -
  962.     // Europe/Warsaw    Poland(PL)  1:00    W-Eur   CE%sT
  963.     //----------------------------------------------------------
  964.     kSystemTimeZones[n++] =
  965.     new SimpleTimeZone(1*U_MILLIS_PER_HOUR, "Europe/Stockholm" /*CE%sT*/,
  966.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR,
  967.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  968.     // Rule EU  1981    max -   Mar lastSun 1:00u   1:00    S
  969.     // Rule EU  1996    max -   Oct lastSun 1:00u   0   -
  970.     // Europe/Stockholm Sweden(SE)  1:00    EU  CE%sT
  971.     //----------------------------------------------------------
  972.     kSystemTimeZones[n++] =
  973.     new SimpleTimeZone(1*U_MILLIS_PER_HOUR, "Europe/Belgrade" /*CE%sT*/,
  974.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR,
  975.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  976.     // Rule EU  1981    max -   Mar lastSun 1:00u   1:00    S
  977.     // Rule EU  1996    max -   Oct lastSun 1:00u   0   -
  978.     // Europe/Belgrade  Yugoslavia(YU)  1:00    EU  CE%sT
  979.     //----------------------------------------------------------
  980.     kSystemTimeZones[n++] =
  981.     new SimpleTimeZone(1*U_MILLIS_PER_HOUR, "Europe/Paris" /*CE%sT*/,
  982.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR,
  983.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  984.     // Rule EU  1981    max -   Mar lastSun 1:00u   1:00    S
  985.     // Rule EU  1996    max -   Oct lastSun 1:00u   0   -
  986.     // Europe/Paris France(FR)  1:00    EU  CE%sT
  987.     kSystemTimeZones[n++] =
  988.     new SimpleTimeZone(1*U_MILLIS_PER_HOUR, "ECT" /*alias for Europe/Paris*/,
  989.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR,
  990.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  991.     //----------------------------------------------------------
  992.     kSystemTimeZones[n++] =
  993.     new SimpleTimeZone(2*U_MILLIS_PER_HOUR, "Africa/Bujumbura" /*CAT*/);
  994.     // Africa/Bujumbura Burundi(BI) 2:00    -   CAT
  995.     //----------------------------------------------------------
  996.     kSystemTimeZones[n++] =
  997.     new SimpleTimeZone(2*U_MILLIS_PER_HOUR, "Africa/Gaborone" /*CAT*/);
  998.     // Africa/Gaborone  Botswana(BW)    2:00    -   CAT
  999.     //----------------------------------------------------------
  1000.     kSystemTimeZones[n++] =
  1001.     new SimpleTimeZone(2*U_MILLIS_PER_HOUR, "Africa/Lubumbashi" /*CAT*/);
  1002.     // Africa/Lubumbashi    Democratic Republic of Congo(CG)    2:00    -   CAT
  1003.     //----------------------------------------------------------
  1004.     kSystemTimeZones[n++] =
  1005.     new SimpleTimeZone(2*U_MILLIS_PER_HOUR, "Africa/Maseru" /*SAST*/);
  1006.     // Africa/Maseru    Lesotho(LS) 2:00    -   SAST
  1007.     //----------------------------------------------------------
  1008.     kSystemTimeZones[n++] =
  1009.     new SimpleTimeZone(2*U_MILLIS_PER_HOUR, "Africa/Blantyre" /*CAT*/);
  1010.     // Africa/Blantyre  Malawi(ML)  2:00    -   CAT
  1011.     //----------------------------------------------------------
  1012.     kSystemTimeZones[n++] =
  1013.     new SimpleTimeZone(2*U_MILLIS_PER_HOUR, "Africa/Maputo" /*CAT*/);
  1014.     // Africa/Maputo    Mozambique(MZ)  2:00    -   CAT
  1015.     //----------------------------------------------------------
  1016.     kSystemTimeZones[n++] =
  1017.     new SimpleTimeZone(2*U_MILLIS_PER_HOUR, "Africa/Kigali" /*CAT*/);
  1018.     // Africa/Kigali    Rwanda(RW)  2:00    -   CAT
  1019.     //----------------------------------------------------------
  1020.     kSystemTimeZones[n++] =
  1021.     new SimpleTimeZone(2*U_MILLIS_PER_HOUR, "Africa/Khartoum" /*CA%sT*/);
  1022.     // Africa/Khartoum  Sudan(SD)   2:00    -   CA%sT
  1023.     //----------------------------------------------------------
  1024.     kSystemTimeZones[n++] =
  1025.     new SimpleTimeZone(2*U_MILLIS_PER_HOUR, "Africa/Mbabane" /*SAST*/);
  1026.     // Africa/Mbabane   Swaziland(SZ)   2:00    -   SAST
  1027.     //----------------------------------------------------------
  1028.     kSystemTimeZones[n++] =
  1029.     new SimpleTimeZone(2*U_MILLIS_PER_HOUR, "Africa/Lusaka" /*CAT*/);
  1030.     // Africa/Lusaka    Zambia(ZM)  2:00    -   CAT
  1031.     //----------------------------------------------------------
  1032.     kSystemTimeZones[n++] =
  1033.     new SimpleTimeZone(2*U_MILLIS_PER_HOUR, "Africa/Harare" /*CAT*/);
  1034.     // Africa/Harare    Zimbabwe(ZW)    2:00    -   CAT
  1035.     kSystemTimeZones[n++] =
  1036.     new SimpleTimeZone(2*U_MILLIS_PER_HOUR, "CAT" /*alias for Africa/Harare*/);
  1037.     //----------------------------------------------------------
  1038.     kSystemTimeZones[n++] =
  1039.     new SimpleTimeZone(2*U_MILLIS_PER_HOUR, "Africa/Johannesburg" /*SAST*/);
  1040.     // Africa/Johannesburg  South Africa(ZA)    2:00    -   SAST
  1041.     //----------------------------------------------------------
  1042.     kSystemTimeZones[n++] =
  1043.     new SimpleTimeZone(2*U_MILLIS_PER_HOUR, "Europe/Sofia" /*EE%sT*/,
  1044.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 0*U_MILLIS_PER_HOUR,
  1045.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 0*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  1046.     // Rule E-Eur   1981    max -   Mar lastSun 0:00    1:00    S
  1047.     // Rule E-Eur   1996    max -   Oct lastSun 0:00    0   -
  1048.     // Europe/Sofia Bulgaria(BG)    2:00    E-Eur   EE%sT
  1049.     //----------------------------------------------------------
  1050.     kSystemTimeZones[n++] =
  1051.     new SimpleTimeZone(2*U_MILLIS_PER_HOUR, "Europe/Minsk" /*EE%sT*/,
  1052.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR,
  1053.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 3*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  1054.     // Rule Russia  1993    max -   Mar lastSun 2:00s   1:00    S
  1055.     // Rule Russia  1996    max -   Oct lastSun 2:00s   0   -
  1056.     // Europe/Minsk Belarus(BY) 2:00    Russia  EE%sT
  1057.     //----------------------------------------------------------
  1058.     kSystemTimeZones[n++] =
  1059.     new SimpleTimeZone(2*U_MILLIS_PER_HOUR, "Asia/Nicosia" /*EE%sT*/,
  1060.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 0*U_MILLIS_PER_HOUR,
  1061.       Calendar::SEPTEMBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 0*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  1062.     // Rule Cyprus  1979    max -   Sep lastSun 0:00    0   -
  1063.     // Rule Cyprus  1981    max -   Mar lastSun 0:00    1:00    S
  1064.     // Asia/Nicosia Cyprus(CY)  2:00    Cyprus  EE%sT
  1065.     //----------------------------------------------------------
  1066.     kSystemTimeZones[n++] =
  1067.     new SimpleTimeZone(2*U_MILLIS_PER_HOUR, "Europe/Tallinn" /*EE%sT*/,
  1068.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR,
  1069.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 3*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  1070.     // Rule C-Eur   1981    max -   Mar lastSun 2:00s   1:00    S
  1071.     // Rule C-Eur   1996    max -   Oct lastSun 2:00s   0   -
  1072.     // Europe/Tallinn   Estonia(EE) 2:00    C-Eur   EE%sT
  1073.     //----------------------------------------------------------
  1074.     kSystemTimeZones[n++] =
  1075.     new SimpleTimeZone(2*U_MILLIS_PER_HOUR, "Africa/Cairo" /*EE%sT*/,
  1076.       Calendar::APRIL, -1, Calendar::FRIDAY /*DOW_IN_DOM*/, 1*U_MILLIS_PER_HOUR,
  1077.       Calendar::SEPTEMBER, -1, Calendar::FRIDAY /*DOW_IN_DOM*/, 3*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  1078.     // Rule Egypt   1995    max -   Apr lastFri 1:00    1:00    S
  1079.     // Rule Egypt   1995    max -   Sep lastFri 3:00    0   -
  1080.     // Africa/Cairo Egypt(EG)   2:00    Egypt   EE%sT
  1081.     kSystemTimeZones[n++] =
  1082.     new SimpleTimeZone(2*U_MILLIS_PER_HOUR, "ART" /*alias for Africa/Cairo*/,
  1083.       Calendar::APRIL, -1, Calendar::FRIDAY /*DOW_IN_DOM*/, 1*U_MILLIS_PER_HOUR,
  1084.       Calendar::SEPTEMBER, -1, Calendar::FRIDAY /*DOW_IN_DOM*/, 3*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  1085.     //----------------------------------------------------------
  1086.     kSystemTimeZones[n++] =
  1087.     new SimpleTimeZone(2*U_MILLIS_PER_HOUR, "Europe/Helsinki" /*EE%sT*/,
  1088.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 3*U_MILLIS_PER_HOUR,
  1089.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 3*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  1090.     // Rule EU  1981    max -   Mar lastSun 1:00u   1:00    S
  1091.     // Rule EU  1996    max -   Oct lastSun 1:00u   0   -
  1092.     // Europe/Helsinki  Finland(FI) 2:00    EU  EE%sT
  1093.     //----------------------------------------------------------
  1094.     kSystemTimeZones[n++] =
  1095.     new SimpleTimeZone(2*U_MILLIS_PER_HOUR, "Europe/Athens" /*EE%sT*/,
  1096.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 3*U_MILLIS_PER_HOUR,
  1097.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 3*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  1098.     // Rule EU  1981    max -   Mar lastSun 1:00u   1:00    S
  1099.     // Rule EU  1996    max -   Oct lastSun 1:00u   0   -
  1100.     // Europe/Athens    Greece(GR)  2:00    EU  EE%sT
  1101.     //----------------------------------------------------------
  1102.     kSystemTimeZones[n++] =
  1103.     new SimpleTimeZone(2*U_MILLIS_PER_HOUR, "Asia/Jerusalem" /*I%sT*/,
  1104.       Calendar::MARCH, 15, -Calendar::FRIDAY /*DOW>=DOM*/, 0*U_MILLIS_PER_HOUR,
  1105.       Calendar::SEPTEMBER, 1, -Calendar::SUNDAY /*DOW>=DOM*/, 0*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  1106.     // Rule Zion    1999    max -   Mar Fri>=15 0:00    1:00    D
  1107.     // Rule Zion    1999    max -   Sep Sun>=1  0:00    0   S
  1108.     // Asia/Jerusalem   Israel(IL)  2:00    Zion    I%sT
  1109.     //----------------------------------------------------------
  1110.     kSystemTimeZones[n++] =
  1111.     new SimpleTimeZone(2*U_MILLIS_PER_HOUR, "Asia/Amman" /*EE%sT*/,
  1112.       Calendar::APRIL, 1, -Calendar::FRIDAY /*DOW>=DOM*/, 0*U_MILLIS_PER_HOUR,
  1113.       Calendar::SEPTEMBER, 15, -Calendar::FRIDAY /*DOW>=DOM*/, 1*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  1114.     // Rule    Jordan   1993    max -   Apr Fri>=1  0:00    1:00    S
  1115.     // Rule    Jordan   1995    max -   Sep Fri>=15 0:00s   0   -
  1116.     // Asia/Amman   Jordan(JO)  2:00    Jordan  EE%sT
  1117.     //----------------------------------------------------------
  1118.     kSystemTimeZones[n++] =
  1119.     new SimpleTimeZone(2*U_MILLIS_PER_HOUR, "Asia/Beirut" /*EE%sT*/,
  1120.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 0*U_MILLIS_PER_HOUR,
  1121.       Calendar::SEPTEMBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 0*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  1122.     // Rule Lebanon 1993    max -   Mar lastSun 0:00    1:00    S
  1123.     // Rule Lebanon 1993    max -   Sep lastSun 0:00    0   -
  1124.     // Asia/Beirut  Lebanon(LB) 2:00    Lebanon EE%sT
  1125.     //----------------------------------------------------------
  1126.     kSystemTimeZones[n++] =
  1127.     new SimpleTimeZone(2*U_MILLIS_PER_HOUR, "Europe/Vilnius" /*EE%sT*/,
  1128.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR,
  1129.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 3*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  1130.     // Rule C-Eur   1981    max -   Mar lastSun 2:00s   1:00    S
  1131.     // Rule C-Eur   1996    max -   Oct lastSun 2:00s   0   -
  1132.     // Europe/Vilnius   Lithuania(LT)   2:00    C-Eur   EE%sT
  1133.     //----------------------------------------------------------
  1134.     kSystemTimeZones[n++] =
  1135.     new SimpleTimeZone(2*U_MILLIS_PER_HOUR, "Europe/Riga" /*EE%sT*/,
  1136.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR,
  1137.       Calendar::SEPTEMBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 3*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  1138.     // Rule Latvia  1992    max -   Mar lastSun 2:00s   1:00    S
  1139.     // Rule Latvia  1992    max -   Sep lastSun 2:00s   0   -
  1140.     // Europe/Riga  Latvia(LV)  2:00    Latvia  EE%sT
  1141.     //----------------------------------------------------------
  1142.     kSystemTimeZones[n++] =
  1143.     new SimpleTimeZone(2*U_MILLIS_PER_HOUR, "Europe/Chisinau" /*EE%sT*/,
  1144.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 0*U_MILLIS_PER_HOUR,
  1145.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 0*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  1146.     // Rule E-Eur   1981    max -   Mar lastSun 0:00    1:00    S
  1147.     // Rule E-Eur   1996    max -   Oct lastSun 0:00    0   -
  1148.     // Europe/Chisinau  Moldova(MD) 2:00    E-Eur   EE%sT
  1149.     //----------------------------------------------------------
  1150.     kSystemTimeZones[n++] =
  1151.     new SimpleTimeZone(2*U_MILLIS_PER_HOUR, "Europe/Bucharest" /*EE%sT*/,
  1152.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 0*U_MILLIS_PER_HOUR,
  1153.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 0*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  1154.     // Rule E-Eur   1981    max -   Mar lastSun 0:00    1:00    S
  1155.     // Rule E-Eur   1996    max -   Oct lastSun 0:00    0   -
  1156.     // Europe/Bucharest Romania(RO) 2:00    E-Eur   EE%sT
  1157.     //----------------------------------------------------------
  1158.     kSystemTimeZones[n++] =
  1159.     new SimpleTimeZone(2*U_MILLIS_PER_HOUR, "Asia/Damascus" /*EE%sT*/,
  1160.       Calendar::APRIL, 1, 0 /*DOM*/, 0*U_MILLIS_PER_HOUR,
  1161.       Calendar::OCTOBER, 1, 0 /*DOM*/, 0*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  1162.     // Rule Syria   1994    max -   Apr 1   0:00    1:00    S
  1163.     // Rule Syria   1994    max -   Oct 1   0:00    0   -
  1164.     // Asia/Damascus    Syria(SY)   2:00    Syria   EE%sT
  1165.     //----------------------------------------------------------
  1166.     kSystemTimeZones[n++] =
  1167.     new SimpleTimeZone(2*U_MILLIS_PER_HOUR, "Europe/Kiev" /*EE%sT*/,
  1168.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 3*U_MILLIS_PER_HOUR,
  1169.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 3*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  1170.     // Rule EU  1981    max -   Mar lastSun 1:00u   1:00    S
  1171.     // Rule EU  1996    max -   Oct lastSun 1:00u   0   -
  1172.     // Europe/Kiev  Ukraine(UA) 2:00    EU  EE%sT
  1173.     //----------------------------------------------------------
  1174.     kSystemTimeZones[n++] =
  1175.     new SimpleTimeZone(2*U_MILLIS_PER_HOUR, "Europe/Istanbul" /*EE%sT*/,
  1176.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 3*U_MILLIS_PER_HOUR,
  1177.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 3*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  1178.     // Rule EU  1981    max -   Mar lastSun 1:00u   1:00    S
  1179.     // Rule EU  1996    max -   Oct lastSun 1:00u   0   -
  1180.     // Europe/Istanbul  Turkey(TR)  2:00    EU  EE%sT
  1181.     kSystemTimeZones[n++] =
  1182.     new SimpleTimeZone(2*U_MILLIS_PER_HOUR, "EET" /*alias for Europe/Istanbul*/,
  1183.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 3*U_MILLIS_PER_HOUR,
  1184.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 3*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  1185.     //----------------------------------------------------------
  1186.     kSystemTimeZones[n++] =
  1187.     new SimpleTimeZone(3*U_MILLIS_PER_HOUR, "Asia/Bahrain" /*AST*/);
  1188.     // Asia/Bahrain Bahrain(BH) 3:00    -   AST
  1189.     //----------------------------------------------------------
  1190.     kSystemTimeZones[n++] =
  1191.     new SimpleTimeZone(3*U_MILLIS_PER_HOUR, "Africa/Djibouti" /*EAT*/);
  1192.     // Africa/Djibouti  Djibouti(DJ)    3:00    -   EAT
  1193.     //----------------------------------------------------------
  1194.     kSystemTimeZones[n++] =
  1195.     new SimpleTimeZone(3*U_MILLIS_PER_HOUR, "Africa/Asmera" /*EAT*/);
  1196.     // Africa/Asmera    Eritrea(ER) 3:00    -   EAT
  1197.     //----------------------------------------------------------
  1198.     kSystemTimeZones[n++] =
  1199.     new SimpleTimeZone(3*U_MILLIS_PER_HOUR, "Africa/Addis_Ababa" /*EAT*/);
  1200.     // Africa/Addis_Ababa   Ethiopia(ET)    3:00    -   EAT
  1201.     kSystemTimeZones[n++] =
  1202.     new SimpleTimeZone(3*U_MILLIS_PER_HOUR, "EAT" /*alias for Africa/Addis_Ababa*/);
  1203.     //----------------------------------------------------------
  1204.     kSystemTimeZones[n++] =
  1205.     new SimpleTimeZone(3*U_MILLIS_PER_HOUR, "Africa/Nairobi" /*EAT*/);
  1206.     // Africa/Nairobi   Kenya(KE)   3:00    -   EAT
  1207.     //----------------------------------------------------------
  1208.     kSystemTimeZones[n++] =
  1209.     new SimpleTimeZone(3*U_MILLIS_PER_HOUR, "Indian/Comoro" /*EAT*/);
  1210.     // Indian/Comoro    Comoros(KM) 3:00    -   EAT
  1211.     //----------------------------------------------------------
  1212.     kSystemTimeZones[n++] =
  1213.     new SimpleTimeZone(3*U_MILLIS_PER_HOUR, "Asia/Kuwait" /*AST*/);
  1214.     // Asia/Kuwait  Kuwait(KW)  3:00    -   AST
  1215.     //----------------------------------------------------------
  1216.     kSystemTimeZones[n++] =
  1217.     new SimpleTimeZone(3*U_MILLIS_PER_HOUR, "Indian/Antananarivo" /*EAT*/);
  1218.     // Indian/Antananarivo  Madagascar(MK)  3:00    -   EAT
  1219.     //----------------------------------------------------------
  1220.     kSystemTimeZones[n++] =
  1221.     new SimpleTimeZone(3*U_MILLIS_PER_HOUR, "Asia/Qatar" /*AST*/);
  1222.     // Asia/Qatar   Qatar(QA)   3:00    -   AST
  1223.     //----------------------------------------------------------
  1224.     kSystemTimeZones[n++] =
  1225.     new SimpleTimeZone(3*U_MILLIS_PER_HOUR, "Africa/Mogadishu" /*EAT*/);
  1226.     // Africa/Mogadishu Somalia(SO) 3:00    -   EAT
  1227.     //----------------------------------------------------------
  1228.     kSystemTimeZones[n++] =
  1229.     new SimpleTimeZone(3*U_MILLIS_PER_HOUR, "Africa/Dar_es_Salaam" /*EAT*/);
  1230.     // Africa/Dar_es_Salaam Tanzania(TZ)    3:00    -   EAT
  1231.     //----------------------------------------------------------
  1232.     kSystemTimeZones[n++] =
  1233.     new SimpleTimeZone(3*U_MILLIS_PER_HOUR, "Africa/Kampala" /*EAT*/);
  1234.     // Africa/Kampala   Uganda(UG)  3:00    -   EAT
  1235.     //----------------------------------------------------------
  1236.     kSystemTimeZones[n++] =
  1237.     new SimpleTimeZone(3*U_MILLIS_PER_HOUR, "Asia/Aden" /*AST*/);
  1238.     // Asia/Aden    Yemen(YE)   3:00    -   AST
  1239.     //----------------------------------------------------------
  1240.     kSystemTimeZones[n++] =
  1241.     new SimpleTimeZone(3*U_MILLIS_PER_HOUR, "Indian/Mayotte" /*EAT*/);
  1242.     // Indian/Mayotte   Mayotte(YT) 3:00    -   EAT
  1243.     //----------------------------------------------------------
  1244.     kSystemTimeZones[n++] =
  1245.     new SimpleTimeZone(3*U_MILLIS_PER_HOUR, "Asia/Riyadh" /*AST*/);
  1246.     // Asia/Riyadh  Saudi Arabia(SA)    3:00    -   AST
  1247.     //----------------------------------------------------------
  1248.     kSystemTimeZones[n++] =
  1249.     new SimpleTimeZone(3*U_MILLIS_PER_HOUR, "Asia/Baghdad" /*A%sT*/,
  1250.       Calendar::APRIL, 1, 0 /*DOM*/, 3*U_MILLIS_PER_HOUR,
  1251.       Calendar::OCTOBER, 1, 0 /*DOM*/, 4*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  1252.     // Rule Iraq    1991    max -   Apr 1   3:00s   1:00    D
  1253.     // Rule Iraq    1991    max -   Oct 1   3:00s   0   D
  1254.     // Asia/Baghdad Iraq(IQ)    3:00    Iraq    A%sT
  1255.     //----------------------------------------------------------
  1256.     kSystemTimeZones[n++] =
  1257.     new SimpleTimeZone(3*U_MILLIS_PER_HOUR, "Europe/Simferopol" /*MSK/MSD*/,
  1258.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 3*U_MILLIS_PER_HOUR,
  1259.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 3*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  1260.     // Rule Crimea  1996    max -   Mar lastSun 0:00u   1:00    -
  1261.     // Rule Crimea  1996    max -   Oct lastSun 0:00u   0   -
  1262.     // Europe/Simferopol    Ukraine(UA) 3:00    Crimea  MSK/MSD
  1263.     //----------------------------------------------------------
  1264.     kSystemTimeZones[n++] =
  1265.     new SimpleTimeZone(3*U_MILLIS_PER_HOUR, "Europe/Moscow" /*MSK/MSD*/,
  1266.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR,
  1267.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 3*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  1268.     // Rule Russia  1993    max -   Mar lastSun 2:00s   1:00    S
  1269.     // Rule Russia  1996    max -   Oct lastSun 2:00s   0   -
  1270.     // Europe/Moscow    Russia(RU)  3:00    Russia  MSK/MSD
  1271.     //----------------------------------------------------------
  1272.     kSystemTimeZones[n++] =
  1273.     new SimpleTimeZone((int32_t)(3.5*U_MILLIS_PER_HOUR), "Asia/Tehran" /*IR%sT*/,
  1274.       Calendar::MARCH, 21, 0 /*DOM*/, 0*U_MILLIS_PER_HOUR,
  1275.       Calendar::SEPTEMBER, 23, 0 /*DOM*/, 0*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  1276.     // Rule Iran    1997    1999    -   Mar 21  0:00    1:00    S
  1277.     // Rule Iran    1997    1999    -   Sep 23  0:00    0   -
  1278.     // Asia/Tehran  Iran(IR)    3:30    Iran    IR%sT
  1279.     kSystemTimeZones[n++] =
  1280.     new SimpleTimeZone((int32_t)(3.5*U_MILLIS_PER_HOUR), "MET" /*alias for Asia/Tehran*/,
  1281.       Calendar::MARCH, 21, 0 /*DOM*/, 0*U_MILLIS_PER_HOUR,
  1282.       Calendar::SEPTEMBER, 23, 0 /*DOM*/, 0*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  1283.     //----------------------------------------------------------
  1284.     kSystemTimeZones[n++] =
  1285.     new SimpleTimeZone(4*U_MILLIS_PER_HOUR, "Asia/Dubai" /*GST*/);
  1286.     // Asia/Dubai   United Arab Emirates(AE)    4:00    -   GST
  1287.     //----------------------------------------------------------
  1288.     kSystemTimeZones[n++] =
  1289.     new SimpleTimeZone(4*U_MILLIS_PER_HOUR, "Indian/Mauritius" /*MUT*/);
  1290.     // Indian/Mauritius Mauritius(MU)   4:00    -   MUT # Mauritius Time
  1291.     //----------------------------------------------------------
  1292.     kSystemTimeZones[n++] =
  1293.     new SimpleTimeZone(4*U_MILLIS_PER_HOUR, "Asia/Muscat" /*GST*/);
  1294.     // Asia/Muscat  Oman(OM)    4:00    -   GST
  1295.     //----------------------------------------------------------
  1296.     kSystemTimeZones[n++] =
  1297.     new SimpleTimeZone(4*U_MILLIS_PER_HOUR, "Indian/Reunion" /*RET*/);
  1298.     // Indian/Reunion   Reunion(RE) 4:00    -   RET # Reunion Time
  1299.     //----------------------------------------------------------
  1300.     kSystemTimeZones[n++] =
  1301.     new SimpleTimeZone(4*U_MILLIS_PER_HOUR, "Indian/Mahe" /*SCT*/);
  1302.     // Indian/Mahe  Seychelles(SC)  4:00    -   SCT # Seychelles Time
  1303.     //----------------------------------------------------------
  1304.     kSystemTimeZones[n++] =
  1305.     new SimpleTimeZone(4*U_MILLIS_PER_HOUR, "Asia/Yerevan" /*AM%sT*/);
  1306.     // Asia/Yerevan Armenia(AM) 4:00    -   AM%sT
  1307.     kSystemTimeZones[n++] =
  1308.     new SimpleTimeZone(4*U_MILLIS_PER_HOUR, "NET" /*alias for Asia/Yerevan*/);
  1309.     //----------------------------------------------------------
  1310.     kSystemTimeZones[n++] =
  1311.     new SimpleTimeZone(4*U_MILLIS_PER_HOUR, "Asia/Baku" /*AZ%sT*/,
  1312.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 5*U_MILLIS_PER_HOUR,
  1313.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 5*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  1314.     // Rule EUAsia  1981    max -   Mar lastSun 1:00u   1:00    S
  1315.     // Rule EUAsia  1996    max -   Oct lastSun 1:00u   0   -
  1316.     // Asia/Baku    Azerbaijan(AZ)  4:00    EUAsia  AZ%sT
  1317.     //----------------------------------------------------------
  1318.     kSystemTimeZones[n++] =
  1319.     new SimpleTimeZone(4*U_MILLIS_PER_HOUR, "Asia/Aqtau" /*AQT%sT*/,
  1320.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 0*U_MILLIS_PER_HOUR,
  1321.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 0*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  1322.     // Rule E-EurAsia   1981    max -   Mar lastSun 0:00    1:00    S
  1323.     // Rule E-EurAsia   1996    max -   Oct lastSun 0:00    0   -
  1324.     // Asia/Aqtau   Kazakhstan(KZ)  4:00    E-EurAsia   AQT%sT
  1325.     //----------------------------------------------------------
  1326.     kSystemTimeZones[n++] =
  1327.     new SimpleTimeZone(4*U_MILLIS_PER_HOUR, "Europe/Samara" /*SAM%sT*/,
  1328.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR,
  1329.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 3*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  1330.     // Rule Russia  1993    max -   Mar lastSun 2:00s   1:00    S
  1331.     // Rule Russia  1996    max -   Oct lastSun 2:00s   0   -
  1332.     // Europe/Samara    Russia(RU)  4:00    Russia  SAM%sT
  1333.     //----------------------------------------------------------
  1334.     kSystemTimeZones[n++] =
  1335.     new SimpleTimeZone((int32_t)(4.5*U_MILLIS_PER_HOUR), "Asia/Kabul" /*AFT*/);
  1336.     // Asia/Kabul   Afghanistan(AF) 4:30    -   AFT
  1337.     //----------------------------------------------------------
  1338.     kSystemTimeZones[n++] =
  1339.     new SimpleTimeZone(5*U_MILLIS_PER_HOUR, "Indian/Kerguelen" /*TFT*/);
  1340.     // Indian/Kerguelen France - year-round bases(FR)   5:00    -   TFT # ISO code TF Time
  1341.     //----------------------------------------------------------
  1342.     kSystemTimeZones[n++] =
  1343.     new SimpleTimeZone(5*U_MILLIS_PER_HOUR, "Asia/Tbilisi" /*GET*/);
  1344.     // Asia/Tbilisi Georgia(GE) 5:00    -   GET
  1345.     //----------------------------------------------------------
  1346.     kSystemTimeZones[n++] =
  1347.     new SimpleTimeZone(5*U_MILLIS_PER_HOUR, "Indian/Chagos" /*IOT*/);
  1348.     // Indian/Chagos    British Indian Ocean Territory(IO)  5:00    -   IOT # BIOT Time
  1349.     //----------------------------------------------------------
  1350.     kSystemTimeZones[n++] =
  1351.     new SimpleTimeZone(5*U_MILLIS_PER_HOUR, "Indian/Maldives" /*MVT*/);
  1352.     // Indian/Maldives  Maldives(MV)    5:00    -   MVT # Maldives Time
  1353.     //----------------------------------------------------------
  1354.     kSystemTimeZones[n++] =
  1355.     new SimpleTimeZone(5*U_MILLIS_PER_HOUR, "Asia/Dushanbe" /*TJT*/);
  1356.     // Asia/Dushanbe    Tajikistan(TJ)  5:00    -   TJT # Tajikistan Time
  1357.     //----------------------------------------------------------
  1358.     kSystemTimeZones[n++] =
  1359.     new SimpleTimeZone(5*U_MILLIS_PER_HOUR, "Asia/Ashkhabad" /*TMT*/);
  1360.     // Asia/Ashkhabad   Turkmenistan(TM)    5:00    -   TMT # Turkmenistan Time
  1361.     //----------------------------------------------------------
  1362.     kSystemTimeZones[n++] =
  1363.     new SimpleTimeZone(5*U_MILLIS_PER_HOUR, "Asia/Tashkent" /*UZT*/);
  1364.     // Asia/Tashkent    Uzbekistan(UZ)  5:00    -   UZT # Uzbekistan Time
  1365.     //----------------------------------------------------------
  1366.     kSystemTimeZones[n++] =
  1367.     new SimpleTimeZone(5*U_MILLIS_PER_HOUR, "Asia/Karachi" /*PKT*/);
  1368.     // Asia/Karachi Pakistan(PK)    5:00    -   PKT # Pakistan Time
  1369.     kSystemTimeZones[n++] =
  1370.     new SimpleTimeZone(5*U_MILLIS_PER_HOUR, "PLT" /*alias for Asia/Karachi*/);
  1371.     //----------------------------------------------------------
  1372.     kSystemTimeZones[n++] =
  1373.     new SimpleTimeZone(5*U_MILLIS_PER_HOUR, "Asia/Bishkek" /*KG%sT*/,
  1374.       Calendar::APRIL, 7, -Calendar::SUNDAY /*DOW>=DOM*/, 0*U_MILLIS_PER_HOUR,
  1375.       Calendar::SEPTEMBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 0*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  1376.     // Rule Kirgiz  1992    max -   Apr Sun>=7  0:00    1:00    S
  1377.     // Rule Kirgiz  1991    max -   Sep lastSun 0:00    0   -
  1378.     // Asia/Bishkek Kirgizstan(KG)  5:00    Kirgiz  KG%sT   # Kirgizstan Time
  1379.     //----------------------------------------------------------
  1380.     kSystemTimeZones[n++] =
  1381.     new SimpleTimeZone(5*U_MILLIS_PER_HOUR, "Asia/Aqtobe" /*AQT%sT*/,
  1382.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 0*U_MILLIS_PER_HOUR,
  1383.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 0*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  1384.     // Rule E-EurAsia   1981    max -   Mar lastSun 0:00    1:00    S
  1385.     // Rule E-EurAsia   1996    max -   Oct lastSun 0:00    0   -
  1386.     // Asia/Aqtobe  Kazakhstan(KZ)  5:00    E-EurAsia   AQT%sT
  1387.     //----------------------------------------------------------
  1388.     kSystemTimeZones[n++] =
  1389.     new SimpleTimeZone(5*U_MILLIS_PER_HOUR, "Asia/Yekaterinburg" /*YEK%sT*/,
  1390.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR,
  1391.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 3*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  1392.     // Rule Russia  1993    max -   Mar lastSun 2:00s   1:00    S
  1393.     // Rule Russia  1996    max -   Oct lastSun 2:00s   0   -
  1394.     // Asia/Yekaterinburg   Russia(RU)  5:00    Russia  YEK%sT  # Yekaterinburg Time
  1395.     //----------------------------------------------------------
  1396.     kSystemTimeZones[n++] =
  1397.     new SimpleTimeZone((int32_t)(5.5*U_MILLIS_PER_HOUR), "Asia/Calcutta" /*IST*/);
  1398.     // Asia/Calcutta    India(IN)   5:30    -   IST
  1399.     kSystemTimeZones[n++] =
  1400.     new SimpleTimeZone((int32_t)(5.5*U_MILLIS_PER_HOUR), "IST" /*alias for Asia/Calcutta*/);
  1401.     //----------------------------------------------------------
  1402.     kSystemTimeZones[n++] =
  1403.     new SimpleTimeZone((int32_t)(5.75*U_MILLIS_PER_HOUR), "Asia/Katmandu" /*NPT*/);
  1404.     // Asia/Katmandu    Nepal(NP)   5:45    -   NPT # Nepal Time
  1405.     //----------------------------------------------------------
  1406.     kSystemTimeZones[n++] =
  1407.     new SimpleTimeZone(6*U_MILLIS_PER_HOUR, "Antarctica/Mawson" /*MAWT*/);
  1408.     // Antarctica/Mawson    Australia - territories(AQ) 6:00    -   MAWT    # Mawson Time
  1409.     //----------------------------------------------------------
  1410.     kSystemTimeZones[n++] =
  1411.     new SimpleTimeZone(6*U_MILLIS_PER_HOUR, "Asia/Colombo" /*LKT*/);
  1412.     // Asia/Colombo Sri Lanka(LK)   6:00    -   LKT
  1413.     //----------------------------------------------------------
  1414.     kSystemTimeZones[n++] =
  1415.     new SimpleTimeZone(6*U_MILLIS_PER_HOUR, "Asia/Dacca" /*BDT*/);
  1416.     // Asia/Dacca   Bangladesh(BD)  6:00    -   BDT # Bangladesh Time
  1417.     kSystemTimeZones[n++] =
  1418.     new SimpleTimeZone(6*U_MILLIS_PER_HOUR, "BST" /*alias for Asia/Dacca*/);
  1419.     //----------------------------------------------------------
  1420.     kSystemTimeZones[n++] =
  1421.     new SimpleTimeZone(6*U_MILLIS_PER_HOUR, "Asia/Alma-Ata" /*ALM%sT*/,
  1422.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 0*U_MILLIS_PER_HOUR,
  1423.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 0*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  1424.     // Rule E-EurAsia   1981    max -   Mar lastSun 0:00    1:00    S
  1425.     // Rule E-EurAsia   1996    max -   Oct lastSun 0:00    0   -
  1426.     // Asia/Alma-Ata    Kazakhstan(KZ)  6:00    E-EurAsia   ALM%sT
  1427.     //----------------------------------------------------------
  1428.     kSystemTimeZones[n++] =
  1429.     new SimpleTimeZone(6*U_MILLIS_PER_HOUR, "Asia/Novosibirsk" /*NOV%sT*/,
  1430.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR,
  1431.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 3*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  1432.     // Rule Russia  1993    max -   Mar lastSun 2:00s   1:00    S
  1433.     // Rule Russia  1996    max -   Oct lastSun 2:00s   0   -
  1434.     // Asia/Novosibirsk Russia(RU)  6:00    Russia  NOV%sT
  1435.     //----------------------------------------------------------
  1436.     kSystemTimeZones[n++] =
  1437.     new SimpleTimeZone((int32_t)(6.5*U_MILLIS_PER_HOUR), "Indian/Cocos" /*CCT*/);
  1438.     // Indian/Cocos Cocos(CC)   6:30    -   CCT # Cocos Islands Time
  1439.     //----------------------------------------------------------
  1440.     kSystemTimeZones[n++] =
  1441.     new SimpleTimeZone((int32_t)(6.5*U_MILLIS_PER_HOUR), "Asia/Rangoon" /*MMT*/);
  1442.     // Asia/Rangoon Burma / Myanmar(MM) 6:30    -   MMT # Myanmar Time
  1443.     //----------------------------------------------------------
  1444.     kSystemTimeZones[n++] =
  1445.     new SimpleTimeZone(7*U_MILLIS_PER_HOUR, "Indian/Christmas" /*CXT*/);
  1446.     // Indian/Christmas Australian miscellany(AU)   7:00    -   CXT # Christmas Island Time
  1447.     //----------------------------------------------------------
  1448.     kSystemTimeZones[n++] =
  1449.     new SimpleTimeZone(7*U_MILLIS_PER_HOUR, "Asia/Jakarta" /*JAVT*/);
  1450.     // Asia/Jakarta Indonesia(ID)   7:00    -   JAVT
  1451.     //----------------------------------------------------------
  1452.     kSystemTimeZones[n++] =
  1453.     new SimpleTimeZone(7*U_MILLIS_PER_HOUR, "Asia/Phnom_Penh" /*ICT*/);
  1454.     // Asia/Phnom_Penh  Cambodia(KH)    7:00    -   ICT
  1455.     //----------------------------------------------------------
  1456.     kSystemTimeZones[n++] =
  1457.     new SimpleTimeZone(7*U_MILLIS_PER_HOUR, "Asia/Vientiane" /*ICT*/);
  1458.     // Asia/Vientiane   Laos(LA)    7:00    -   ICT
  1459.     //----------------------------------------------------------
  1460.     kSystemTimeZones[n++] =
  1461.     new SimpleTimeZone(7*U_MILLIS_PER_HOUR, "Asia/Saigon" /*ICT*/);
  1462.     // Asia/Saigon  Vietnam(VN) 7:00    -   ICT
  1463.     kSystemTimeZones[n++] =
  1464.     new SimpleTimeZone(7*U_MILLIS_PER_HOUR, "VST" /*alias for Asia/Saigon*/);
  1465.     //----------------------------------------------------------
  1466.     kSystemTimeZones[n++] =
  1467.     new SimpleTimeZone(7*U_MILLIS_PER_HOUR, "Asia/Bangkok" /*ICT*/);
  1468.     // Asia/Bangkok Thailand(TH)    7:00    -   ICT
  1469.     //----------------------------------------------------------
  1470.     kSystemTimeZones[n++] =
  1471.     new SimpleTimeZone(7*U_MILLIS_PER_HOUR, "Asia/Krasnoyarsk" /*KRA%sT*/,
  1472.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR,
  1473.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 3*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  1474.     // Rule Russia  1993    max -   Mar lastSun 2:00s   1:00    S
  1475.     // Rule Russia  1996    max -   Oct lastSun 2:00s   0   -
  1476.     // Asia/Krasnoyarsk Russia(RU)  7:00    Russia  KRA%sT
  1477.     //----------------------------------------------------------
  1478.     kSystemTimeZones[n++] =
  1479.     new SimpleTimeZone(8*U_MILLIS_PER_HOUR, "Antarctica/Casey" /*WST*/);
  1480.     // Antarctica/Casey Australia - territories(AQ) 8:00    -   WST # Western (Aus) Standard Time
  1481.     //----------------------------------------------------------
  1482.     kSystemTimeZones[n++] =
  1483.     new SimpleTimeZone(8*U_MILLIS_PER_HOUR, "Australia/Perth" /*WST*/);
  1484.     // Australia/Perth  Australia(AU)   8:00    -   WST
  1485.     //----------------------------------------------------------
  1486.     kSystemTimeZones[n++] =
  1487.     new SimpleTimeZone(8*U_MILLIS_PER_HOUR, "Asia/Brunei" /*BNT*/);
  1488.     // Asia/Brunei  Brunei(BN)  8:00    -   BNT
  1489.     //----------------------------------------------------------
  1490.     kSystemTimeZones[n++] =
  1491.     new SimpleTimeZone(8*U_MILLIS_PER_HOUR, "Asia/Hong_Kong" /*C%sT*/);
  1492.     // Asia/Hong_Kong   China(HK)   8:00    -   C%sT
  1493.     //----------------------------------------------------------
  1494.     kSystemTimeZones[n++] =
  1495.     new SimpleTimeZone(8*U_MILLIS_PER_HOUR, "Asia/Ujung_Pandang" /*BORT*/);
  1496.     // Asia/Ujung_Pandang   Indonesia(ID)   8:00    -   BORT
  1497.     //----------------------------------------------------------
  1498.     kSystemTimeZones[n++] =
  1499.     new SimpleTimeZone(8*U_MILLIS_PER_HOUR, "Asia/Ishigaki" /*CST*/);
  1500.     // Asia/Ishigaki    Japan(JP)   8:00    -   CST
  1501.     //----------------------------------------------------------
  1502.     kSystemTimeZones[n++] =
  1503.     new SimpleTimeZone(8*U_MILLIS_PER_HOUR, "Asia/Macao" /*C%sT*/);
  1504.     // Asia/Macao   Macao(MO)   8:00    -   C%sT
  1505.     //----------------------------------------------------------
  1506.     kSystemTimeZones[n++] =
  1507.     new SimpleTimeZone(8*U_MILLIS_PER_HOUR, "Asia/Kuala_Lumpur" /*MYT*/);
  1508.     // Asia/Kuala_Lumpur    Malaysia(MY)    8:00    -   MYT # Malaysia Time
  1509.     //----------------------------------------------------------
  1510.     kSystemTimeZones[n++] =
  1511.     new SimpleTimeZone(8*U_MILLIS_PER_HOUR, "Asia/Manila" /*PH%sT*/);
  1512.     // Asia/Manila  Philippines(PH) 8:00    -   PH%sT
  1513.     //----------------------------------------------------------
  1514.     kSystemTimeZones[n++] =
  1515.     new SimpleTimeZone(8*U_MILLIS_PER_HOUR, "Asia/Singapore" /*SGT*/);
  1516.     // Asia/Singapore   Singapore(SG)   8:00    -   SGT
  1517.     //----------------------------------------------------------
  1518.     kSystemTimeZones[n++] =
  1519.     new SimpleTimeZone(8*U_MILLIS_PER_HOUR, "Asia/Taipei" /*C%sT*/);
  1520.     // Asia/Taipei  Taiwan(TW)  8:00    -   C%sT
  1521.     //----------------------------------------------------------
  1522.     kSystemTimeZones[n++] =
  1523.     new SimpleTimeZone(8*U_MILLIS_PER_HOUR, "Asia/Shanghai" /*C%sT*/);
  1524.     // Asia/Shanghai    China(CN)   8:00    -   C%sT
  1525.     kSystemTimeZones[n++] =
  1526.     new SimpleTimeZone(8*U_MILLIS_PER_HOUR, "CTT" /*alias for Asia/Shanghai*/);
  1527.     //----------------------------------------------------------
  1528.     kSystemTimeZones[n++] =
  1529.     new SimpleTimeZone(8*U_MILLIS_PER_HOUR, "Asia/Ulan_Bator" /*ULA%sT*/,
  1530.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 0*U_MILLIS_PER_HOUR,
  1531.       Calendar::SEPTEMBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 0*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  1532.     // Rule Mongol  1991    max -   Mar lastSun 0:00    1:00    S
  1533.     // Rule Mongol  1997    max -   Sep lastSun 0:00    0   -
  1534.     // Asia/Ulan_Bator  Mongolia(MN)    8:00    Mongol  ULA%sT
  1535.     //----------------------------------------------------------
  1536.     kSystemTimeZones[n++] =
  1537.     new SimpleTimeZone(8*U_MILLIS_PER_HOUR, "Asia/Irkutsk" /*IRK%sT*/,
  1538.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR,
  1539.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 3*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  1540.     // Rule Russia  1993    max -   Mar lastSun 2:00s   1:00    S
  1541.     // Rule Russia  1996    max -   Oct lastSun 2:00s   0   -
  1542.     // Asia/Irkutsk Russia(RU)  8:00    Russia  IRK%sT
  1543.     //----------------------------------------------------------
  1544.     kSystemTimeZones[n++] =
  1545.     new SimpleTimeZone(9*U_MILLIS_PER_HOUR, "Asia/Jayapura" /*JAYT*/);
  1546.     // Asia/Jayapura    Indonesia(ID)   9:00    -   JAYT
  1547.     //----------------------------------------------------------
  1548.     kSystemTimeZones[n++] =
  1549.     new SimpleTimeZone(9*U_MILLIS_PER_HOUR, "Asia/Pyongyang" /*KST*/);
  1550.     // Asia/Pyongyang   ?(KP)   9:00    -   KST
  1551.     //----------------------------------------------------------
  1552.     kSystemTimeZones[n++] =
  1553.     new SimpleTimeZone(9*U_MILLIS_PER_HOUR, "Asia/Seoul" /*K%sT*/);
  1554.     // Asia/Seoul   ?(KR)   9:00    -   K%sT
  1555.     //----------------------------------------------------------
  1556.     kSystemTimeZones[n++] =
  1557.     new SimpleTimeZone(9*U_MILLIS_PER_HOUR, "Pacific/Palau" /*PWT*/);
  1558.     // Pacific/Palau    Palau(PW)   9:00    -   PWT # Palau Time
  1559.     //----------------------------------------------------------
  1560.     kSystemTimeZones[n++] =
  1561.     new SimpleTimeZone(9*U_MILLIS_PER_HOUR, "Asia/Tokyo" /*JST*/);
  1562.     // Asia/Tokyo   Japan(JP)   9:00    -   JST
  1563.     kSystemTimeZones[n++] =
  1564.     new SimpleTimeZone(9*U_MILLIS_PER_HOUR, "JST" /*alias for Asia/Tokyo*/);
  1565.     //----------------------------------------------------------
  1566.     kSystemTimeZones[n++] =
  1567.     new SimpleTimeZone(9*U_MILLIS_PER_HOUR, "Asia/Yakutsk" /*YAK%sT*/,
  1568.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR,
  1569.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 3*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  1570.     // Rule Russia  1993    max -   Mar lastSun 2:00s   1:00    S
  1571.     // Rule Russia  1996    max -   Oct lastSun 2:00s   0   -
  1572.     // Asia/Yakutsk Russia(RU)  9:00    Russia  YAK%sT
  1573.     //----------------------------------------------------------
  1574.     kSystemTimeZones[n++] =
  1575.     new SimpleTimeZone((int32_t)(9.5*U_MILLIS_PER_HOUR), "Australia/Darwin" /*CST*/);
  1576.     // Australia/Darwin Australia(AU)   9:30    -   CST
  1577.     kSystemTimeZones[n++] =
  1578.     new SimpleTimeZone((int32_t)(9.5*U_MILLIS_PER_HOUR), "ACT" /*alias for Australia/Darwin*/);
  1579.     //----------------------------------------------------------
  1580.     kSystemTimeZones[n++] =
  1581.     new SimpleTimeZone((int32_t)(9.5*U_MILLIS_PER_HOUR), "Australia/Adelaide" /*CST*/,
  1582.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR,
  1583.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 3*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  1584.     // Rule AS  1987    max -   Oct lastSun 2:00s   1:00    -
  1585.     // Rule AS  1995    max -   Mar lastSun 2:00s   0   -
  1586.     // Australia/Adelaide   South Australia(AU) 9:30    AS  CST
  1587.     //----------------------------------------------------------
  1588.     kSystemTimeZones[n++] =
  1589.     new SimpleTimeZone(10*U_MILLIS_PER_HOUR, "Pacific/Truk" /*TRUT*/);
  1590.     // Pacific/Truk Micronesia(FM)  10:00   -   TRUT    # Truk Time
  1591.     //----------------------------------------------------------
  1592.     kSystemTimeZones[n++] =
  1593.     new SimpleTimeZone(10*U_MILLIS_PER_HOUR, "Pacific/Guam" /*GST*/);
  1594.     // Pacific/Guam Guam(GU)    10:00   -   GST
  1595.     //----------------------------------------------------------
  1596.     kSystemTimeZones[n++] =
  1597.     new SimpleTimeZone(10*U_MILLIS_PER_HOUR, "Pacific/Saipan" /*MPT*/);
  1598.     // Pacific/Saipan   N Mariana Is(MP)    10:00   -   MPT
  1599.     //----------------------------------------------------------
  1600.     kSystemTimeZones[n++] =
  1601.     new SimpleTimeZone(10*U_MILLIS_PER_HOUR, "Pacific/Port_Moresby" /*PGT*/);
  1602.     // Pacific/Port_Moresby Papua New Guinea(PG)    10:00   -   PGT # Papua New Guinea Time
  1603.     //----------------------------------------------------------
  1604.     kSystemTimeZones[n++] =
  1605.     new SimpleTimeZone(10*U_MILLIS_PER_HOUR, "Australia/Brisbane" /*EST*/);
  1606.     // Australia/Brisbane   Australia(AU)   10:00   -   EST
  1607.     //----------------------------------------------------------
  1608.     kSystemTimeZones[n++] =
  1609.     new SimpleTimeZone(10*U_MILLIS_PER_HOUR, "Asia/Vladivostok" /*VLA%sT*/,
  1610.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR,
  1611.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 3*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  1612.     // Rule Russia  1993    max -   Mar lastSun 2:00s   1:00    S
  1613.     // Rule Russia  1996    max -   Oct lastSun 2:00s   0   -
  1614.     // Asia/Vladivostok Russia(RU)  10:00   Russia  VLA%sT
  1615.     //----------------------------------------------------------
  1616.     kSystemTimeZones[n++] =
  1617.     new SimpleTimeZone(10*U_MILLIS_PER_HOUR, "Australia/Sydney" /*EST*/,
  1618.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR,
  1619.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 3*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  1620.     // Rule AN  1987    max -   Oct lastSun 2:00s   1:00    -
  1621.     // Rule AN  1996    max -   Mar lastSun 2:00s   0   -
  1622.     // Australia/Sydney New South Wales(AU) 10:00   AN  EST
  1623.     kSystemTimeZones[n++] =
  1624.     new SimpleTimeZone(10*U_MILLIS_PER_HOUR, "AET" /*alias for Australia/Sydney*/,
  1625.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR,
  1626.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 3*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  1627.     //----------------------------------------------------------
  1628.     kSystemTimeZones[n++] =
  1629.     new SimpleTimeZone((int32_t)(10.5*U_MILLIS_PER_HOUR), "Australia/Lord_Howe" /*LHST*/,
  1630.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR,
  1631.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 3*U_MILLIS_PER_HOUR, (int32_t)(0.5*U_MILLIS_PER_HOUR),fgStatus);
  1632.     // Rule LH  1987    max -   Oct lastSun 2:00s   0:30    -
  1633.     // Rule LH  1996    max -   Mar lastSun 2:00s   0   -
  1634.     // Australia/Lord_Howe  Lord Howe Island(AU)    10:30   LH  LHST
  1635.     //----------------------------------------------------------
  1636.     kSystemTimeZones[n++] =
  1637.     new SimpleTimeZone(11*U_MILLIS_PER_HOUR, "Pacific/Ponape" /*PONT*/);
  1638.     // Pacific/Ponape   Micronesia(FM)  11:00   -   PONT    # Ponape Time
  1639.     //----------------------------------------------------------
  1640.     kSystemTimeZones[n++] =
  1641.     new SimpleTimeZone(11*U_MILLIS_PER_HOUR, "Pacific/Efate" /*VU%sT*/);
  1642.     // Pacific/Efate    Vanuatu(VU) 11:00   -   VU%sT   # Vanuatu Time
  1643.     //----------------------------------------------------------
  1644.     kSystemTimeZones[n++] =
  1645.     new SimpleTimeZone(11*U_MILLIS_PER_HOUR, "Pacific/Guadalcanal" /*SBT*/);
  1646.     // Pacific/Guadalcanal  Solomon Is(SB)  11:00   -   SBT # Solomon Is Time
  1647.     kSystemTimeZones[n++] =
  1648.     new SimpleTimeZone(11*U_MILLIS_PER_HOUR, "SST" /*alias for Pacific/Guadalcanal*/);
  1649.     //----------------------------------------------------------
  1650.     kSystemTimeZones[n++] =
  1651.     new SimpleTimeZone(11*U_MILLIS_PER_HOUR, "Pacific/Noumea" /*NC%sT*/,
  1652.       Calendar::NOVEMBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR,
  1653.       Calendar::MARCH, 1, -Calendar::SUNDAY /*DOW>=DOM*/, 3*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  1654.     // Rule NC  1997    max -   Mar Sun>=1  2:00s   0   -
  1655.     // Rule NC  1997    max -   Nov lastSun 2:00s   1:00    S
  1656.     // Pacific/Noumea   New Caledonia(NC)   11:00   NC  NC%sT
  1657.     //----------------------------------------------------------
  1658.     kSystemTimeZones[n++] =
  1659.     new SimpleTimeZone(11*U_MILLIS_PER_HOUR, "Asia/Magadan" /*MAG%sT*/,
  1660.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR,
  1661.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 3*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  1662.     // Rule Russia  1993    max -   Mar lastSun 2:00s   1:00    S
  1663.     // Rule Russia  1996    max -   Oct lastSun 2:00s   0   -
  1664.     // Asia/Magadan Russia(RU)  11:00   Russia  MAG%sT
  1665.     //----------------------------------------------------------
  1666.     kSystemTimeZones[n++] =
  1667.     new SimpleTimeZone((int32_t)(11.5*U_MILLIS_PER_HOUR), "Pacific/Norfolk" /*NFT*/);
  1668.     // Pacific/Norfolk  Norfolk(NF) 11:30   -   NFT # Norfolk Time
  1669.     //----------------------------------------------------------
  1670.     kSystemTimeZones[n++] =
  1671.     new SimpleTimeZone(12*U_MILLIS_PER_HOUR, "Pacific/Kosrae" /*KOST*/);
  1672.     // Pacific/Kosrae   Micronesia(FM)  12:00   -   KOST    # Kosrae Time
  1673.     //----------------------------------------------------------
  1674.     kSystemTimeZones[n++] =
  1675.     new SimpleTimeZone(12*U_MILLIS_PER_HOUR, "Pacific/Tarawa" /*GILT*/);
  1676.     // Pacific/Tarawa   Kiribati(KI)    12:00   -   GILT    # Gilbert Is Time
  1677.     //----------------------------------------------------------
  1678.     kSystemTimeZones[n++] =
  1679.     new SimpleTimeZone(12*U_MILLIS_PER_HOUR, "Pacific/Majuro" /*MHT*/);
  1680.     // Pacific/Majuro   Marshall Is(MH) 12:00   -   MHT
  1681.     //----------------------------------------------------------
  1682.     kSystemTimeZones[n++] =
  1683.     new SimpleTimeZone(12*U_MILLIS_PER_HOUR, "Pacific/Nauru" /*NRT*/);
  1684.     // Pacific/Nauru    Nauru(NR)   12:00   -   NRT
  1685.     //----------------------------------------------------------
  1686.     kSystemTimeZones[n++] =
  1687.     new SimpleTimeZone(12*U_MILLIS_PER_HOUR, "Pacific/Funafuti" /*TVT*/);
  1688.     // Pacific/Funafuti Tuvalu(TV)  12:00   -   TVT # Tuvalu Time
  1689.     //----------------------------------------------------------
  1690.     kSystemTimeZones[n++] =
  1691.     new SimpleTimeZone(12*U_MILLIS_PER_HOUR, "Pacific/Wake" /*WAKT*/);
  1692.     // Pacific/Wake Wake(US)    12:00   -   WAKT    # Wake Time
  1693.     //----------------------------------------------------------
  1694.     kSystemTimeZones[n++] =
  1695.     new SimpleTimeZone(12*U_MILLIS_PER_HOUR, "Pacific/Wallis" /*WFT*/);
  1696.     // Pacific/Wallis   Wallis and Futuna(WF)   12:00   -   WFT # Wallis & Futuna Time
  1697.     //----------------------------------------------------------
  1698.     kSystemTimeZones[n++] =
  1699.     new SimpleTimeZone(12*U_MILLIS_PER_HOUR, "Pacific/Fiji" /*FJT*/);
  1700.     // Pacific/Fiji Fiji(FJ)    12:00   -   FJT # Fiji Time
  1701.     //----------------------------------------------------------
  1702.     kSystemTimeZones[n++] =
  1703.     new SimpleTimeZone(12*U_MILLIS_PER_HOUR, "Antarctica/McMurdo" /*NZ%sT*/,
  1704.       Calendar::OCTOBER, 1, -Calendar::SUNDAY /*DOW>=DOM*/, 2*U_MILLIS_PER_HOUR,
  1705.       Calendar::MARCH, 15, -Calendar::SUNDAY /*DOW>=DOM*/, 3*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  1706.     // Rule NZAQ    1990    max -   Oct Sun>=1  2:00s   1:00    D
  1707.     // Rule NZAQ    1990    max -   Mar Sun>=15 2:00s   0   S
  1708.     // Antarctica/McMurdo   USA - year-round bases(AQ)  12:00   NZAQ    NZ%sT
  1709.     //----------------------------------------------------------
  1710.     kSystemTimeZones[n++] =
  1711.     new SimpleTimeZone(12*U_MILLIS_PER_HOUR, "Asia/Kamchatka" /*PET%sT*/,
  1712.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR,
  1713.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 3*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  1714.     // Rule Russia  1993    max -   Mar lastSun 2:00s   1:00    S
  1715.     // Rule Russia  1996    max -   Oct lastSun 2:00s   0   -
  1716.     // Asia/Kamchatka   Russia(RU)  12:00   Russia  PET%sT
  1717.     //----------------------------------------------------------
  1718.     kSystemTimeZones[n++] =
  1719.     new SimpleTimeZone(12*U_MILLIS_PER_HOUR, "Pacific/Auckland" /*NZ%sT*/,
  1720.       Calendar::OCTOBER, 1, -Calendar::SUNDAY /*DOW>=DOM*/, 2*U_MILLIS_PER_HOUR,
  1721.       Calendar::MARCH, 15, -Calendar::SUNDAY /*DOW>=DOM*/, 3*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  1722.     // Rule NZ  1990    max -   Oct Sun>=1  2:00s   1:00    D
  1723.     // Rule NZ  1990    max -   Mar Sun>=15 2:00s   0   S
  1724.     // Pacific/Auckland New Zealand(NZ) 12:00   NZ  NZ%sT
  1725.     kSystemTimeZones[n++] =
  1726.     new SimpleTimeZone(12*U_MILLIS_PER_HOUR, "NST" /*alias for Pacific/Auckland*/,
  1727.       Calendar::OCTOBER, 1, -Calendar::SUNDAY /*DOW>=DOM*/, 2*U_MILLIS_PER_HOUR,
  1728.       Calendar::MARCH, 15, -Calendar::SUNDAY /*DOW>=DOM*/, 3*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  1729.     //----------------------------------------------------------
  1730.     kSystemTimeZones[n++] =
  1731.     new SimpleTimeZone((int32_t)(12.75*U_MILLIS_PER_HOUR), "Pacific/Chatham" /*CHA%sT*/,
  1732.       Calendar::OCTOBER, 1, -Calendar::SUNDAY /*DOW>=DOM*/, (int32_t)(2.75*U_MILLIS_PER_HOUR),
  1733.       Calendar::MARCH, 15, -Calendar::SUNDAY /*DOW>=DOM*/, (int32_t)(3.75*U_MILLIS_PER_HOUR), 1*U_MILLIS_PER_HOUR,fgStatus);
  1734.     // Rule Chatham 1990    max -   Oct Sun>=1  2:45s   1:00    D
  1735.     // Rule Chatham 1991    max -   Mar Sun>=15 2:45s   0   S
  1736.     // Pacific/Chatham  New Zealand(NZ) 12:45   Chatham CHA%sT
  1737.     //----------------------------------------------------------
  1738.     kSystemTimeZones[n++] =
  1739.     new SimpleTimeZone(13*U_MILLIS_PER_HOUR, "Pacific/Enderbury" /*PHOT*/);
  1740.     // Pacific/Enderbury    Kiribati(KI)    13:00   -   PHOT
  1741.     //----------------------------------------------------------
  1742.     kSystemTimeZones[n++] =
  1743.     new SimpleTimeZone(13*U_MILLIS_PER_HOUR, "Pacific/Tongatapu" /*TOT*/);
  1744.     // Pacific/Tongatapu    Tonga(TO)   13:00   -   TOT
  1745.     //----------------------------------------------------------
  1746.     kSystemTimeZones[n++] =
  1747.     new SimpleTimeZone(13*U_MILLIS_PER_HOUR, "Asia/Anadyr" /*ANA%sT*/,
  1748.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR,
  1749.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 3*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  1750.     // Rule Russia  1993    max -   Mar lastSun 2:00s   1:00    S
  1751.     // Rule Russia  1996    max -   Oct lastSun 2:00s   0   -
  1752.     // Asia/Anadyr  Russia(RU)  13:00   Russia  ANA%sT
  1753.     //----------------------------------------------------------
  1754.     kSystemTimeZones[n++] =
  1755.     new SimpleTimeZone(14*U_MILLIS_PER_HOUR, "Pacific/Kiritimati" /*LINT*/);
  1756.     // Pacific/Kiritimati   Kiribati(KI)    14:00   -   LINT
  1757.     kSystemTimeZones[n++] =
  1758.     new SimpleTimeZone(-7*U_MILLIS_PER_HOUR, "PNT" /*alias for America/Phoenix*/);
  1759.     //----------------------------------------------------------
  1760.     kSystemTimeZones[n++] =
  1761.     new SimpleTimeZone((int32_t)(-3.5*U_MILLIS_PER_HOUR), "CNT" /*alias for America/St_Johns*/,
  1762.       Calendar::APRIL, 1, -Calendar::SUNDAY /*DOW>=DOM*/, 2*U_MILLIS_PER_HOUR,
  1763.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  1764.     //----------------------------------------------------------
  1765.     kSystemTimeZones[n++] =
  1766.     new SimpleTimeZone(10*U_MILLIS_PER_HOUR, "Antarctica/DumontDUrville" /*DDUT*/);
  1767.     // Antarctica/DumontDUrville    France - year-round bases(AQ)   10:00   -   DDUT    # Dumont-d'Urville Time
  1768.     //----------------------------------------------------------
  1769.     kSystemTimeZones[n++] =
  1770.     new SimpleTimeZone(2*U_MILLIS_PER_HOUR, "Europe/Kaliningrad" /*EE%sT*/,
  1771.       Calendar::MARCH, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 2*U_MILLIS_PER_HOUR,
  1772.       Calendar::OCTOBER, -1, Calendar::SUNDAY /*DOW_IN_DOM*/, 3*U_MILLIS_PER_HOUR, 1*U_MILLIS_PER_HOUR,fgStatus);
  1773.     // Rule Russia  1993    max -   Mar lastSun 2:00s   1:00    S
  1774.     // Rule Russia  1996    max -   Oct lastSun 2:00s   0   -
  1775.     // Europe/Kaliningrad   Russia(RU)  2:00    Russia  EE%sT
  1776.     //----------------------------------------------------------
  1777.     kSystemTimeZones[n++] =
  1778.     new SimpleTimeZone(6*U_MILLIS_PER_HOUR, "Asia/Thimbu" /*BTT*/);
  1779.     // Asia/Thimbu  Bhutan(BT)  6:00    -   BTT # Bhutan Time
  1780.     //----------------------------------------------------------
  1781.     fTimezoneCount = n;
  1782.   }
  1783. }
  1784. // ---------------- END GENERATED DATA ----------------
  1785.  
  1786. // *** clean up from definitions
  1787. #undef int
  1788. #undef U_MILLIS_PER_HOUR
  1789.  
  1790. // *****************************************************************************
  1791. // class TimeZone
  1792. // *****************************************************************************
  1793.  
  1794. TimeZone::TimeZone()
  1795. {
  1796. }
  1797.  
  1798. // -------------------------------------
  1799.  
  1800. TimeZone::~TimeZone()
  1801. {
  1802. }
  1803.  
  1804. // -------------------------------------
  1805.  
  1806. TimeZone::TimeZone(const TimeZone &source)
  1807.     :   fID(source.fID)
  1808. {
  1809. }
  1810.  
  1811. // -------------------------------------
  1812.  
  1813. TimeZone &
  1814. TimeZone::operator=(const TimeZone &right)
  1815. {
  1816.     if (this != &right) fID = right.fID;
  1817.     return *this;
  1818. }
  1819.  
  1820. // -------------------------------------
  1821.  
  1822. bool_t
  1823. TimeZone::operator==(const TimeZone& that) const
  1824. {
  1825.     return getDynamicClassID() == that.getDynamicClassID() &&
  1826.         fID == that.fID;
  1827. }
  1828.  
  1829. // -------------------------------------
  1830.  
  1831. /**
  1832.  * Return a reference to the static Hashtable of registered TimeZone
  1833.  * objects.  Performs initialization if necessary.
  1834.  *
  1835.  * This method is also responsible for initializing the array
  1836.  * fgAvailableIDs and fgAvailableIDsCount.
  1837.  */
  1838. const UHashtable&
  1839. TimeZone::getHashtable()
  1840. {
  1841.   if (kSystemInited == FALSE) {
  1842.       initSystemTimeZones();
  1843.   }
  1844.   if (fgAvailableIDs == 0)
  1845.     {
  1846.       UHashtable *newHashtable;
  1847.       UnicodeString *newAvailableIds;
  1848.      
  1849.       // build a hashtable that contains all the TimeZone objects in kSystemTimeZones
  1850.       // and maps their IDs to the actual TimeZone objects (gives us fast lookup)
  1851.       UErrorCode err = U_ZERO_ERROR;
  1852.       newHashtable = uhash_open((UHashFunction) uhash_hashUString, &err);
  1853.       uhash_setValueDeleter(newHashtable, TimeZone::deleteTimeZone);
  1854.       
  1855.       newAvailableIds = new UnicodeString[fTimezoneCount];
  1856.  
  1857.         int32_t i;
  1858.         for (i=0; i<fTimezoneCount; ++i)
  1859.         {
  1860.             SimpleTimeZone *tz = kSystemTimeZones[i];
  1861.         uhash_putKey(newHashtable, (tz->getID(newAvailableIds[i])).hashCode() & 0x7FFFFFFF, tz , &err);
  1862.     }
  1863.     
  1864.         Mutex lock;
  1865.         // We must recheck fgHashtable for correct locking
  1866.         if (fgHashtable == 0)
  1867.       {
  1868.         fgHashtable = newHashtable;
  1869.         fgAvailableIDsCount = fTimezoneCount;
  1870.         fgAvailableIDs = newAvailableIds;
  1871.       }
  1872.     else
  1873.       {
  1874.         uhash_close(newHashtable);
  1875.         delete [] newAvailableIds;
  1876.       }
  1877.     }
  1878.     return *fgHashtable;
  1879. }
  1880.  
  1881. // -------------------------------------
  1882.  
  1883. /**
  1884.  * Convert a non-localized string to an integer using a system function.
  1885.  * Return a failing UErrorCode status if all characters are not parsed.
  1886.  */
  1887. /*int32_t
  1888. TimeZone::stringToInteger(const UnicodeString& string, UErrorCode& status)
  1889. {
  1890.     if (U_FAILURE(status)) return 0;
  1891.  
  1892.     int32_t len = string.size();
  1893.     char *number = new char[1 + len];
  1894.     if (number == 0) { status = U_MEMORY_ALLOCATION_ERROR; return 0; }
  1895.     char *end;
  1896.  
  1897.     string.extract(0, len, number);
  1898.     number[len] = 0;
  1899.     int32_t value = strtol(number, &end, 10); // Radix 10
  1900.  
  1901.     delete[] number;
  1902.  
  1903.     if (end-number != len || len == 0)
  1904.         status = U_INVALID_FORMAT_ERROR;
  1905.  
  1906.     return value;
  1907. }*/
  1908.  
  1909. // -------------------------------------
  1910.  
  1911. TimeZone*
  1912. TimeZone::createTimeZone(const UnicodeString& ID)
  1913. {
  1914.     if (kSystemInited == FALSE) {
  1915.       initSystemTimeZones();
  1916.     }
  1917.     /* We first try to lookup the zone ID in our hashtable.  If this fails,
  1918.      * we try to parse it as a custom string GMT[+-]hh:mm.  This allows us
  1919.      * to recognize zones in user.timezone that otherwise cannot be
  1920.      * identified.  We do the recognition here, rather than in getDefault(),
  1921.      * so that the default zone is always the result of calling
  1922.      * getTimeZone() with the property user.timezone.
  1923.      *
  1924.      * If all else fails, we return GMT, which is probably not what the user
  1925.      * wants, but at least is a functioning TimeZone object. */
  1926.  
  1927.     TimeZone* result = NULL;
  1928.     UHashtable h = getHashtable();
  1929.     result = (TimeZone*)uhash_get(&h, ID.hashCode() & 0x7FFFFFFF);
  1930.     if(result != NULL)
  1931.         return result->clone();
  1932.  
  1933.     // result == NULL
  1934.       result = createCustomTimeZone(ID);
  1935.     if(result == NULL)
  1936.         result = GMT->clone();
  1937.     
  1938.     return result;
  1939. }
  1940.  
  1941. // -------------------------------------
  1942.  
  1943. void
  1944. TimeZone::initDefault()
  1945. {
  1946.   if (kSystemInited == FALSE) {
  1947.       initSystemTimeZones();
  1948.   }
  1949.   // This function is called by createDefault() and adoptDefault() to initialize
  1950.   // fgDefaultZone from the system default time zone.  If fgDefaultZone is already
  1951.   // filled in, we obviously don't have to do anything.
  1952.   if (fgDefaultZone == NULL)
  1953.     {
  1954.       
  1955.       // We access system timezone data through TPlatformUtilities,
  1956.       // including tzset(), timezone, and tzname[].
  1957.       TimeZone *newZone = NULL;
  1958.       int32_t rawOffset = 0;
  1959.       const char *hostID;
  1960.       UnicodeString ID;
  1961.       
  1962.       // First, try to create the timezone from our hashtable, based
  1963.       // on the string ID in tzname[0].
  1964.       {
  1965.     Mutex lock; // mutexed to avoid threading issues in the platform fcns.
  1966.     icu_tzset(); // Initialize tz... system data
  1967.     
  1968.     // get the timezone ID from the host.
  1969.     hostID = icu_tzname(0);
  1970.     
  1971.     // Invert sign because UNIX semantics are backwards
  1972.     rawOffset = icu_timezone() * -U_MILLIS_PER_SECOND;
  1973.       }
  1974.  
  1975.       // create UnicodeString ID from hostID (to avoid Mutex deadlock)
  1976.       ID = hostID;
  1977.  
  1978.       if (ID.size() > 0) 
  1979.     {
  1980.       UHashtable h = getHashtable();
  1981.       TimeZone *z = (TimeZone*)uhash_get(&h,ID.hashCode() & 0x7FFFFFFF);
  1982.       // Important -- must clone the TimeZone because fgDefaultZone may be
  1983.       // deleted by adoptDefault().
  1984.       if (z != 0) newZone = z->clone();
  1985.     }
  1986.  
  1987.       // If we couldn't get the time zone ID from the host, use the
  1988.       // default host timezone offset, timezone.
  1989.       if (newZone == NULL)
  1990.     {
  1991.       // just pick the first entry in the time zone list that has the
  1992.       // appropriate GMT offset (if there is one)
  1993.       int32_t numMatches = 0;
  1994.       const UnicodeString** matches = createAvailableIDs(rawOffset, numMatches);
  1995.       if (numMatches > 0) {
  1996.         newZone = createTimeZone(*matches[0]);
  1997.         delete [] matches;
  1998.       }
  1999.         }
  2000.  
  2001.       // If we _still_ don't have a time zone, use the one specified by kLastResortID.
  2002.       // (This call should always succeed, since we code the Hashtable
  2003.       // to always contain this TimeZone.)
  2004.       if (newZone == NULL)
  2005.     newZone = createTimeZone(kLastResortID);
  2006.  
  2007.       {
  2008.     Mutex lock2;
  2009.     if(fgDefaultZone != NULL)
  2010.       delete newZone;
  2011.     else
  2012.       fgDefaultZone = newZone;
  2013.       }
  2014.     }
  2015. }
  2016.  
  2017. // -------------------------------------
  2018.  
  2019. TimeZone*
  2020. TimeZone::createDefault()
  2021. {
  2022.     initDefault(); // After this call fgDefaultZone is not NULL
  2023.     Mutex lock; // Careful...must have mutex here
  2024.     return fgDefaultZone->clone();
  2025. }
  2026.  
  2027. // -------------------------------------
  2028.  
  2029. void
  2030. TimeZone::adoptDefault(TimeZone* zone)
  2031. {
  2032.   if (kSystemInited == FALSE) {
  2033.       initSystemTimeZones();
  2034.   }
  2035.  
  2036.     if (zone != NULL)
  2037.     {
  2038.         Mutex mutex;
  2039.  
  2040.         if (fgDefaultZone != NULL) {
  2041.             delete fgDefaultZone;
  2042.         }
  2043.  
  2044.         fgDefaultZone = zone;
  2045.     }
  2046. }
  2047. // -------------------------------------
  2048.  
  2049. void
  2050. TimeZone::setDefault(const TimeZone& zone)
  2051. {
  2052.     adoptDefault(zone.clone());
  2053. }
  2054.  
  2055. // -------------------------------------
  2056.  
  2057. const UnicodeString** const
  2058. TimeZone::createAvailableIDs(int32_t rawOffset, int32_t& numIDs)
  2059. {
  2060.     // We are creating a new array to existing UnicodeString pointers.
  2061.     // The caller will delete the array when done, but not the pointers
  2062.     // in the array.
  2063.  
  2064.     getHashtable(); // Force initialization of fgAvailableIDs
  2065.  
  2066.     const UnicodeString** const ptrArray =
  2067.         (const UnicodeString** const) new UnicodeString*[fgAvailableIDsCount];
  2068.  
  2069.     numIDs = 0;
  2070.     int32_t pos = -1;
  2071.     UHashtable e = getHashtable();
  2072.     void* value;
  2073.     UnicodeString anID;
  2074.     
  2075.     while (numIDs < fgAvailableIDsCount && (value = uhash_nextElement(&e, &pos)))
  2076.     {
  2077.       if (rawOffset == ((SimpleTimeZone *)value)->getRawOffset())
  2078.     ptrArray[numIDs++] = new UnicodeString(((SimpleTimeZone *)value)->getID(anID));
  2079.     }
  2080.     
  2081.     return ptrArray;
  2082. }
  2083.  
  2084. // -------------------------------------
  2085.  
  2086. const UnicodeString** const
  2087. TimeZone::createAvailableIDs(int32_t& numIDs)
  2088. {
  2089.     // We are creating a new array to existing UnicodeString pointers.
  2090.     // The caller will delete the array when done, but not the pointers
  2091.     // in the array.
  2092.  
  2093.     getHashtable(); // Force initialization of fgAvailableIDs
  2094.  
  2095.     const UnicodeString** const ptrArray =
  2096.         (const UnicodeString** const) new UnicodeString*[fgAvailableIDsCount];
  2097.  
  2098.     for (int32_t i=0; i<fgAvailableIDsCount; ++i)
  2099.         ptrArray[i] = &fgAvailableIDs[i];
  2100.  
  2101.     numIDs = fgAvailableIDsCount;
  2102.     return ptrArray;
  2103. }
  2104.  
  2105. // ---------------------------------------
  2106.  
  2107.  
  2108. UnicodeString&
  2109. TimeZone::getDisplayName(UnicodeString& result) const
  2110. {
  2111.     return getDisplayName(FALSE,LONG,Locale::getDefault(), result);
  2112. }
  2113.  
  2114. UnicodeString&
  2115. TimeZone::getDisplayName(const Locale& locale, UnicodeString& result) const
  2116. {
  2117.     return getDisplayName(FALSE, LONG, locale, result);
  2118. }
  2119.  
  2120. UnicodeString&
  2121. TimeZone::getDisplayName(bool_t daylight, EDisplayType style, UnicodeString& result)  const
  2122. {
  2123.     return getDisplayName(daylight,style, Locale::getDefault(), result);
  2124. }
  2125.  
  2126. UnicodeString&
  2127. TimeZone::getDisplayName(bool_t daylight, EDisplayType style, const Locale& locale, UnicodeString& result) const
  2128. {
  2129.   if (kSystemInited == FALSE) {
  2130.       initSystemTimeZones();
  2131.   }
  2132.     // SRL TODO: cache the SDF, just like java.
  2133.     UErrorCode status = U_ZERO_ERROR;
  2134.  
  2135.     SimpleDateFormat format(style == LONG ? "zzzz" : "z",locale,status);
  2136.  
  2137.     if(!U_SUCCESS(status))
  2138.     {
  2139.         // *** SRL what do I do here?!!
  2140.         return result.remove();
  2141.     }
  2142.  
  2143.     // Create a new SimpleTimeZone as a stand-in for this zone; the
  2144.     // stand-in will have no DST, or all DST, but the same ID and offset,
  2145.     // and hence the same display name.
  2146.     // We don't cache these because they're small and cheap to create.
  2147.     UnicodeString tempID;
  2148.     SimpleTimeZone *tz =  daylight ?
  2149.         // For the pure-DST zone, we use JANUARY and DECEMBER
  2150.  
  2151.         new SimpleTimeZone(getRawOffset(), getID(tempID),
  2152.                            Calendar::JANUARY , 1, 0, 0,
  2153.                            Calendar::DECEMBER , 31, 0, U_MILLIS_PER_DAY, status) :
  2154.         new SimpleTimeZone(getRawOffset(), getID(tempID));
  2155.  
  2156.     format.applyPattern(style == LONG ? "zzzz" : "z");
  2157.     Calendar *myCalendar = (Calendar*)format.getCalendar();
  2158.     myCalendar->setTimeZone(*tz); // copy
  2159.     
  2160.     delete tz;
  2161.  
  2162.     FieldPosition pos(FieldPosition::DONT_CARE);
  2163.     return format.format(UDate(196262345678.), result, pos); // Must use a valid date here.
  2164. }
  2165.  
  2166.  
  2167. /**
  2168.  * Parse a custom time zone identifier and return a corresponding zone.
  2169.  * @param id a string of the form GMT[+-]hh:mm, GMT[+-]hhmm, or
  2170.  * GMT[+-]hh.
  2171.  * @return a newly created SimpleTimeZone with the given offset and
  2172.  * no Daylight Savings Time, or null if the id cannot be parsed.
  2173. */
  2174. TimeZone*
  2175. TimeZone::createCustomTimeZone(const UnicodeString& id)
  2176. {
  2177.     static const int32_t         kParseFailed = -99999;
  2178.  
  2179.     NumberFormat* numberFormat = 0;
  2180.     
  2181.     UnicodeString idUppercase = id;
  2182.     idUppercase.toUpper();
  2183.  
  2184.     if (id.size() > GMT_ID_LENGTH &&
  2185.         idUppercase.startsWith(GMT_ID))
  2186.     {
  2187.         ParsePosition pos(GMT_ID_LENGTH);
  2188.         bool_t negative = FALSE;
  2189.         int32_t offset;
  2190.  
  2191.         if (id[pos.getIndex()] == 0x002D /*'-'*/)
  2192.             negative = TRUE;
  2193.         else if (id[pos.getIndex()] != 0x002B /*'+'*/)
  2194.             return 0;
  2195.         pos.setIndex(pos.getIndex() + 1);
  2196.  
  2197.         UErrorCode success = U_ZERO_ERROR;
  2198.         numberFormat = NumberFormat::createInstance(success);
  2199.         numberFormat->setParseIntegerOnly(TRUE);
  2200.  
  2201.     
  2202.         // Look for either hh:mm, hhmm, or hh
  2203.         int32_t start = pos.getIndex();
  2204.         
  2205.         Formattable n(kParseFailed);
  2206.  
  2207.         numberFormat->parse(id, n, pos);
  2208.         if (pos.getIndex() == start) return 0;
  2209.         offset = n.getLong();
  2210.  
  2211.         if (pos.getIndex() < id.size() &&
  2212.             id[pos.getIndex()] == 0x003A /*':'*/)
  2213.         {
  2214.             // hh:mm
  2215.             offset *= 60;
  2216.             pos.setIndex(pos.getIndex() + 1);
  2217.             int32_t oldPos = pos.getIndex();
  2218.             n.setLong(kParseFailed);
  2219.             numberFormat->parse(id, n, pos);
  2220.             if (pos.getIndex() == oldPos) return 0;
  2221.             offset += n.getLong();
  2222.         }
  2223.         else 
  2224.         {
  2225.             // hhmm or hh
  2226.  
  2227.             // Be strict about interpreting something as hh; it must be
  2228.             // an offset < 30, and it must be one or two digits. Thus
  2229.             // 0010 is interpreted as 00:10, but 10 is interpreted as
  2230.             // 10:00.
  2231.             if (offset < 30 && (pos.getIndex() - start) <= 2)
  2232.                 offset *= 60; // hh, from 00 to 29; 30 is 00:30
  2233.             else
  2234.                 offset = offset % 100 + offset / 100 * 60; // hhmm
  2235.         }
  2236.  
  2237.         if(negative)
  2238.             offset = -offset;
  2239.  
  2240.         return new SimpleTimeZone(offset * 60000, CUSTOM_ID);
  2241.         delete numberFormat;
  2242.     }
  2243.     return 0;
  2244. }
  2245.  
  2246.  
  2247. bool_t 
  2248. TimeZone::hasSameRules(const TimeZone& other) const
  2249. {
  2250.     return (getRawOffset() == other.getRawOffset() && 
  2251.             useDaylightTime() == other.useDaylightTime());
  2252. }
  2253.  
  2254. //eof
  2255.