tzinfo-data 1.2013.3

Sign up to get free protection for your applications and to get access to all the features.
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