tzinfo-data 1.2013.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (593) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +19 -0
  3. data/README +36 -0
  4. data/lib/tzinfo/data.rb +23 -0
  5. data/lib/tzinfo/data/definitions/Africa/Abidjan.rb +23 -0
  6. data/lib/tzinfo/data/definitions/Africa/Accra.rb +38 -0
  7. data/lib/tzinfo/data/definitions/Africa/Addis_Ababa.rb +25 -0
  8. data/lib/tzinfo/data/definitions/Africa/Algiers.rb +60 -0
  9. data/lib/tzinfo/data/definitions/Africa/Asmara.rb +27 -0
  10. data/lib/tzinfo/data/definitions/Africa/Asmera.rb +18 -0
  11. data/lib/tzinfo/data/definitions/Africa/Bamako.rb +26 -0
  12. data/lib/tzinfo/data/definitions/Africa/Bangui.rb +23 -0
  13. data/lib/tzinfo/data/definitions/Africa/Banjul.rb +27 -0
  14. data/lib/tzinfo/data/definitions/Africa/Bissau.rb +25 -0
  15. data/lib/tzinfo/data/definitions/Africa/Blantyre.rb +23 -0
  16. data/lib/tzinfo/data/definitions/Africa/Brazzaville.rb +23 -0
  17. data/lib/tzinfo/data/definitions/Africa/Bujumbura.rb +23 -0
  18. data/lib/tzinfo/data/definitions/Africa/Cairo.rb +146 -0
  19. data/lib/tzinfo/data/definitions/Africa/Casablanca.rb +171 -0
  20. data/lib/tzinfo/data/definitions/Africa/Ceuta.rb +203 -0
  21. data/lib/tzinfo/data/definitions/Africa/Conakry.rb +26 -0
  22. data/lib/tzinfo/data/definitions/Africa/Dakar.rb +25 -0
  23. data/lib/tzinfo/data/definitions/Africa/Dar_es_Salaam.rb +26 -0
  24. data/lib/tzinfo/data/definitions/Africa/Djibouti.rb +23 -0
  25. data/lib/tzinfo/data/definitions/Africa/Douala.rb +23 -0
  26. data/lib/tzinfo/data/definitions/Africa/El_Aaiun.rb +25 -0
  27. data/lib/tzinfo/data/definitions/Africa/Freetown.rb +58 -0
  28. data/lib/tzinfo/data/definitions/Africa/Gaborone.rb +28 -0
  29. data/lib/tzinfo/data/definitions/Africa/Harare.rb +23 -0
  30. data/lib/tzinfo/data/definitions/Africa/Johannesburg.rb +30 -0
  31. data/lib/tzinfo/data/definitions/Africa/Juba.rb +58 -0
  32. data/lib/tzinfo/data/definitions/Africa/Kampala.rb +28 -0
  33. data/lib/tzinfo/data/definitions/Africa/Khartoum.rb +58 -0
  34. data/lib/tzinfo/data/definitions/Africa/Kigali.rb +23 -0
  35. data/lib/tzinfo/data/definitions/Africa/Kinshasa.rb +23 -0
  36. data/lib/tzinfo/data/definitions/Africa/Lagos.rb +23 -0
  37. data/lib/tzinfo/data/definitions/Africa/Libreville.rb +23 -0
  38. data/lib/tzinfo/data/definitions/Africa/Lome.rb +23 -0
  39. data/lib/tzinfo/data/definitions/Africa/Luanda.rb +25 -0
  40. data/lib/tzinfo/data/definitions/Africa/Lubumbashi.rb +23 -0
  41. data/lib/tzinfo/data/definitions/Africa/Lusaka.rb +23 -0
  42. data/lib/tzinfo/data/definitions/Africa/Malabo.rb +25 -0
  43. data/lib/tzinfo/data/definitions/Africa/Maputo.rb +23 -0
  44. data/lib/tzinfo/data/definitions/Africa/Maseru.rb +26 -0
  45. data/lib/tzinfo/data/definitions/Africa/Mbabane.rb +23 -0
  46. data/lib/tzinfo/data/definitions/Africa/Mogadishu.rb +26 -0
  47. data/lib/tzinfo/data/definitions/Africa/Monrovia.rb +27 -0
  48. data/lib/tzinfo/data/definitions/Africa/Nairobi.rb +28 -0
  49. data/lib/tzinfo/data/definitions/Africa/Ndjamena.rb +26 -0
  50. data/lib/tzinfo/data/definitions/Africa/Niamey.rb +27 -0
  51. data/lib/tzinfo/data/definitions/Africa/Nouakchott.rb +26 -0
  52. data/lib/tzinfo/data/definitions/Africa/Ouagadougou.rb +23 -0
  53. data/lib/tzinfo/data/definitions/Africa/Porto__m__Novo.rb +25 -0
  54. data/lib/tzinfo/data/definitions/Africa/Sao_Tome.rb +25 -0
  55. data/lib/tzinfo/data/definitions/Africa/Timbuktu.rb +18 -0
  56. data/lib/tzinfo/data/definitions/Africa/Tripoli.rb +156 -0
  57. data/lib/tzinfo/data/definitions/Africa/Tunis.rb +58 -0
  58. data/lib/tzinfo/data/definitions/Africa/Windhoek.rb +171 -0
  59. data/lib/tzinfo/data/definitions/America/Adak.rb +227 -0
  60. data/lib/tzinfo/data/definitions/America/Anchorage.rb +227 -0
  61. data/lib/tzinfo/data/definitions/America/Anguilla.rb +23 -0
  62. data/lib/tzinfo/data/definitions/America/Antigua.rb +25 -0
  63. data/lib/tzinfo/data/definitions/America/Araguaina.rb +174 -0
  64. data/lib/tzinfo/data/definitions/America/Argentina/Buenos_Aires.rb +89 -0
  65. data/lib/tzinfo/data/definitions/America/Argentina/Catamarca.rb +90 -0
  66. data/lib/tzinfo/data/definitions/America/Argentina/ComodRivadavia.rb +20 -0
  67. data/lib/tzinfo/data/definitions/America/Argentina/Cordoba.rb +90 -0
  68. data/lib/tzinfo/data/definitions/America/Argentina/Jujuy.rb +89 -0
  69. data/lib/tzinfo/data/definitions/America/Argentina/La_Rioja.rb +91 -0
  70. data/lib/tzinfo/data/definitions/America/Argentina/Mendoza.rb +91 -0
  71. data/lib/tzinfo/data/definitions/America/Argentina/Rio_Gallegos.rb +90 -0
  72. data/lib/tzinfo/data/definitions/America/Argentina/Salta.rb +88 -0
  73. data/lib/tzinfo/data/definitions/America/Argentina/San_Juan.rb +91 -0
  74. data/lib/tzinfo/data/definitions/America/Argentina/San_Luis.rb +92 -0
  75. data/lib/tzinfo/data/definitions/America/Argentina/Tucuman.rb +92 -0
  76. data/lib/tzinfo/data/definitions/America/Argentina/Ushuaia.rb +90 -0
  77. data/lib/tzinfo/data/definitions/America/Aruba.rb +25 -0
  78. data/lib/tzinfo/data/definitions/America/Asuncion.rb +205 -0
  79. data/lib/tzinfo/data/definitions/America/Atikokan.rb +33 -0
  80. data/lib/tzinfo/data/definitions/America/Atka.rb +18 -0
  81. data/lib/tzinfo/data/definitions/America/Bahia.rb +84 -0
  82. data/lib/tzinfo/data/definitions/America/Bahia_Banderas.rb +171 -0
  83. data/lib/tzinfo/data/definitions/America/Barbados.rb +34 -0
  84. data/lib/tzinfo/data/definitions/America/Belem.rb +52 -0
  85. data/lib/tzinfo/data/definitions/America/Belize.rb +79 -0
  86. data/lib/tzinfo/data/definitions/America/Blanc__m__Sablon.rb +31 -0
  87. data/lib/tzinfo/data/definitions/America/Boa_Vista.rb +56 -0
  88. data/lib/tzinfo/data/definitions/America/Bogota.rb +28 -0
  89. data/lib/tzinfo/data/definitions/America/Boise.rb +230 -0
  90. data/lib/tzinfo/data/definitions/America/Buenos_Aires.rb +18 -0
  91. data/lib/tzinfo/data/definitions/America/Cambridge_Bay.rb +204 -0
  92. data/lib/tzinfo/data/definitions/America/Campo_Grande.rb +202 -0
  93. data/lib/tzinfo/data/definitions/America/Cancun.rb +164 -0
  94. data/lib/tzinfo/data/definitions/America/Caracas.rb +28 -0
  95. data/lib/tzinfo/data/definitions/America/Catamarca.rb +18 -0
  96. data/lib/tzinfo/data/definitions/America/Cayenne.rb +25 -0
  97. data/lib/tzinfo/data/definitions/America/Cayman.rb +25 -0
  98. data/lib/tzinfo/data/definitions/America/Chicago.rb +314 -0
  99. data/lib/tzinfo/data/definitions/America/Chihuahua.rb +167 -0
  100. data/lib/tzinfo/data/definitions/America/Coral_Harbour.rb +18 -0
  101. data/lib/tzinfo/data/definitions/America/Cordoba.rb +18 -0
  102. data/lib/tzinfo/data/definitions/America/Costa_Rica.rb +34 -0
  103. data/lib/tzinfo/data/definitions/America/Creston.rb +26 -0
  104. data/lib/tzinfo/data/definitions/America/Cuiaba.rb +200 -0
  105. data/lib/tzinfo/data/definitions/America/Curacao.rb +25 -0
  106. data/lib/tzinfo/data/definitions/America/Danmarkshavn.rb +58 -0
  107. data/lib/tzinfo/data/definitions/America/Dawson.rb +207 -0
  108. data/lib/tzinfo/data/definitions/America/Dawson_Creek.rb +84 -0
  109. data/lib/tzinfo/data/definitions/America/Denver.rb +235 -0
  110. data/lib/tzinfo/data/definitions/America/Detroit.rb +217 -0
  111. data/lib/tzinfo/data/definitions/America/Dominica.rb +23 -0
  112. data/lib/tzinfo/data/definitions/America/Edmonton.rb +231 -0
  113. data/lib/tzinfo/data/definitions/America/Eirunepe.rb +56 -0
  114. data/lib/tzinfo/data/definitions/America/El_Salvador.rb +28 -0
  115. data/lib/tzinfo/data/definitions/America/Ensenada.rb +18 -0
  116. data/lib/tzinfo/data/definitions/America/Fort_Wayne.rb +18 -0
  117. data/lib/tzinfo/data/definitions/America/Fortaleza.rb +62 -0
  118. data/lib/tzinfo/data/definitions/America/Glace_Bay.rb +217 -0
  119. data/lib/tzinfo/data/definitions/America/Godthab.rb +192 -0
  120. data/lib/tzinfo/data/definitions/America/Goose_Bay.rb +286 -0
  121. data/lib/tzinfo/data/definitions/America/Grand_Turk.rb +196 -0
  122. data/lib/tzinfo/data/definitions/America/Grenada.rb +23 -0
  123. data/lib/tzinfo/data/definitions/America/Guadeloupe.rb +23 -0
  124. data/lib/tzinfo/data/definitions/America/Guatemala.rb +32 -0
  125. data/lib/tzinfo/data/definitions/America/Guayaquil.rb +25 -0
  126. data/lib/tzinfo/data/definitions/America/Guyana.rb +29 -0
  127. data/lib/tzinfo/data/definitions/America/Halifax.rb +305 -0
  128. data/lib/tzinfo/data/definitions/America/Havana.rb +232 -0
  129. data/lib/tzinfo/data/definitions/America/Hermosillo.rb +40 -0
  130. data/lib/tzinfo/data/definitions/America/Indiana/Indianapolis.rb +180 -0
  131. data/lib/tzinfo/data/definitions/America/Indiana/Knox.rb +234 -0
  132. data/lib/tzinfo/data/definitions/America/Indiana/Marengo.rb +184 -0
  133. data/lib/tzinfo/data/definitions/America/Indiana/Petersburg.rb +197 -0
  134. data/lib/tzinfo/data/definitions/America/Indiana/Tell_City.rb +182 -0
  135. data/lib/tzinfo/data/definitions/America/Indiana/Vevay.rb +162 -0
  136. data/lib/tzinfo/data/definitions/America/Indiana/Vincennes.rb +182 -0
  137. data/lib/tzinfo/data/definitions/America/Indiana/Winamac.rb +188 -0
  138. data/lib/tzinfo/data/definitions/America/Indianapolis.rb +18 -0
  139. data/lib/tzinfo/data/definitions/America/Inuvik.rb +197 -0
  140. data/lib/tzinfo/data/definitions/America/Iqaluit.rb +201 -0
  141. data/lib/tzinfo/data/definitions/America/Jamaica.rb +46 -0
  142. data/lib/tzinfo/data/definitions/America/Jujuy.rb +18 -0
  143. data/lib/tzinfo/data/definitions/America/Juneau.rb +226 -0
  144. data/lib/tzinfo/data/definitions/America/Kentucky/Louisville.rb +259 -0
  145. data/lib/tzinfo/data/definitions/America/Kentucky/Monticello.rb +229 -0
  146. data/lib/tzinfo/data/definitions/America/Knox_IN.rb +18 -0
  147. data/lib/tzinfo/data/definitions/America/Kralendijk.rb +18 -0
  148. data/lib/tzinfo/data/definitions/America/La_Paz.rb +27 -0
  149. data/lib/tzinfo/data/definitions/America/Lima.rb +40 -0
  150. data/lib/tzinfo/data/definitions/America/Los_Angeles.rb +263 -0
  151. data/lib/tzinfo/data/definitions/America/Louisville.rb +18 -0
  152. data/lib/tzinfo/data/definitions/America/Lower_Princes.rb +18 -0
  153. data/lib/tzinfo/data/definitions/America/Maceio.rb +64 -0
  154. data/lib/tzinfo/data/definitions/America/Managua.rb +41 -0
  155. data/lib/tzinfo/data/definitions/America/Manaus.rb +54 -0
  156. data/lib/tzinfo/data/definitions/America/Marigot.rb +18 -0
  157. data/lib/tzinfo/data/definitions/America/Martinique.rb +28 -0
  158. data/lib/tzinfo/data/definitions/America/Matamoros.rb +162 -0
  159. data/lib/tzinfo/data/definitions/America/Mazatlan.rb +170 -0
  160. data/lib/tzinfo/data/definitions/America/Mendoza.rb +18 -0
  161. data/lib/tzinfo/data/definitions/America/Menominee.rb +221 -0
  162. data/lib/tzinfo/data/definitions/America/Merida.rb +163 -0
  163. data/lib/tzinfo/data/definitions/America/Metlakatla.rb +62 -0
  164. data/lib/tzinfo/data/definitions/America/Mexico_City.rb +175 -0
  165. data/lib/tzinfo/data/definitions/America/Miquelon.rb +180 -0
  166. data/lib/tzinfo/data/definitions/America/Moncton.rb +285 -0
  167. data/lib/tzinfo/data/definitions/America/Monterrey.rb +162 -0
  168. data/lib/tzinfo/data/definitions/America/Montevideo.rb +210 -0
  169. data/lib/tzinfo/data/definitions/America/Montreal.rb +310 -0
  170. data/lib/tzinfo/data/definitions/America/Montserrat.rb +23 -0
  171. data/lib/tzinfo/data/definitions/America/Nassau.rb +224 -0
  172. data/lib/tzinfo/data/definitions/America/New_York.rb +313 -0
  173. data/lib/tzinfo/data/definitions/America/Nipigon.rb +212 -0
  174. data/lib/tzinfo/data/definitions/America/Nome.rb +227 -0
  175. data/lib/tzinfo/data/definitions/America/Noronha.rb +62 -0
  176. data/lib/tzinfo/data/definitions/America/North_Dakota/Beulah.rb +231 -0
  177. data/lib/tzinfo/data/definitions/America/North_Dakota/Center.rb +231 -0
  178. data/lib/tzinfo/data/definitions/America/North_Dakota/New_Salem.rb +231 -0
  179. data/lib/tzinfo/data/definitions/America/Ojinaga.rb +167 -0
  180. data/lib/tzinfo/data/definitions/America/Panama.rb +25 -0
  181. data/lib/tzinfo/data/definitions/America/Pangnirtung.rb +204 -0
  182. data/lib/tzinfo/data/definitions/America/Paramaribo.rb +31 -0
  183. data/lib/tzinfo/data/definitions/America/Phoenix.rb +35 -0
  184. data/lib/tzinfo/data/definitions/America/Port__m__au__m__Prince.rb +164 -0
  185. data/lib/tzinfo/data/definitions/America/Port_of_Spain.rb +23 -0
  186. data/lib/tzinfo/data/definitions/America/Porto_Acre.rb +18 -0
  187. data/lib/tzinfo/data/definitions/America/Porto_Velho.rb +52 -0
  188. data/lib/tzinfo/data/definitions/America/Puerto_Rico.rb +28 -0
  189. data/lib/tzinfo/data/definitions/America/Rainy_River.rb +212 -0
  190. data/lib/tzinfo/data/definitions/America/Rankin_Inlet.rb +196 -0
  191. data/lib/tzinfo/data/definitions/America/Recife.rb +62 -0
  192. data/lib/tzinfo/data/definitions/America/Regina.rb +79 -0
  193. data/lib/tzinfo/data/definitions/America/Resolute.rb +196 -0
  194. data/lib/tzinfo/data/definitions/America/Rio_Branco.rb +54 -0
  195. data/lib/tzinfo/data/definitions/America/Rosario.rb +18 -0
  196. data/lib/tzinfo/data/definitions/America/Santa_Isabel.rb +227 -0
  197. data/lib/tzinfo/data/definitions/America/Santarem.rb +54 -0
  198. data/lib/tzinfo/data/definitions/America/Santiago.rb +236 -0
  199. data/lib/tzinfo/data/definitions/America/Santo_Domingo.rb +43 -0
  200. data/lib/tzinfo/data/definitions/America/Sao_Paulo.rb +202 -0
  201. data/lib/tzinfo/data/definitions/America/Scoresbysund.rb +194 -0
  202. data/lib/tzinfo/data/definitions/America/Shiprock.rb +18 -0
  203. data/lib/tzinfo/data/definitions/America/Sitka.rb +225 -0
  204. data/lib/tzinfo/data/definitions/America/St_Barthelemy.rb +18 -0
  205. data/lib/tzinfo/data/definitions/America/St_Johns.rb +319 -0
  206. data/lib/tzinfo/data/definitions/America/St_Kitts.rb +23 -0
  207. data/lib/tzinfo/data/definitions/America/St_Lucia.rb +25 -0
  208. data/lib/tzinfo/data/definitions/America/St_Thomas.rb +23 -0
  209. data/lib/tzinfo/data/definitions/America/St_Vincent.rb +25 -0
  210. data/lib/tzinfo/data/definitions/America/Swift_Current.rb +49 -0
  211. data/lib/tzinfo/data/definitions/America/Tegucigalpa.rb +30 -0
  212. data/lib/tzinfo/data/definitions/America/Thule.rb +170 -0
  213. data/lib/tzinfo/data/definitions/America/Thunder_Bay.rb +217 -0
  214. data/lib/tzinfo/data/definitions/America/Tijuana.rb +227 -0
  215. data/lib/tzinfo/data/definitions/America/Toronto.rb +310 -0
  216. data/lib/tzinfo/data/definitions/America/Tortola.rb +23 -0
  217. data/lib/tzinfo/data/definitions/America/Vancouver.rb +267 -0
  218. data/lib/tzinfo/data/definitions/America/Virgin.rb +18 -0
  219. data/lib/tzinfo/data/definitions/America/Whitehorse.rb +207 -0
  220. data/lib/tzinfo/data/definitions/America/Winnipeg.rb +263 -0
  221. data/lib/tzinfo/data/definitions/America/Yakutat.rb +224 -0
  222. data/lib/tzinfo/data/definitions/America/Yellowknife.rb +200 -0
  223. data/lib/tzinfo/data/definitions/Antarctica/Casey.rb +28 -0
  224. data/lib/tzinfo/data/definitions/Antarctica/Davis.rb +30 -0
  225. data/lib/tzinfo/data/definitions/Antarctica/DumontDUrville.rb +26 -0
  226. data/lib/tzinfo/data/definitions/Antarctica/Macquarie.rb +115 -0
  227. data/lib/tzinfo/data/definitions/Antarctica/Mawson.rb +25 -0
  228. data/lib/tzinfo/data/definitions/Antarctica/McMurdo.rb +202 -0
  229. data/lib/tzinfo/data/definitions/Antarctica/Palmer.rb +203 -0
  230. data/lib/tzinfo/data/definitions/Antarctica/Rothera.rb +23 -0
  231. data/lib/tzinfo/data/definitions/Antarctica/South_Pole.rb +18 -0
  232. data/lib/tzinfo/data/definitions/Antarctica/Syowa.rb +23 -0
  233. data/lib/tzinfo/data/definitions/Antarctica/Vostok.rb +23 -0
  234. data/lib/tzinfo/data/definitions/Arctic/Longyearbyen.rb +18 -0
  235. data/lib/tzinfo/data/definitions/Asia/Aden.rb +23 -0
  236. data/lib/tzinfo/data/definitions/Asia/Almaty.rb +72 -0
  237. data/lib/tzinfo/data/definitions/Asia/Amman.rb +192 -0
  238. data/lib/tzinfo/data/definitions/Asia/Anadyr.rb +91 -0
  239. data/lib/tzinfo/data/definitions/Asia/Aqtau.rb +80 -0
  240. data/lib/tzinfo/data/definitions/Asia/Aqtobe.rb +76 -0
  241. data/lib/tzinfo/data/definitions/Asia/Ashgabat.rb +53 -0
  242. data/lib/tzinfo/data/definitions/Asia/Ashkhabad.rb +18 -0
  243. data/lib/tzinfo/data/definitions/Asia/Baghdad.rb +78 -0
  244. data/lib/tzinfo/data/definitions/Asia/Bahrain.rb +25 -0
  245. data/lib/tzinfo/data/definitions/Asia/Baku.rb +192 -0
  246. data/lib/tzinfo/data/definitions/Asia/Bangkok.rb +25 -0
  247. data/lib/tzinfo/data/definitions/Asia/Beirut.rb +216 -0
  248. data/lib/tzinfo/data/definitions/Asia/Bishkek.rb +80 -0
  249. data/lib/tzinfo/data/definitions/Asia/Brunei.rb +25 -0
  250. data/lib/tzinfo/data/definitions/Asia/Calcutta.rb +18 -0
  251. data/lib/tzinfo/data/definitions/Asia/Choibalsan.rb +73 -0
  252. data/lib/tzinfo/data/definitions/Asia/Chongqing.rb +38 -0
  253. data/lib/tzinfo/data/definitions/Asia/Chungking.rb +18 -0
  254. data/lib/tzinfo/data/definitions/Asia/Colombo.rb +35 -0
  255. data/lib/tzinfo/data/definitions/Asia/Dacca.rb +18 -0
  256. data/lib/tzinfo/data/definitions/Asia/Damascus.rb +226 -0
  257. data/lib/tzinfo/data/definitions/Asia/Dhaka.rb +35 -0
  258. data/lib/tzinfo/data/definitions/Asia/Dili.rb +30 -0
  259. data/lib/tzinfo/data/definitions/Asia/Dubai.rb +23 -0
  260. data/lib/tzinfo/data/definitions/Asia/Dushanbe.rb +50 -0
  261. data/lib/tzinfo/data/definitions/Asia/Gaza.rb +222 -0
  262. data/lib/tzinfo/data/definitions/Asia/Harbin.rb +42 -0
  263. data/lib/tzinfo/data/definitions/Asia/Hebron.rb +224 -0
  264. data/lib/tzinfo/data/definitions/Asia/Ho_Chi_Minh.rb +28 -0
  265. data/lib/tzinfo/data/definitions/Asia/Hong_Kong.rb +93 -0
  266. data/lib/tzinfo/data/definitions/Asia/Hovd.rb +70 -0
  267. data/lib/tzinfo/data/definitions/Asia/Irkutsk.rb +92 -0
  268. data/lib/tzinfo/data/definitions/Asia/Istanbul.rb +18 -0
  269. data/lib/tzinfo/data/definitions/Asia/Jakarta.rb +35 -0
  270. data/lib/tzinfo/data/definitions/Asia/Jayapura.rb +26 -0
  271. data/lib/tzinfo/data/definitions/Asia/Jerusalem.rb +220 -0
  272. data/lib/tzinfo/data/definitions/Asia/Kabul.rb +25 -0
  273. data/lib/tzinfo/data/definitions/Asia/Kamchatka.rb +89 -0
  274. data/lib/tzinfo/data/definitions/Asia/Karachi.rb +37 -0
  275. data/lib/tzinfo/data/definitions/Asia/Kashgar.rb +40 -0
  276. data/lib/tzinfo/data/definitions/Asia/Kathmandu.rb +25 -0
  277. data/lib/tzinfo/data/definitions/Asia/Katmandu.rb +18 -0
  278. data/lib/tzinfo/data/definitions/Asia/Khandyga.rb +95 -0
  279. data/lib/tzinfo/data/definitions/Asia/Kolkata.rb +30 -0
  280. data/lib/tzinfo/data/definitions/Asia/Krasnoyarsk.rb +90 -0
  281. data/lib/tzinfo/data/definitions/Asia/Kuala_Lumpur.rb +36 -0
  282. data/lib/tzinfo/data/definitions/Asia/Kuching.rb +45 -0
  283. data/lib/tzinfo/data/definitions/Asia/Kuwait.rb +23 -0
  284. data/lib/tzinfo/data/definitions/Asia/Macao.rb +18 -0
  285. data/lib/tzinfo/data/definitions/Asia/Macau.rb +66 -0
  286. data/lib/tzinfo/data/definitions/Asia/Magadan.rb +90 -0
  287. data/lib/tzinfo/data/definitions/Asia/Makassar.rb +28 -0
  288. data/lib/tzinfo/data/definitions/Asia/Manila.rb +35 -0
  289. data/lib/tzinfo/data/definitions/Asia/Muscat.rb +23 -0
  290. data/lib/tzinfo/data/definitions/Asia/Nicosia.rb +202 -0
  291. data/lib/tzinfo/data/definitions/Asia/Novokuznetsk.rb +92 -0
  292. data/lib/tzinfo/data/definitions/Asia/Novosibirsk.rb +90 -0
  293. data/lib/tzinfo/data/definitions/Asia/Omsk.rb +90 -0
  294. data/lib/tzinfo/data/definitions/Asia/Oral.rb +79 -0
  295. data/lib/tzinfo/data/definitions/Asia/Phnom_Penh.rb +28 -0
  296. data/lib/tzinfo/data/definitions/Asia/Pontianak.rb +35 -0
  297. data/lib/tzinfo/data/definitions/Asia/Pyongyang.rb +30 -0
  298. data/lib/tzinfo/data/definitions/Asia/Qatar.rb +25 -0
  299. data/lib/tzinfo/data/definitions/Asia/Qyzylorda.rb +78 -0
  300. data/lib/tzinfo/data/definitions/Asia/Rangoon.rb +29 -0
  301. data/lib/tzinfo/data/definitions/Asia/Riyadh.rb +23 -0
  302. data/lib/tzinfo/data/definitions/Asia/Riyadh87.rb +597 -0
  303. data/lib/tzinfo/data/definitions/Asia/Riyadh88.rb +587 -0
  304. data/lib/tzinfo/data/definitions/Asia/Riyadh89.rb +587 -0
  305. data/lib/tzinfo/data/definitions/Asia/Saigon.rb +18 -0
  306. data/lib/tzinfo/data/definitions/Asia/Sakhalin.rb +92 -0
  307. data/lib/tzinfo/data/definitions/Asia/Samarkand.rb +52 -0
  308. data/lib/tzinfo/data/definitions/Asia/Seoul.rb +39 -0
  309. data/lib/tzinfo/data/definitions/Asia/Shanghai.rb +40 -0
  310. data/lib/tzinfo/data/definitions/Asia/Singapore.rb +38 -0
  311. data/lib/tzinfo/data/definitions/Asia/Taipei.rb +64 -0
  312. data/lib/tzinfo/data/definitions/Asia/Tashkent.rb +52 -0
  313. data/lib/tzinfo/data/definitions/Asia/Tbilisi.rb +83 -0
  314. data/lib/tzinfo/data/definitions/Asia/Tehran.rb +126 -0
  315. data/lib/tzinfo/data/definitions/Asia/Tel_Aviv.rb +18 -0
  316. data/lib/tzinfo/data/definitions/Asia/Thimbu.rb +18 -0
  317. data/lib/tzinfo/data/definitions/Asia/Thimphu.rb +25 -0
  318. data/lib/tzinfo/data/definitions/Asia/Tokyo.rb +35 -0
  319. data/lib/tzinfo/data/definitions/Asia/Ujung_Pandang.rb +18 -0
  320. data/lib/tzinfo/data/definitions/Asia/Ulaanbaatar.rb +70 -0
  321. data/lib/tzinfo/data/definitions/Asia/Ulan_Bator.rb +18 -0
  322. data/lib/tzinfo/data/definitions/Asia/Urumqi.rb +38 -0
  323. data/lib/tzinfo/data/definitions/Asia/Ust__m__Nera.rb +94 -0
  324. data/lib/tzinfo/data/definitions/Asia/Vientiane.rb +28 -0
  325. data/lib/tzinfo/data/definitions/Asia/Vladivostok.rb +91 -0
  326. data/lib/tzinfo/data/definitions/Asia/Yakutsk.rb +90 -0
  327. data/lib/tzinfo/data/definitions/Asia/Yekaterinburg.rb +92 -0
  328. data/lib/tzinfo/data/definitions/Asia/Yerevan.rb +92 -0
  329. data/lib/tzinfo/data/definitions/Atlantic/Azores.rb +301 -0
  330. data/lib/tzinfo/data/definitions/Atlantic/Bermuda.rb +204 -0
  331. data/lib/tzinfo/data/definitions/Atlantic/Canary.rb +194 -0
  332. data/lib/tzinfo/data/definitions/Atlantic/Cape_Verde.rb +28 -0
  333. data/lib/tzinfo/data/definitions/Atlantic/Faeroe.rb +18 -0
  334. data/lib/tzinfo/data/definitions/Atlantic/Faroe.rb +190 -0
  335. data/lib/tzinfo/data/definitions/Atlantic/Jan_Mayen.rb +18 -0
  336. data/lib/tzinfo/data/definitions/Atlantic/Madeira.rb +300 -0
  337. data/lib/tzinfo/data/definitions/Atlantic/Reykjavik.rb +90 -0
  338. data/lib/tzinfo/data/definitions/Atlantic/South_Georgia.rb +23 -0
  339. data/lib/tzinfo/data/definitions/Atlantic/St_Helena.rb +25 -0
  340. data/lib/tzinfo/data/definitions/Atlantic/Stanley.rb +97 -0
  341. data/lib/tzinfo/data/definitions/Australia/ACT.rb +18 -0
  342. data/lib/tzinfo/data/definitions/Australia/Adelaide.rb +218 -0
  343. data/lib/tzinfo/data/definitions/Australia/Brisbane.rb +40 -0
  344. data/lib/tzinfo/data/definitions/Australia/Broken_Hill.rb +220 -0
  345. data/lib/tzinfo/data/definitions/Australia/Canberra.rb +18 -0
  346. data/lib/tzinfo/data/definitions/Australia/Currie.rb +216 -0
  347. data/lib/tzinfo/data/definitions/Australia/Darwin.rb +34 -0
  348. data/lib/tzinfo/data/definitions/Australia/Eucla.rb +42 -0
  349. data/lib/tzinfo/data/definitions/Australia/Hobart.rb +224 -0
  350. data/lib/tzinfo/data/definitions/Australia/LHI.rb +18 -0
  351. data/lib/tzinfo/data/definitions/Australia/Lindeman.rb +44 -0
  352. data/lib/tzinfo/data/definitions/Australia/Lord_Howe.rb +191 -0
  353. data/lib/tzinfo/data/definitions/Australia/Melbourne.rb +216 -0
  354. data/lib/tzinfo/data/definitions/Australia/NSW.rb +18 -0
  355. data/lib/tzinfo/data/definitions/Australia/North.rb +18 -0
  356. data/lib/tzinfo/data/definitions/Australia/Perth.rb +42 -0
  357. data/lib/tzinfo/data/definitions/Australia/Queensland.rb +18 -0
  358. data/lib/tzinfo/data/definitions/Australia/South.rb +18 -0
  359. data/lib/tzinfo/data/definitions/Australia/Sydney.rb +216 -0
  360. data/lib/tzinfo/data/definitions/Australia/Tasmania.rb +18 -0
  361. data/lib/tzinfo/data/definitions/Australia/Victoria.rb +18 -0
  362. data/lib/tzinfo/data/definitions/Australia/West.rb +18 -0
  363. data/lib/tzinfo/data/definitions/Australia/Yancowinna.rb +18 -0
  364. data/lib/tzinfo/data/definitions/Brazil/Acre.rb +18 -0
  365. data/lib/tzinfo/data/definitions/Brazil/DeNoronha.rb +18 -0
  366. data/lib/tzinfo/data/definitions/Brazil/East.rb +18 -0
  367. data/lib/tzinfo/data/definitions/Brazil/West.rb +18 -0
  368. data/lib/tzinfo/data/definitions/CET.rb +208 -0
  369. data/lib/tzinfo/data/definitions/CST6CDT.rb +223 -0
  370. data/lib/tzinfo/data/definitions/Canada/Atlantic.rb +18 -0
  371. data/lib/tzinfo/data/definitions/Canada/Central.rb +18 -0
  372. data/lib/tzinfo/data/definitions/Canada/East__m__Saskatchewan.rb +18 -0
  373. data/lib/tzinfo/data/definitions/Canada/Eastern.rb +18 -0
  374. data/lib/tzinfo/data/definitions/Canada/Mountain.rb +18 -0
  375. data/lib/tzinfo/data/definitions/Canada/Newfoundland.rb +18 -0
  376. data/lib/tzinfo/data/definitions/Canada/Pacific.rb +18 -0
  377. data/lib/tzinfo/data/definitions/Canada/Saskatchewan.rb +18 -0
  378. data/lib/tzinfo/data/definitions/Canada/Yukon.rb +18 -0
  379. data/lib/tzinfo/data/definitions/Chile/Continental.rb +18 -0
  380. data/lib/tzinfo/data/definitions/Chile/EasterIsland.rb +18 -0
  381. data/lib/tzinfo/data/definitions/Cuba.rb +16 -0
  382. data/lib/tzinfo/data/definitions/EET.rb +194 -0
  383. data/lib/tzinfo/data/definitions/EST.rb +19 -0
  384. data/lib/tzinfo/data/definitions/EST5EDT.rb +223 -0
  385. data/lib/tzinfo/data/definitions/Egypt.rb +16 -0
  386. data/lib/tzinfo/data/definitions/Eire.rb +16 -0
  387. data/lib/tzinfo/data/definitions/Etc/GMT.rb +21 -0
  388. data/lib/tzinfo/data/definitions/Etc/GMT0.rb +18 -0
  389. data/lib/tzinfo/data/definitions/Etc/GMT__m__0.rb +18 -0
  390. data/lib/tzinfo/data/definitions/Etc/GMT__m__1.rb +21 -0
  391. data/lib/tzinfo/data/definitions/Etc/GMT__m__10.rb +21 -0
  392. data/lib/tzinfo/data/definitions/Etc/GMT__m__11.rb +21 -0
  393. data/lib/tzinfo/data/definitions/Etc/GMT__m__12.rb +21 -0
  394. data/lib/tzinfo/data/definitions/Etc/GMT__m__13.rb +21 -0
  395. data/lib/tzinfo/data/definitions/Etc/GMT__m__14.rb +21 -0
  396. data/lib/tzinfo/data/definitions/Etc/GMT__m__2.rb +21 -0
  397. data/lib/tzinfo/data/definitions/Etc/GMT__m__3.rb +21 -0
  398. data/lib/tzinfo/data/definitions/Etc/GMT__m__4.rb +21 -0
  399. data/lib/tzinfo/data/definitions/Etc/GMT__m__5.rb +21 -0
  400. data/lib/tzinfo/data/definitions/Etc/GMT__m__6.rb +21 -0
  401. data/lib/tzinfo/data/definitions/Etc/GMT__m__7.rb +21 -0
  402. data/lib/tzinfo/data/definitions/Etc/GMT__m__8.rb +21 -0
  403. data/lib/tzinfo/data/definitions/Etc/GMT__m__9.rb +21 -0
  404. data/lib/tzinfo/data/definitions/Etc/GMT__p__0.rb +18 -0
  405. data/lib/tzinfo/data/definitions/Etc/GMT__p__1.rb +21 -0
  406. data/lib/tzinfo/data/definitions/Etc/GMT__p__10.rb +21 -0
  407. data/lib/tzinfo/data/definitions/Etc/GMT__p__11.rb +21 -0
  408. data/lib/tzinfo/data/definitions/Etc/GMT__p__12.rb +21 -0
  409. data/lib/tzinfo/data/definitions/Etc/GMT__p__2.rb +21 -0
  410. data/lib/tzinfo/data/definitions/Etc/GMT__p__3.rb +21 -0
  411. data/lib/tzinfo/data/definitions/Etc/GMT__p__4.rb +21 -0
  412. data/lib/tzinfo/data/definitions/Etc/GMT__p__5.rb +21 -0
  413. data/lib/tzinfo/data/definitions/Etc/GMT__p__6.rb +21 -0
  414. data/lib/tzinfo/data/definitions/Etc/GMT__p__7.rb +21 -0
  415. data/lib/tzinfo/data/definitions/Etc/GMT__p__8.rb +21 -0
  416. data/lib/tzinfo/data/definitions/Etc/GMT__p__9.rb +21 -0
  417. data/lib/tzinfo/data/definitions/Etc/Greenwich.rb +18 -0
  418. data/lib/tzinfo/data/definitions/Etc/UCT.rb +21 -0
  419. data/lib/tzinfo/data/definitions/Etc/UTC.rb +21 -0
  420. data/lib/tzinfo/data/definitions/Etc/Universal.rb +18 -0
  421. data/lib/tzinfo/data/definitions/Etc/Zulu.rb +18 -0
  422. data/lib/tzinfo/data/definitions/Europe/Amsterdam.rb +259 -0
  423. data/lib/tzinfo/data/definitions/Europe/Andorra.rb +184 -0
  424. data/lib/tzinfo/data/definitions/Europe/Athens.rb +216 -0
  425. data/lib/tzinfo/data/definitions/Europe/Belfast.rb +18 -0
  426. data/lib/tzinfo/data/definitions/Europe/Belgrade.rb +194 -0
  427. data/lib/tzinfo/data/definitions/Europe/Berlin.rb +219 -0
  428. data/lib/tzinfo/data/definitions/Europe/Bratislava.rb +18 -0
  429. data/lib/tzinfo/data/definitions/Europe/Brussels.rb +263 -0
  430. data/lib/tzinfo/data/definitions/Europe/Bucharest.rb +212 -0
  431. data/lib/tzinfo/data/definitions/Europe/Budapest.rb +228 -0
  432. data/lib/tzinfo/data/definitions/Europe/Busingen.rb +18 -0
  433. data/lib/tzinfo/data/definitions/Europe/Chisinau.rb +220 -0
  434. data/lib/tzinfo/data/definitions/Europe/Copenhagen.rb +210 -0
  435. data/lib/tzinfo/data/definitions/Europe/Dublin.rb +307 -0
  436. data/lib/tzinfo/data/definitions/Europe/Gibraltar.rb +276 -0
  437. data/lib/tzinfo/data/definitions/Europe/Guernsey.rb +18 -0
  438. data/lib/tzinfo/data/definitions/Europe/Helsinki.rb +194 -0
  439. data/lib/tzinfo/data/definitions/Europe/Isle_of_Man.rb +18 -0
  440. data/lib/tzinfo/data/definitions/Europe/Istanbul.rb +249 -0
  441. data/lib/tzinfo/data/definitions/Europe/Jersey.rb +18 -0
  442. data/lib/tzinfo/data/definitions/Europe/Kaliningrad.rb +108 -0
  443. data/lib/tzinfo/data/definitions/Europe/Kiev.rb +199 -0
  444. data/lib/tzinfo/data/definitions/Europe/Lisbon.rb +299 -0
  445. data/lib/tzinfo/data/definitions/Europe/Ljubljana.rb +18 -0
  446. data/lib/tzinfo/data/definitions/Europe/London.rb +319 -0
  447. data/lib/tzinfo/data/definitions/Europe/Luxembourg.rb +262 -0
  448. data/lib/tzinfo/data/definitions/Europe/Madrid.rb +242 -0
  449. data/lib/tzinfo/data/definitions/Europe/Malta.rb +244 -0
  450. data/lib/tzinfo/data/definitions/Europe/Mariehamn.rb +18 -0
  451. data/lib/tzinfo/data/definitions/Europe/Minsk.rb +97 -0
  452. data/lib/tzinfo/data/definitions/Europe/Monaco.rb +264 -0
  453. data/lib/tzinfo/data/definitions/Europe/Moscow.rb +108 -0
  454. data/lib/tzinfo/data/definitions/Europe/Nicosia.rb +18 -0
  455. data/lib/tzinfo/data/definitions/Europe/Oslo.rb +216 -0
  456. data/lib/tzinfo/data/definitions/Europe/Paris.rb +263 -0
  457. data/lib/tzinfo/data/definitions/Europe/Podgorica.rb +18 -0
  458. data/lib/tzinfo/data/definitions/Europe/Prague.rb +218 -0
  459. data/lib/tzinfo/data/definitions/Europe/Riga.rb +207 -0
  460. data/lib/tzinfo/data/definitions/Europe/Rome.rb +246 -0
  461. data/lib/tzinfo/data/definitions/Europe/Samara.rb +95 -0
  462. data/lib/tzinfo/data/definitions/Europe/San_Marino.rb +18 -0
  463. data/lib/tzinfo/data/definitions/Europe/Sarajevo.rb +18 -0
  464. data/lib/tzinfo/data/definitions/Europe/Simferopol.rb +201 -0
  465. data/lib/tzinfo/data/definitions/Europe/Skopje.rb +18 -0
  466. data/lib/tzinfo/data/definitions/Europe/Sofia.rb +204 -0
  467. data/lib/tzinfo/data/definitions/Europe/Stockholm.rb +196 -0
  468. data/lib/tzinfo/data/definitions/Europe/Tallinn.rb +203 -0
  469. data/lib/tzinfo/data/definitions/Europe/Tirane.rb +208 -0
  470. data/lib/tzinfo/data/definitions/Europe/Tiraspol.rb +18 -0
  471. data/lib/tzinfo/data/definitions/Europe/Uzhgorod.rb +199 -0
  472. data/lib/tzinfo/data/definitions/Europe/Vaduz.rb +190 -0
  473. data/lib/tzinfo/data/definitions/Europe/Vatican.rb +18 -0
  474. data/lib/tzinfo/data/definitions/Europe/Vienna.rb +214 -0
  475. data/lib/tzinfo/data/definitions/Europe/Vilnius.rb +201 -0
  476. data/lib/tzinfo/data/definitions/Europe/Volgograd.rb +92 -0
  477. data/lib/tzinfo/data/definitions/Europe/Warsaw.rb +243 -0
  478. data/lib/tzinfo/data/definitions/Europe/Zagreb.rb +18 -0
  479. data/lib/tzinfo/data/definitions/Europe/Zaporozhye.rb +202 -0
  480. data/lib/tzinfo/data/definitions/Europe/Zurich.rb +196 -0
  481. data/lib/tzinfo/data/definitions/GB.rb +16 -0
  482. data/lib/tzinfo/data/definitions/GB__m__Eire.rb +16 -0
  483. data/lib/tzinfo/data/definitions/GMT.rb +16 -0
  484. data/lib/tzinfo/data/definitions/GMT0.rb +16 -0
  485. data/lib/tzinfo/data/definitions/GMT__m__0.rb +16 -0
  486. data/lib/tzinfo/data/definitions/GMT__p__0.rb +16 -0
  487. data/lib/tzinfo/data/definitions/Greenwich.rb +16 -0
  488. data/lib/tzinfo/data/definitions/HST.rb +19 -0
  489. data/lib/tzinfo/data/definitions/Hongkong.rb +16 -0
  490. data/lib/tzinfo/data/definitions/Iceland.rb +16 -0
  491. data/lib/tzinfo/data/definitions/Indian/Antananarivo.rb +26 -0
  492. data/lib/tzinfo/data/definitions/Indian/Chagos.rb +25 -0
  493. data/lib/tzinfo/data/definitions/Indian/Christmas.rb +23 -0
  494. data/lib/tzinfo/data/definitions/Indian/Cocos.rb +23 -0
  495. data/lib/tzinfo/data/definitions/Indian/Comoro.rb +23 -0
  496. data/lib/tzinfo/data/definitions/Indian/Kerguelen.rb +23 -0
  497. data/lib/tzinfo/data/definitions/Indian/Mahe.rb +23 -0
  498. data/lib/tzinfo/data/definitions/Indian/Maldives.rb +25 -0
  499. data/lib/tzinfo/data/definitions/Indian/Mauritius.rb +28 -0
  500. data/lib/tzinfo/data/definitions/Indian/Mayotte.rb +23 -0
  501. data/lib/tzinfo/data/definitions/Indian/Reunion.rb +23 -0
  502. data/lib/tzinfo/data/definitions/Iran.rb +16 -0
  503. data/lib/tzinfo/data/definitions/Israel.rb +16 -0
  504. data/lib/tzinfo/data/definitions/Jamaica.rb +16 -0
  505. data/lib/tzinfo/data/definitions/Japan.rb +16 -0
  506. data/lib/tzinfo/data/definitions/Kwajalein.rb +16 -0
  507. data/lib/tzinfo/data/definitions/Libya.rb +16 -0
  508. data/lib/tzinfo/data/definitions/MET.rb +208 -0
  509. data/lib/tzinfo/data/definitions/MST.rb +19 -0
  510. data/lib/tzinfo/data/definitions/MST7MDT.rb +223 -0
  511. data/lib/tzinfo/data/definitions/Mexico/BajaNorte.rb +18 -0
  512. data/lib/tzinfo/data/definitions/Mexico/BajaSur.rb +18 -0
  513. data/lib/tzinfo/data/definitions/Mexico/General.rb +18 -0
  514. data/lib/tzinfo/data/definitions/Mideast/Riyadh87.rb +18 -0
  515. data/lib/tzinfo/data/definitions/Mideast/Riyadh88.rb +18 -0
  516. data/lib/tzinfo/data/definitions/Mideast/Riyadh89.rb +18 -0
  517. data/lib/tzinfo/data/definitions/NZ.rb +16 -0
  518. data/lib/tzinfo/data/definitions/NZ__m__CHAT.rb +16 -0
  519. data/lib/tzinfo/data/definitions/Navajo.rb +16 -0
  520. data/lib/tzinfo/data/definitions/PRC.rb +16 -0
  521. data/lib/tzinfo/data/definitions/PST8PDT.rb +223 -0
  522. data/lib/tzinfo/data/definitions/Pacific/Apia.rb +137 -0
  523. data/lib/tzinfo/data/definitions/Pacific/Auckland.rb +233 -0
  524. data/lib/tzinfo/data/definitions/Pacific/Chatham.rb +202 -0
  525. data/lib/tzinfo/data/definitions/Pacific/Chuuk.rb +23 -0
  526. data/lib/tzinfo/data/definitions/Pacific/Easter.rb +221 -0
  527. data/lib/tzinfo/data/definitions/Pacific/Efate.rb +44 -0
  528. data/lib/tzinfo/data/definitions/Pacific/Enderbury.rb +27 -0
  529. data/lib/tzinfo/data/definitions/Pacific/Fakaofo.rb +25 -0
  530. data/lib/tzinfo/data/definitions/Pacific/Fiji.rb +136 -0
  531. data/lib/tzinfo/data/definitions/Pacific/Funafuti.rb +23 -0
  532. data/lib/tzinfo/data/definitions/Pacific/Galapagos.rb +25 -0
  533. data/lib/tzinfo/data/definitions/Pacific/Gambier.rb +23 -0
  534. data/lib/tzinfo/data/definitions/Pacific/Guadalcanal.rb +23 -0
  535. data/lib/tzinfo/data/definitions/Pacific/Guam.rb +27 -0
  536. data/lib/tzinfo/data/definitions/Pacific/Honolulu.rb +30 -0
  537. data/lib/tzinfo/data/definitions/Pacific/Johnston.rb +21 -0
  538. data/lib/tzinfo/data/definitions/Pacific/Kiritimati.rb +27 -0
  539. data/lib/tzinfo/data/definitions/Pacific/Kosrae.rb +26 -0
  540. data/lib/tzinfo/data/definitions/Pacific/Kwajalein.rb +27 -0
  541. data/lib/tzinfo/data/definitions/Pacific/Majuro.rb +25 -0
  542. data/lib/tzinfo/data/definitions/Pacific/Marquesas.rb +23 -0
  543. data/lib/tzinfo/data/definitions/Pacific/Midway.rb +30 -0
  544. data/lib/tzinfo/data/definitions/Pacific/Nauru.rb +28 -0
  545. data/lib/tzinfo/data/definitions/Pacific/Niue.rb +27 -0
  546. data/lib/tzinfo/data/definitions/Pacific/Norfolk.rb +25 -0
  547. data/lib/tzinfo/data/definitions/Pacific/Noumea.rb +30 -0
  548. data/lib/tzinfo/data/definitions/Pacific/Pago_Pago.rb +31 -0
  549. data/lib/tzinfo/data/definitions/Pacific/Palau.rb +23 -0
  550. data/lib/tzinfo/data/definitions/Pacific/Pitcairn.rb +25 -0
  551. data/lib/tzinfo/data/definitions/Pacific/Pohnpei.rb +23 -0
  552. data/lib/tzinfo/data/definitions/Pacific/Ponape.rb +18 -0
  553. data/lib/tzinfo/data/definitions/Pacific/Port_Moresby.rb +25 -0
  554. data/lib/tzinfo/data/definitions/Pacific/Rarotonga.rb +51 -0
  555. data/lib/tzinfo/data/definitions/Pacific/Saipan.rb +29 -0
  556. data/lib/tzinfo/data/definitions/Pacific/Samoa.rb +18 -0
  557. data/lib/tzinfo/data/definitions/Pacific/Tahiti.rb +23 -0
  558. data/lib/tzinfo/data/definitions/Pacific/Tarawa.rb +23 -0
  559. data/lib/tzinfo/data/definitions/Pacific/Tongatapu.rb +32 -0
  560. data/lib/tzinfo/data/definitions/Pacific/Truk.rb +18 -0
  561. data/lib/tzinfo/data/definitions/Pacific/Wake.rb +23 -0
  562. data/lib/tzinfo/data/definitions/Pacific/Wallis.rb +23 -0
  563. data/lib/tzinfo/data/definitions/Pacific/Yap.rb +18 -0
  564. data/lib/tzinfo/data/definitions/Poland.rb +16 -0
  565. data/lib/tzinfo/data/definitions/Portugal.rb +16 -0
  566. data/lib/tzinfo/data/definitions/ROC.rb +16 -0
  567. data/lib/tzinfo/data/definitions/ROK.rb +16 -0
  568. data/lib/tzinfo/data/definitions/Singapore.rb +16 -0
  569. data/lib/tzinfo/data/definitions/Turkey.rb +16 -0
  570. data/lib/tzinfo/data/definitions/UCT.rb +16 -0
  571. data/lib/tzinfo/data/definitions/US/Alaska.rb +18 -0
  572. data/lib/tzinfo/data/definitions/US/Aleutian.rb +18 -0
  573. data/lib/tzinfo/data/definitions/US/Arizona.rb +18 -0
  574. data/lib/tzinfo/data/definitions/US/Central.rb +18 -0
  575. data/lib/tzinfo/data/definitions/US/East__m__Indiana.rb +18 -0
  576. data/lib/tzinfo/data/definitions/US/Eastern.rb +18 -0
  577. data/lib/tzinfo/data/definitions/US/Hawaii.rb +18 -0
  578. data/lib/tzinfo/data/definitions/US/Indiana__m__Starke.rb +18 -0
  579. data/lib/tzinfo/data/definitions/US/Michigan.rb +18 -0
  580. data/lib/tzinfo/data/definitions/US/Mountain.rb +18 -0
  581. data/lib/tzinfo/data/definitions/US/Pacific.rb +18 -0
  582. data/lib/tzinfo/data/definitions/US/Pacific__m__New.rb +18 -0
  583. data/lib/tzinfo/data/definitions/US/Samoa.rb +18 -0
  584. data/lib/tzinfo/data/definitions/UTC.rb +16 -0
  585. data/lib/tzinfo/data/definitions/Universal.rb +16 -0
  586. data/lib/tzinfo/data/definitions/WET.rb +194 -0
  587. data/lib/tzinfo/data/definitions/W__m__SU.rb +16 -0
  588. data/lib/tzinfo/data/definitions/Zulu.rb +16 -0
  589. data/lib/tzinfo/data/indexes/countries.rb +929 -0
  590. data/lib/tzinfo/data/indexes/timezones.rb +599 -0
  591. data/lib/tzinfo/data/tzdataparser.rb +1270 -0
  592. data/lib/tzinfo/data/version.rb +36 -0
  593. metadata +669 -0
@@ -0,0 +1,1270 @@
1
+ #--
2
+ # Copyright (c) 2005-2013 Philip Ross
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ # of this software and associated documentation files (the "Software"), to deal
6
+ # in the Software without restriction, including without limitation the rights
7
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ # copies of the Software, and to permit persons to whom the Software is
9
+ # furnished to do so, subject to the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be included in all
12
+ # copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20
+ # THE SOFTWARE.
21
+ #++
22
+
23
+ require 'date'
24
+ require 'fileutils'
25
+
26
+ module TZInfo
27
+ module Data
28
+
29
+ # Utility methods used by TZDataParser and associated classes.
30
+ module TZDataParserUtils #:nodoc:
31
+
32
+ begin
33
+ Encoding
34
+ SUPPORTS_ENCODING = true
35
+ rescue NameError
36
+ SUPPORTS_ENCODING = false
37
+ end
38
+
39
+ if SUPPORTS_ENCODING
40
+ def open_file(file_name, mode, opts, &block)
41
+ File.open(file_name, mode, opts, &block)
42
+ end
43
+ else
44
+ def open_file(file_name, mode, opts, &block)
45
+ File.open(file_name, mode, &block)
46
+ end
47
+ end
48
+
49
+ private :open_file
50
+
51
+ private
52
+
53
+ # Parses a month specified in the tz data and converts it to a number
54
+ # between 1 and 12 representing January to December.
55
+ def parse_month(month)
56
+ lower = month.downcase
57
+ if lower =~ /^jan/
58
+ @month = 1
59
+ elsif lower =~ /^feb/
60
+ @month = 2
61
+ elsif lower =~ /^mar/
62
+ @month = 3
63
+ elsif lower =~ /^apr/
64
+ @month = 4
65
+ elsif lower =~ /^may/
66
+ @month = 5
67
+ elsif lower =~ /^jun/
68
+ @month = 6
69
+ elsif lower =~ /^jul/
70
+ @month = 7
71
+ elsif lower =~ /^aug/
72
+ @month = 8
73
+ elsif lower =~ /^sep/
74
+ @month = 9
75
+ elsif lower =~ /^oct/
76
+ @month = 10
77
+ elsif lower =~ /^nov/
78
+ @month = 11
79
+ elsif lower =~ /^dec/
80
+ @month = 12
81
+ else
82
+ raise "Invalid month: #{month}"
83
+ end
84
+ end
85
+
86
+ # Parses an offset string [-]h:m:s (minutes and seconds are optional). Returns
87
+ # the offset in seconds.
88
+ def parse_offset(offset)
89
+ raise "Invalid time: #{offset}" if offset !~ /^(-)?(?:([0-9]+)(?::([0-9]+)(?::([0-9]+))?)?)?$/
90
+
91
+ negative = !$1.nil?
92
+ hour = $2.nil? ? 0 : $2.to_i
93
+ minute = $3.nil? ? 0 : $3.to_i
94
+ second = $4.nil? ? 0 : $4.to_i
95
+
96
+ seconds = hour
97
+ seconds = seconds * 60
98
+ seconds = seconds + minute
99
+ seconds = seconds * 60
100
+ seconds = seconds + second
101
+ seconds = -seconds if negative
102
+ seconds
103
+ end
104
+
105
+ # Encloses the string in single quotes and escapes any single quotes in
106
+ # the content.
107
+ def quote_str(str)
108
+ "'#{str.gsub('\'', '\\\\\'')}'"
109
+ end
110
+ end
111
+
112
+ # Parses Time Zone Data from the IANA Time Zone Database and transforms it
113
+ # into a set of Ruby modules that can be used with TZInfo.
114
+ #
115
+ # Normally, this class wouldn't be used. It is only run to update the
116
+ # timezone data and index modules.
117
+ class TZDataParser
118
+ include TZDataParserUtils
119
+
120
+ # Default earliest year that will be considered.
121
+ DEFAULT_MIN_YEAR = 1800
122
+
123
+ # Default number of future years data to generate (not including the
124
+ # current year).
125
+ DEFAULT_FUTURE_YEARS = 50
126
+
127
+ # Earliest year that will be considered. Defaults to DEFAULT_MIN_YEAR.
128
+ attr_accessor :min_year
129
+
130
+ # Latest year that will be considered. Defaults to the current year plus
131
+ # FUTURE_YEARS.
132
+ attr_accessor :max_year
133
+
134
+ # Whether to generate zone definitions (set to false to stop zones being
135
+ # generated).
136
+ attr_accessor :generate_zones
137
+
138
+ # Whether to generate country definitions (set to false to stop countries
139
+ # being generated).
140
+ attr_accessor :generate_countries
141
+
142
+ # Limit the set of zones to generate (set to an array containing zone
143
+ # identifiers).
144
+ attr_accessor :only_zones
145
+
146
+ # Zones to exclude from generation when not using only_zones (set to an
147
+ # array containing zone identifiers).
148
+ attr_accessor :exclude_zones
149
+
150
+ # Initializes a new TZDataParser. input_dir must contain the extracted
151
+ # tzdata tarball. output_dir is the location to output the modules
152
+ # (in definitions and indexes directories).
153
+ def initialize(input_dir, output_dir)
154
+ super()
155
+ @input_dir = input_dir
156
+ @output_dir = output_dir
157
+ @min_year = DEFAULT_MIN_YEAR
158
+ @max_year = Time.now.year + DEFAULT_FUTURE_YEARS
159
+ @rule_sets = {}
160
+ @zones = {}
161
+ @countries = {}
162
+ @no_rules = TZDataNoRules.new
163
+ @generate_zones = true
164
+ @generate_countries = true
165
+ @only_zones = []
166
+ @exclude_zones = []
167
+ end
168
+
169
+ # Reads the tzdata source and generates the classes. Progress information
170
+ # is written to standard out.
171
+ def execute
172
+ files = Dir.entries(@input_dir).select do |file|
173
+ file =~ /\A[^\.]+\z/ &&
174
+ !%w(README Makefile).include?(file) &&
175
+ File.file?(File.join(@input_dir, file))
176
+ end
177
+
178
+ files.each {|file| load_rules(file) }
179
+ files.each {|file| load_zones(file) }
180
+ files.each {|file| load_links(file) }
181
+
182
+ load_countries
183
+
184
+ if @generate_zones
185
+ modules = []
186
+
187
+ if @only_zones.nil? || @only_zones.empty?
188
+ @zones.each_value {|zone|
189
+ zone.write_module(@output_dir) unless @exclude_zones.include?(zone.name)
190
+ }
191
+ else
192
+ @only_zones.each {|id|
193
+ zone = @zones[id]
194
+ zone.write_module(@output_dir)
195
+ }
196
+ end
197
+
198
+ write_timezones_index
199
+ end
200
+
201
+ if @generate_countries
202
+ write_countries_index
203
+ end
204
+ end
205
+
206
+ private
207
+ # Loads all the Rule definitions from the tz data and stores them in
208
+ # @rule_sets.
209
+ def load_rules(file)
210
+ puts 'load_rules: ' + file
211
+
212
+ # Files are in ASCII, but may change to UTF-8 (a superset of ASCII)
213
+ # in the future.
214
+ open_file(File.join(@input_dir, file), 'r', :external_encoding => 'UTF-8', :internal_encoding => 'UTF-8') do |file|
215
+ file.each_line do |line|
216
+ line = line.gsub(/#.*$/, '')
217
+ line = line.gsub(/\s+$/, '')
218
+
219
+ if line =~ /^Rule\s+([^\s]+)\s+([^\s]+)\s+([^\s]+)\s+([^\s]+)\s+([^\s]+)\s+([^\s]+)\s+([^\s]+)\s+([^\s]+)\s+([^\s]+)/
220
+
221
+ name = $1
222
+
223
+ if @rule_sets[name].nil?
224
+ @rule_sets[name] = TZDataRuleSet.new(name)
225
+ end
226
+
227
+ @rule_sets[name].add_rule(TZDataRule.new($2, $3, $4, $5, $6, $7, $8, $9))
228
+ end
229
+ end
230
+ end
231
+ end
232
+
233
+ # Gets a rules object for the given reference. Might be a named rule set,
234
+ # a fixed offset or an empty ruleset.
235
+ def get_rules(ref)
236
+ if ref == '-'
237
+ @no_rules
238
+ elsif ref =~ /^[0-9]+:[0-9]+$/
239
+ TZDataFixedOffsetRules.new(parse_offset(ref))
240
+ else
241
+ rule_set = @rule_sets[ref]
242
+ raise "Ruleset not found: #{ref}" if rule_set.nil?
243
+ rule_set
244
+ end
245
+ end
246
+
247
+ # Loads in the Zone definitions from the tz data and stores them in @zones.
248
+ def load_zones(file)
249
+ puts 'load_zones: ' + file
250
+
251
+ in_zone = nil
252
+
253
+ # Files are in ASCII, but may change to UTF-8 (a superset of ASCII)
254
+ # in the future.
255
+ open_file(File.join(@input_dir, file), 'r', :external_encoding => 'UTF-8', :internal_encoding => 'UTF-8') do |file|
256
+ file.each_line do |line|
257
+ line = line.gsub(/#.*$/, '')
258
+ line = line.gsub(/\s+$/, '')
259
+
260
+ if in_zone
261
+ if line =~ /^\s+([^\s]+)\s+([^\s]+)\s+([^\s]+)(\s+([0-9]+(\s+.*)?))?$/
262
+
263
+ in_zone.add_observance(TZDataObservance.new($1, get_rules($2), $3, $5))
264
+
265
+ in_zone = nil if $4.nil?
266
+ end
267
+ else
268
+ if line =~ /^Zone\s+([^\s]+)\s+([^\s]+)\s+([^\s]+)\s+([^\s]+)(\s+([0-9]+(\s+.*)?))?$/
269
+ name = $1
270
+
271
+ if @zones[name].nil?
272
+ @zones[name] = TZDataZone.new(name, @min_year..@max_year)
273
+ end
274
+
275
+ @zones[name].add_observance(TZDataObservance.new($2, get_rules($3), $4, $6))
276
+
277
+ in_zone = @zones[name] if !$5.nil?
278
+ end
279
+ end
280
+ end
281
+ end
282
+ end
283
+
284
+ # Loads in the links and stores them in @zones.
285
+ def load_links(file)
286
+ puts 'load_links: ' + file
287
+
288
+ # Files are in ASCII, but may change to UTF-8 (a superset of ASCII)
289
+ # in the future.
290
+ open_file(File.join(@input_dir, file), 'r', :external_encoding => 'UTF-8', :internal_encoding => 'UTF-8') do |file|
291
+ file.each_line do |line|
292
+ line = line.gsub(/#.*$/, '')
293
+ line = line.gsub(/\s+$/, '')
294
+
295
+ if line =~ /^Link\s+([^\s]+)\s+([^\s]+)/
296
+ name = $2
297
+ link_to = @zones[$1]
298
+ raise "Link to zone not found (#{name}->#{link_to})" if link_to.nil?
299
+ raise "Zone already defined: #{name}" if !@zones[name].nil?
300
+ @zones[name] = TZDataLink.new(name, link_to)
301
+ end
302
+ end
303
+ end
304
+ end
305
+
306
+ # Loads countries from iso3166.tab and zone.tab and stores the result in
307
+ # @countries.
308
+ def load_countries
309
+ puts 'load_countries'
310
+
311
+ # Files are in ASCII, but may change to UTF-8 (a superset of ASCII)
312
+ # in the future.
313
+ open_file(File.join(@input_dir, 'iso3166.tab'), 'r', :external_encoding => 'UTF-8', :internal_encoding => 'UTF-8') do |file|
314
+ file.each_line do |line|
315
+
316
+ if line =~ /^([A-Z]{2})\t(.*)$/
317
+ code = $1
318
+ name = $2
319
+ @countries[code] = TZDataCountry.new(code, name)
320
+ end
321
+ end
322
+ end
323
+
324
+ # Files are in ASCII, but may change to UTF-8 (a superset of ASCII)
325
+ # in the future.
326
+ open_file(File.join(@input_dir, 'zone.tab'), 'r', :external_encoding => 'UTF-8', :internal_encoding => 'UTF-8') do |file|
327
+ file.each_line do |line|
328
+
329
+ line.chomp!
330
+
331
+ if line =~ /^([A-Z]{2})\t([^\t]+)\t([^\t]+)(\t(.*))?$/
332
+ code = $1
333
+ location_str = $2
334
+ zone_name = $3
335
+ description = $5
336
+
337
+ country = @countries[code]
338
+ raise "Country not found: #{code}" if country.nil?
339
+
340
+ location = TZDataLocation.new(location_str)
341
+
342
+ zone = @zones[zone_name]
343
+ raise "Zone not found: #{zone_name}" if zone.nil?
344
+
345
+ description = nil if description == ''
346
+
347
+ country.add_zone(TZDataCountryTimezone.new(zone, description, location))
348
+ end
349
+ end
350
+ end
351
+ end
352
+
353
+ # Writes a country index file.
354
+ def write_countries_index
355
+ dir = File.join(@output_dir, 'indexes')
356
+ FileUtils.mkdir_p(dir)
357
+
358
+ open_file(File.join(dir, 'countries.rb'), 'w', :external_encoding => 'UTF-8', :universal_newline => true) do |file|
359
+ file.puts('# encoding: UTF-8')
360
+ file.puts('')
361
+ file.puts('# This file contains data derived from the IANA Time Zone Database')
362
+ file.puts('# (http://www.iana.org/time-zones).')
363
+ file.puts('')
364
+
365
+ file.puts('module TZInfo')
366
+ file.puts(' module Data')
367
+ file.puts(' module Indexes')
368
+ file.puts(' module Countries')
369
+ file.puts(' include CountryIndexDefinition')
370
+ file.puts('')
371
+
372
+ countries = @countries.values.sort {|c1,c2| c1.code <=> c2.code}
373
+ countries.each {|country| country.write_index_record(file)}
374
+
375
+ file.puts(' end') # end module Countries
376
+ file.puts(' end') # end module Indexes
377
+ file.puts(' end') # end module Data
378
+ file.puts('end') # end module TZInfo
379
+ end
380
+ end
381
+
382
+ # Writes a timezone index file.
383
+ def write_timezones_index
384
+ dir = File.join(@output_dir, 'indexes')
385
+ FileUtils.mkdir_p(dir)
386
+
387
+ open_file(File.join(dir, 'timezones.rb'), 'w', :external_encoding => 'UTF-8', :universal_newline => true) do |file|
388
+ file.puts('# encoding: UTF-8')
389
+ file.puts('')
390
+ file.puts('# This file contains data derived from the IANA Time Zone Database')
391
+ file.puts('# (http://www.iana.org/time-zones).')
392
+ file.puts('')
393
+
394
+ file.puts('module TZInfo')
395
+ file.puts(' module Data')
396
+ file.puts(' module Indexes')
397
+ file.puts(' module Timezones')
398
+ file.puts(' include TimezoneIndexDefinition')
399
+ file.puts('')
400
+
401
+ zones = @zones.values.sort {|t1,t2| t1.name <=> t2.name}
402
+ zones.each {|zone| zone.write_index_record(file)}
403
+
404
+ file.puts(' end') # end module Timezones
405
+ file.puts(' end') # end module Indexes
406
+ file.puts(' end') # end module Data
407
+ file.puts('end') # end module TZInfo
408
+ end
409
+
410
+ end
411
+ end
412
+
413
+ # Base class for all rule sets.
414
+ class TZDataRules #:nodoc:
415
+ # Name of the rule set, e.g. EU.
416
+ attr_reader :name
417
+
418
+ def initialize(name)
419
+ @name = name
420
+ end
421
+
422
+ def count
423
+ 0
424
+ end
425
+ end
426
+
427
+ # Empty rule set with a fixed daylight savings (std) offset.
428
+ class TZDataFixedOffsetRules < TZDataRules #:nodoc:
429
+ attr_reader :offset
430
+
431
+ def initialize(offset)
432
+ super(offset.to_s)
433
+ @offset = offset
434
+ end
435
+ end
436
+
437
+ # An empty set of rules.
438
+ class TZDataNoRules < TZDataRules #:nodoc:
439
+ def initialize
440
+ super('-')
441
+ end
442
+ end
443
+
444
+ # A rule set (as defined by Rule name in the tz data).
445
+ class TZDataRuleSet < TZDataRules #:nodoc:
446
+ attr_reader :rules
447
+
448
+ def initialize(name)
449
+ super
450
+ @rules = []
451
+ end
452
+
453
+ # Adds a new rule to the set.
454
+ def add_rule(rule)
455
+ @rules << rule
456
+ end
457
+
458
+ def count
459
+ @rules.length
460
+ end
461
+
462
+ def each
463
+ @rules.each {|rule| yield rule}
464
+ end
465
+ end
466
+
467
+ # A rule in a RuleSet (a single Rule line in the tz data).
468
+ class TZDataRule #:nodoc:
469
+ include TZDataParserUtils
470
+
471
+ attr_reader :from
472
+ attr_reader :to
473
+ attr_reader :type
474
+ attr_reader :in_month
475
+ attr_reader :on_day
476
+ attr_reader :at_time
477
+ attr_reader :save
478
+ attr_reader :letter
479
+
480
+ def initialize(from, to, type, in_month, on_day, at_time, save, letter)
481
+ @from = parse_from(from)
482
+ @to = parse_to(to)
483
+
484
+ # replace a to of :only with the from year
485
+ raise 'to cannot be only if from is minimum' if @to == :only && @from == :min
486
+ @to = @from if @to == :only
487
+
488
+ @type = parse_type(type)
489
+ @in_month = parse_month(in_month)
490
+ @on_day = TZDataDayOfMonth.new(on_day)
491
+ @at_time = TZDataTime.new(at_time)
492
+ @save = parse_offset(save)
493
+ @letter = parse_letter(letter)
494
+ end
495
+
496
+ def activate(year)
497
+ # The following test ignores yearistype at present (currently unused in
498
+ # the data. parse_type currently excepts on encountering a year type.
499
+ if (@from == :min || @from <= year) && (@to == :max || @to >= year)
500
+ TZDataActivatedRule.new(self, year)
501
+ else
502
+ nil
503
+ end
504
+ end
505
+
506
+ def at_utc_time(year, utc_offset, std_offset)
507
+ @at_time.to_utc(utc_offset, std_offset,
508
+ year, @in_month, @on_day.to_absolute(year, @in_month))
509
+ end
510
+
511
+ private
512
+ def parse_from(from)
513
+ lower = from.downcase
514
+ if lower =~ /^min/
515
+ :min
516
+ elsif lower =~ /^[0-9]+$/
517
+ lower.to_i
518
+ else
519
+ raise "Invalid from: #{from}"
520
+ end
521
+ end
522
+
523
+ def parse_to(to)
524
+ lower = to.downcase
525
+ if lower =~ /^max/
526
+ :max
527
+ elsif lower =~ /^o/
528
+ :only
529
+ elsif lower =~ /^[0-9]+$/
530
+ lower.to_i
531
+ else
532
+ raise "Invalid to: #{to}"
533
+ end
534
+ end
535
+
536
+ def parse_type(type)
537
+ raise "Unsupported rule type: #{type}" if type != '-'
538
+ nil
539
+ end
540
+
541
+ def parse_letter(letter)
542
+ if letter == '-'
543
+ nil
544
+ else
545
+ letter
546
+ end
547
+ end
548
+ end
549
+
550
+ # Base class for Zones and Links.
551
+ class TZDataDefinition #:nodoc:
552
+ include TZDataParserUtils
553
+
554
+ attr_reader :name
555
+ attr_reader :name_elements
556
+ attr_reader :path_elements
557
+
558
+ def initialize(name)
559
+ @name = name
560
+
561
+ # + and - aren't allowed in class names
562
+ @name_elements = name.gsub(/-/, '__m__').gsub(/\+/, '__p__').split(/\//)
563
+ @path_elements = @name_elements.clone
564
+ @path_elements.pop
565
+ end
566
+
567
+ # Creates necessary directories, the file, writes the class header and footer
568
+ # and yields to a block to write the content.
569
+ def create_file(output_dir)
570
+ dir = File.join(output_dir, 'definitions', @path_elements.join(File::SEPARATOR))
571
+ FileUtils.mkdir_p(dir)
572
+
573
+ open_file(File.join(output_dir, 'definitions', @name_elements.join(File::SEPARATOR)) + '.rb', 'w', :external_encoding => 'UTF-8', :universal_newline => true) do |file|
574
+
575
+ def file.indent(by)
576
+ if @tz_indent
577
+ @tz_indent += by
578
+ else
579
+ @tz_indent = by
580
+ end
581
+ end
582
+
583
+ def file.puts(s)
584
+ super("#{' ' * (@tz_indent || 0)}#{s}")
585
+ end
586
+
587
+ file.puts('# encoding: UTF-8')
588
+ file.puts('')
589
+ file.puts('# This file contains data derived from the IANA Time Zone Database')
590
+ file.puts('# (http://www.iana.org/time-zones).')
591
+ file.puts('')
592
+ file.puts('module TZInfo')
593
+ file.indent(2)
594
+ file.puts('module Data')
595
+ file.indent(2)
596
+ file.puts('module Definitions')
597
+ file.indent(2)
598
+
599
+ @name_elements.each do |part|
600
+ file.puts("module #{part}")
601
+ file.indent(2)
602
+ end
603
+
604
+ file.puts('include TimezoneDefinition')
605
+ file.puts('')
606
+
607
+ yield file
608
+
609
+ @name_elements.each do
610
+ file.indent(-2)
611
+ file.puts('end')
612
+ end
613
+ file.indent(-2)
614
+ file.puts('end') # end module Definitions
615
+ file.indent(-2)
616
+ file.puts('end') # end module Data
617
+ file.indent(-2)
618
+ file.puts('end') # end module TZInfo
619
+ end
620
+ end
621
+ end
622
+
623
+ # A tz data Link.
624
+ class TZDataLink < TZDataDefinition #:nodoc:
625
+ include TZDataParserUtils
626
+
627
+ attr_reader :link_to
628
+
629
+ def initialize(name, link_to)
630
+ super(name)
631
+ @link_to = link_to
632
+ end
633
+
634
+ # Writes a module for this link.
635
+ def write_module(output_dir)
636
+ puts "writing link #{name}"
637
+
638
+ create_file(output_dir) {|file|
639
+ file.puts("linked_timezone #{quote_str(@name)}, #{quote_str(@link_to.name)}")
640
+ }
641
+ end
642
+
643
+ # Writes an index record for this link.
644
+ def write_index_record(file)
645
+ file.puts(" linked_timezone #{quote_str(@name)}")
646
+ end
647
+ end
648
+
649
+ # A tz data Zone. Each line from the tz data is loaded as a TZDataObservance.
650
+ class TZDataZone < TZDataDefinition #:nodoc:
651
+ include TZDataParserUtils
652
+
653
+ attr_reader :observances
654
+
655
+ def initialize(name, years)
656
+ super(name)
657
+ @years = years
658
+ @observances = []
659
+ end
660
+
661
+ def add_observance(observance)
662
+ @observances << observance
663
+ end
664
+
665
+ # Writes the module for the zone. Iterates all the periods and asks them
666
+ # to write all periods in the timezone.
667
+ def write_module(output_dir)
668
+ puts "writing zone #{name}"
669
+
670
+ create_file(output_dir) {|file|
671
+
672
+ file.puts("timezone #{quote_str(@name)} do |tz|")
673
+ file.indent(2)
674
+
675
+ transitions = find_transitions
676
+ transitions.output_module(file)
677
+
678
+ file.indent(-2)
679
+ file.puts('end')
680
+ }
681
+ end
682
+
683
+ # Writes an index record for this zone.
684
+ def write_index_record(file)
685
+ file.puts(" timezone #{quote_str(@name)}")
686
+ end
687
+
688
+ private
689
+ def find_transitions
690
+ transitions = TZDataTransitions.new(@years)
691
+
692
+ # algorithm from zic.c outzone
693
+
694
+ start_time = nil
695
+ until_time = nil
696
+
697
+
698
+ @observances.each_with_index {|observance, i|
699
+ std_offset = 0
700
+ use_start = i > 0
701
+ use_until = i < @observances.length - 1
702
+ utc_offset = observance.utc_offset
703
+ start_zone_id = nil
704
+ start_utc_offset = observance.utc_offset
705
+ start_std_offset = 0
706
+
707
+ if observance.rule_set.count == 0
708
+ std_offset = observance.std_offset
709
+ start_zone_id = observance.format.expand(std_offset, nil)
710
+
711
+ if use_start
712
+ transitions << TZDataTransition.new(start_time, utc_offset, std_offset, start_zone_id)
713
+ use_start = false
714
+ else
715
+ # zic algorithm only outputs this if std_offset is non-zero
716
+ # to get the initial LMT range, we output this regardless
717
+ transitions << TZDataTransition.new(nil, utc_offset, std_offset, start_zone_id)
718
+ end
719
+ else
720
+ @years.each {|year|
721
+ if use_until && year > observance.valid_until.year
722
+ break
723
+ end
724
+
725
+ activated_rules = []
726
+
727
+ observance.rule_set.each {|rule|
728
+ activated_rule = rule.activate(year)
729
+ activated_rules << activated_rule unless activated_rule.nil?
730
+ }
731
+
732
+ while true
733
+ # turn until_time into UTC using the current utc_offset and std_offset
734
+ until_time = observance.valid_until.to_utc(utc_offset, std_offset) if use_until
735
+
736
+ earliest = nil
737
+
738
+ activated_rules.each {|activated_rule|
739
+ # recalculate the time using the current std_offset
740
+ activated_rule.calculate_time(utc_offset, std_offset)
741
+ earliest = activated_rule if earliest.nil? || activated_rule.at < earliest.at
742
+ }
743
+
744
+ break if earliest.nil?
745
+ activated_rules.delete(earliest)
746
+ break if use_until && earliest.at >= until_time
747
+ std_offset = earliest.rule.save
748
+ use_start = false if use_start && earliest.at == start_time
749
+
750
+ if use_start
751
+ if earliest.at < start_time
752
+ start_utc_offset = observance.utc_offset
753
+ start_std_offset = std_offset
754
+ start_zone_id = observance.format.expand(earliest.rule.save, earliest.rule.letter)
755
+ next
756
+ end
757
+
758
+ if start_zone_id.nil? && start_utc_offset + start_std_offset == observance.utc_offset + std_offset
759
+ start_zone_id = observance.format.expand(earliest.rule.save, earliest.rule.letter)
760
+ end
761
+ end
762
+
763
+ zone_id = observance.format.expand(earliest.rule.save, earliest.rule.letter)
764
+ transitions << TZDataTransition.new(earliest.at, observance.utc_offset, earliest.rule.save, zone_id)
765
+ end
766
+ }
767
+ end
768
+
769
+ if use_start
770
+ start_zone_id = observance.format.expand(nil, nil) if start_zone_id.nil? && observance.format.fixed?
771
+ raise 'Could not determine time zone abbreviation to use just after until time' if start_zone_id.nil?
772
+ transitions << TZDataTransition.new(start_time, start_utc_offset, start_std_offset, start_zone_id)
773
+ end
774
+
775
+ start_time = observance.valid_until.to_utc(utc_offset, std_offset) if use_until
776
+ }
777
+
778
+ transitions
779
+ end
780
+ end
781
+
782
+ # A observance within a zone (a line within the zone definition).
783
+ class TZDataObservance #:nodoc:
784
+ include TZDataParserUtils
785
+
786
+ attr_reader :utc_offset
787
+ attr_reader :rule_set
788
+ attr_reader :format
789
+ attr_reader :valid_until
790
+
791
+ def initialize(utc_offset, rule_set, format, valid_until)
792
+ @utc_offset = parse_offset(utc_offset)
793
+ @rule_set = rule_set
794
+ @format = TZDataFormat.new(format)
795
+ @valid_until = valid_until.nil? ? nil : TZDataUntil.new(valid_until)
796
+ end
797
+
798
+ def std_offset
799
+ if @rule_set.kind_of?(TZDataFixedOffsetRules)
800
+ @rule_set.offset
801
+ else
802
+ 0
803
+ end
804
+ end
805
+ end
806
+
807
+ # Collection of TZDataTransition instances used when building a zone class.
808
+ class TZDataTransitions #:nodoc:
809
+ include TZDataParserUtils
810
+
811
+ def initialize(years)
812
+ @years = years
813
+ @transitions = []
814
+ end
815
+
816
+ def << (transition)
817
+ @transitions << transition
818
+ end
819
+
820
+ def output_module(file)
821
+ optimize
822
+
823
+ # Try and end on a transition to std if one happens in the last year.
824
+ if @transitions.length > 1 &&
825
+ @transitions.last.std_offset != 0 &&
826
+ @transitions[@transitions.length - 2].std_offset == 0 &&
827
+ @transitions[@transitions.length - 2].at_utc.year == @years.max
828
+
829
+ transitions = @transitions[0..@transitions.length - 2]
830
+ else
831
+ transitions = @transitions
832
+ end
833
+
834
+ process_offsets(file)
835
+ file.puts('')
836
+
837
+ transitions.each do |t|
838
+ t.write(file)
839
+ end
840
+ end
841
+
842
+ private
843
+ def optimize
844
+ @transitions.sort!
845
+
846
+ # Optimization logic from zic.c writezone.
847
+
848
+ from_i = 0
849
+ to_i = 0
850
+
851
+ while from_i < @transitions.length
852
+ if to_i > 1 &&
853
+ !@transitions[from_i].at_utc.nil? &&
854
+ !@transitions[to_i - 1].at_utc.nil? &&
855
+ @transitions[from_i].at_utc + Rational(@transitions[to_i - 1].total_offset, 86400) <=
856
+ @transitions[to_i - 1].at_utc + Rational(@transitions[to_i - 2].total_offset, 86400)
857
+
858
+ @transitions[to_i - 1] = @transitions[from_i].clone_with_at(@transitions[to_i - 1].at_utc)
859
+ from_i += 1
860
+ next
861
+ end
862
+
863
+ # Shuffle transitions up, eliminating any redundant transitions
864
+ # along the way.
865
+ if to_i == 0 ||
866
+ @transitions[to_i - 1].utc_offset != @transitions[from_i].utc_offset ||
867
+ @transitions[to_i - 1].std_offset != @transitions[from_i].std_offset ||
868
+ @transitions[to_i - 1].zone_id != @transitions[from_i].zone_id
869
+
870
+ @transitions[to_i] = @transitions[from_i]
871
+ to_i += 1
872
+ end
873
+
874
+ from_i += 1
875
+ end
876
+
877
+ if to_i > 0
878
+ @transitions = @transitions[0..to_i - 1]
879
+ else
880
+ @transitions = []
881
+ end
882
+ end
883
+
884
+ def quote_zone_id(zone_id)
885
+ if zone_id =~ %r{[\-+']}
886
+ ":#{quote_str(zone_id)}"
887
+ else
888
+ ":#{zone_id}"
889
+ end
890
+ end
891
+
892
+ def process_offsets(file)
893
+ # A bit of a hack at the moment. The offset used to be output with
894
+ # each period (pair of transitions). They are now separated from the
895
+ # transition data. The code should probably be changed at some point to
896
+ # setup the offsets at an earlier stage.
897
+
898
+ # Assume that when this is called, the first transition is the Local
899
+ # Mean Time initial rule or a transition with no time that defines the
900
+ # offset for the entire zone.
901
+
902
+ offsets = []
903
+
904
+ # Find the first std offset. Timezones always start in std.
905
+ @transitions.each do |t|
906
+ if t.std_offset == 0
907
+ offset = {:utc_offset => t.utc_offset,
908
+ :std_offset => t.std_offset,
909
+ :zone_id => t.zone_id,
910
+ :name => 'o0'}
911
+
912
+ offsets << offset
913
+ break
914
+ end
915
+ end
916
+
917
+ @transitions.each do |t|
918
+ offset = offsets.find do |o|
919
+ o[:utc_offset] == t.utc_offset &&
920
+ o[:std_offset] == t.std_offset &&
921
+ o[:zone_id] == t.zone_id
922
+ end
923
+
924
+ unless offset
925
+ offset = {:utc_offset => t.utc_offset,
926
+ :std_offset => t.std_offset,
927
+ :zone_id => t.zone_id,
928
+ :name => "o#{offsets.length}"}
929
+
930
+ offsets << offset
931
+ end
932
+
933
+ t.offset_name = offset[:name]
934
+ end
935
+
936
+ offsets.each do |offset|
937
+ file.puts("tz.offset :#{offset[:name]}, #{offset[:utc_offset]}, #{offset[:std_offset]}, #{quote_zone_id(offset[:zone_id])}")
938
+ end
939
+
940
+ end
941
+ end
942
+
943
+ # A transition that will be used to write the periods in a zone class.
944
+ class TZDataTransition #:nodoc:
945
+ include Comparable
946
+
947
+ EPOCH = DateTime.new(1970, 1, 1)
948
+
949
+ attr_reader :at_utc
950
+ attr_reader :utc_offset
951
+ attr_reader :std_offset
952
+ attr_reader :zone_id
953
+ attr_accessor :offset_name
954
+
955
+ def initialize(at_utc, utc_offset, std_offset, zone_id)
956
+ @at_utc = at_utc
957
+ @utc_offset = utc_offset
958
+ @std_offset = std_offset
959
+ @zone_id = zone_id
960
+ @offset_name = nil
961
+ end
962
+
963
+ def to_s
964
+ "At #{at_utc} UTC switch to UTC offset #{@utc_offset} with std offset #{@std_offset}, zone id #{@zone_id}"
965
+ end
966
+
967
+ def <=>(transition)
968
+ if @at_utc == transition.at_utc
969
+ 0
970
+ elsif @at_utc.nil?
971
+ -1
972
+ elsif transition.nil?
973
+ 1
974
+ else
975
+ @at_utc - transition.at_utc
976
+ end
977
+ end
978
+
979
+ def total_offset
980
+ @utc_offset + @std_offset
981
+ end
982
+
983
+ def clone_with_at(at_utc)
984
+ TZDataTransition.new(at_utc, @utc_offset, @std_offset, @zone_id)
985
+ end
986
+
987
+ def write(file)
988
+ if @at_utc
989
+ file.puts "tz.transition #{@at_utc.year}, #{@at_utc.mon}, :#{@offset_name}, #{timestamp_parameters(@at_utc)}"
990
+ end
991
+ end
992
+
993
+ private
994
+ def timestamp_parameters(datetime)
995
+ timestamp = ((datetime - EPOCH) * 86400).to_i
996
+
997
+ if timestamp < 0 || timestamp > 2147483647
998
+ # Output DateTime parameters as well as a timestamp for platforms
999
+ # where Time doesn't support negative or 64-bit values.
1000
+ "#{timestamp}, #{datetime.ajd.numerator}, #{datetime.ajd.denominator}"
1001
+ else
1002
+ timestamp
1003
+ end
1004
+ end
1005
+ end
1006
+
1007
+ # An instance of a rule for a year.
1008
+ class TZDataActivatedRule #:nodoc:
1009
+ attr_reader :rule
1010
+ attr_reader :year
1011
+ attr_reader :at
1012
+
1013
+ def initialize(rule, year)
1014
+ @rule = rule
1015
+ @year = year
1016
+ @at = nil
1017
+ end
1018
+
1019
+ def calculate_time(utc_offset, std_offset)
1020
+ @at = @rule.at_utc_time(@year, utc_offset, std_offset)
1021
+ end
1022
+ end
1023
+
1024
+ # A tz data time definition - an hour, minute, second and reference. Reference
1025
+ # is either :utc, :standard or :wall_clock.
1026
+ class TZDataTime #:nodoc:
1027
+ attr_reader :hour
1028
+ attr_reader :minute
1029
+ attr_reader :second
1030
+ attr_reader :ref
1031
+
1032
+ def initialize(spec)
1033
+ raise "Invalid time: #{spec}" if spec !~ /^([0-9]+)(:([0-9]+)(:([0-9]+))?)?([wguzs])?$/
1034
+
1035
+ @hour = $1.to_i
1036
+ @minute = $3.nil? ? 0 : $3.to_i
1037
+ @second = $5.nil? ? 0 : $5.to_i
1038
+
1039
+ if $6 == 's'
1040
+ @ref = :standard
1041
+ elsif $6 == 'g' || $6 == 'u' || $6 == 'z'
1042
+ @ref = :utc
1043
+ else
1044
+ @ref = :wall_clock
1045
+ end
1046
+ end
1047
+
1048
+ # Converts the time to UTC given a utc_offset and std_offset.
1049
+ def to_utc(utc_offset, std_offset, year, month, day)
1050
+ result = DateTime.new(year, month, day, @hour, @minute, @second)
1051
+ offset = 0
1052
+ offset = offset + utc_offset if @ref == :standard || @ref == :wall_clock
1053
+ offset = offset + std_offset if @ref == :wall_clock
1054
+ result - Rational(offset, 86400)
1055
+ end
1056
+ end
1057
+
1058
+ # A tz data day of the month reference. Can either be an absolute day,
1059
+ # a last week day or a week day >= or <= than a specific day of month.
1060
+ class TZDataDayOfMonth #:nodoc:
1061
+ attr_reader :type
1062
+ attr_reader :day_of_month
1063
+ attr_reader :day_of_week
1064
+ attr_reader :operator
1065
+
1066
+ def initialize(spec)
1067
+ raise "Invalid on: #{spec}" if spec !~ /^([0-9]+)|(last([A-z]+))|(([A-z]+)([<>]=)([0-9]+))$/
1068
+
1069
+ if $1
1070
+ @type = :absolute
1071
+ @day_of_month = $1.to_i
1072
+ elsif $3
1073
+ @type = :last
1074
+ @day_of_week = parse_day_of_week($3)
1075
+ else
1076
+ @type = :comparison
1077
+ @day_of_week = parse_day_of_week($5)
1078
+ @operator = parse_operator($6)
1079
+ @day_of_month = $7.to_i
1080
+ end
1081
+ end
1082
+
1083
+ # Returns the absolute day of month for the given year and month.
1084
+ def to_absolute(year, month)
1085
+ case @type
1086
+ when :last
1087
+ last_day_in_month = (Date.new(year, month, 1) >> 1) - 1
1088
+ offset = last_day_in_month.wday - @day_of_week
1089
+ offset = offset + 7 if offset < 0
1090
+ (last_day_in_month - offset).day
1091
+ when :comparison
1092
+ pivot = Date.new(year, month, @day_of_month)
1093
+ offset = @day_of_week - pivot.wday
1094
+ offset = -offset if @operator == :less_equal
1095
+ offset = offset + 7 if offset < 0
1096
+ offset = -offset if @operator == :less_equal
1097
+ result = pivot + offset
1098
+ if result.month != pivot.month
1099
+ puts self.inspect
1100
+ puts year
1101
+ puts month
1102
+ end
1103
+ raise 'No suitable date found' if result.month != pivot.month
1104
+ result.day
1105
+ else #absolute
1106
+ @day_of_month
1107
+ end
1108
+ end
1109
+
1110
+ private
1111
+ def parse_day_of_week(day_of_week)
1112
+ lower = day_of_week.downcase
1113
+ if lower =~ /^mon/
1114
+ 1
1115
+ elsif lower =~ /^tue/
1116
+ 2
1117
+ elsif lower =~ /^wed/
1118
+ 3
1119
+ elsif lower =~ /^thu/
1120
+ 4
1121
+ elsif lower =~ /^fri/
1122
+ 5
1123
+ elsif lower =~ /^sat/
1124
+ 6
1125
+ elsif lower =~ /^sun/
1126
+ 0
1127
+ else
1128
+ raise "Invalid day of week: #{day_of_week}"
1129
+ end
1130
+ end
1131
+
1132
+ def parse_operator(operator)
1133
+ if operator == '>='
1134
+ :greater_equal
1135
+ elsif operator == '<='
1136
+ :less_equal
1137
+ else
1138
+ raise "Invalid operator: #{operator}"
1139
+ end
1140
+ end
1141
+ end
1142
+
1143
+ # A tz data Zone until reference.
1144
+ class TZDataUntil #:nodoc:
1145
+ include TZDataParserUtils
1146
+
1147
+ attr_reader :year
1148
+ attr_reader :month
1149
+ attr_reader :day
1150
+ attr_reader :time
1151
+
1152
+ def initialize(spec)
1153
+ parts = spec.split(/\s+/)
1154
+ raise "Invalid until: #{spec}" if parts.length < 1
1155
+
1156
+ @year = parts[0].to_i
1157
+ @month = parts.length > 1 ? parse_month(parts[1]) : 1
1158
+ @day = TZDataDayOfMonth.new(parts.length > 2 ? parts[2] : '1')
1159
+ @time = TZDataTime.new(parts.length > 3 ? parts[3] : '00:00')
1160
+ end
1161
+
1162
+ # Converts the reference to a UTC DateTime.
1163
+ def to_utc(utc_offset, std_offset)
1164
+ @time.to_utc(utc_offset, std_offset, @year, @month, @day.to_absolute(@year, @month))
1165
+ end
1166
+ end
1167
+
1168
+ # A tz data Zone format string. Either alternate standard/daylight-savings,
1169
+ # substitution (%s) format or a fixed string.
1170
+ class TZDataFormat #:nodoc:
1171
+ def initialize(spec)
1172
+ if spec =~ /([A-z]+)\/([A-z]+)/
1173
+ @type = :alternate
1174
+ @standard_abbrev = $1
1175
+ @daylight_abbrev = $2
1176
+ elsif spec =~ /%s/
1177
+ @type = :subst
1178
+ @abbrev = spec
1179
+ else
1180
+ @type = :fixed
1181
+ @abbrev = spec
1182
+ end
1183
+ end
1184
+
1185
+ # Expands given the current daylight savings offset and Rule string.
1186
+ def expand(std_offset, rule_string)
1187
+ if @type == :alternate
1188
+ if std_offset == 0
1189
+ @standard_abbrev
1190
+ else
1191
+ @daylight_abbrev
1192
+ end
1193
+ elsif @type == :subst
1194
+ sprintf(@abbrev, rule_string)
1195
+ else
1196
+ @abbrev
1197
+ end
1198
+ end
1199
+
1200
+ # True if a string from the rule is required to expand this format.
1201
+ def requires_rule_string?
1202
+ @type == :subst
1203
+ end
1204
+
1205
+ # Is a fixed format string.
1206
+ def fixed?
1207
+ @type == :fixed
1208
+ end
1209
+ end
1210
+
1211
+ # A location (latitude + longitude)
1212
+ class TZDataLocation #:nodoc:
1213
+ attr_reader :latitude
1214
+ attr_reader :longitude
1215
+
1216
+ # Constructs a new TZDataLocation from a string in ISO 6709
1217
+ # sign-degrees-minutes-seconds format, either +-DDMM+-DDDMM
1218
+ # or +-DDMMSS+-DDDMMSS, first latitude (+ is north),
1219
+ # then longitude (+ is east).
1220
+ def initialize(coordinates)
1221
+ if coordinates !~ /^([+\-])([0-9]{2})([0-9]{2})([0-9]{2})?([+\-])([0-9]{3})([0-9]{2})([0-9]{2})?$/
1222
+ raise "Invalid coordinates: #{coordinates}"
1223
+ end
1224
+
1225
+ @latitude = Rational($2.to_i) + Rational($3.to_i, 60)
1226
+ @latitude += Rational($4.to_i, 3600) unless $4.nil?
1227
+ @latitude = -@latitude if $1 == '-'
1228
+
1229
+ @longitude = Rational($6.to_i) + Rational($7.to_i, 60)
1230
+ @longitude += Rational($8.to_i, 3600) unless $8.nil?
1231
+ @longitude = -@longitude if $5 == '-'
1232
+ end
1233
+ end
1234
+
1235
+ TZDataCountryTimezone = Struct.new(:timezone, :description, :location) #:nodoc:
1236
+
1237
+ # An ISO 3166 country.
1238
+ class TZDataCountry #:nodoc:
1239
+ include TZDataParserUtils
1240
+
1241
+ attr_reader :code
1242
+ attr_reader :name
1243
+ attr_reader :zones
1244
+
1245
+ def initialize(code, name)
1246
+ @code = code
1247
+ @name = name
1248
+ @zones = []
1249
+ end
1250
+
1251
+ # Adds a TZDataCountryTimezone
1252
+ def add_zone(zone)
1253
+ @zones << zone
1254
+ end
1255
+
1256
+ def write_index_record(file)
1257
+ s = " country #{quote_str(@code)}, #{quote_str(@name)}"
1258
+ s << ' do |c|' if @zones.length > 0
1259
+
1260
+ file.puts s
1261
+
1262
+ @zones.each do |zone|
1263
+ file.puts " c.timezone #{quote_str(zone.timezone.name)}, #{zone.location.latitude.numerator}, #{zone.location.latitude.denominator}, #{zone.location.longitude.numerator}, #{zone.location.longitude.denominator}#{zone.description.nil? ? '' : ', ' + quote_str(zone.description)}"
1264
+ end
1265
+
1266
+ file.puts ' end' if @zones.length > 0
1267
+ end
1268
+ end
1269
+ end
1270
+ end