nearest_time_zone 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,388 @@
1
+ 1,Europe/Andorra
2
+ 2,Asia/Dubai
3
+ 3,Asia/Kabul
4
+ 4,America/Antigua
5
+ 5,America/Anguilla
6
+ 6,Europe/Tirane
7
+ 7,Asia/Yerevan
8
+ 8,Asia/Baku
9
+ 9,Africa/Luanda
10
+ 10,Antarctica/McMurdo
11
+ 11,America/Argentina/Buenos_Aires
12
+ 12,America/Argentina/Cordoba
13
+ 13,America/Argentina/San_Juan
14
+ 14,America/Argentina/Salta
15
+ 15,America/Argentina/Jujuy
16
+ 16,America/Argentina/Tucuman
17
+ 17,America/Argentina/Rio_Gallegos
18
+ 18,America/Argentina/La_Rioja
19
+ 19,America/Argentina/Ushuaia
20
+ 20,America/Argentina/San_Luis
21
+ 21,America/Argentina/Catamarca
22
+ 22,America/Argentina/Mendoza
23
+ 23,Pacific/Pago_Pago
24
+ 24,Europe/Vienna
25
+ 25,Australia/Perth
26
+ 26,Australia/Adelaide
27
+ 27,Australia/Darwin
28
+ 28,Australia/Brisbane
29
+ 29,Australia/Sydney
30
+ 30,Australia/Hobart
31
+ 31,Australia/Melbourne
32
+ 32,Australia/Broken_Hill
33
+ 33,America/Aruba
34
+ 34,Europe/Mariehamn
35
+ 35,Europe/Sarajevo
36
+ 36,America/Barbados
37
+ 37,Asia/Dhaka
38
+ 38,Europe/Brussels
39
+ 39,Africa/Ouagadougou
40
+ 40,Europe/Sofia
41
+ 41,Asia/Bahrain
42
+ 42,Africa/Bujumbura
43
+ 43,Africa/Porto-Novo
44
+ 44,America/St_Barthelemy
45
+ 45,Atlantic/Bermuda
46
+ 46,Asia/Brunei
47
+ 47,America/La_Paz
48
+ 48,America/Kralendijk
49
+ 49,America/Fortaleza
50
+ 50,America/Recife
51
+ 51,America/Belem
52
+ 52,America/Maceio
53
+ 53,America/Manaus
54
+ 54,America/Bahia
55
+ 55,America/Santarem
56
+ 56,America/Araguaina
57
+ 57,America/Sao_Paulo
58
+ 58,America/Cuiaba
59
+ 59,America/Campo_Grande
60
+ 60,America/Rio_Branco
61
+ 61,America/Eirunepe
62
+ 62,America/Porto_Velho
63
+ 63,America/Boa_Vista
64
+ 64,America/Noronha
65
+ 65,America/Nassau
66
+ 66,Asia/Thimphu
67
+ 67,Africa/Gaborone
68
+ 68,Europe/Minsk
69
+ 69,America/Belize
70
+ 70,America/Vancouver
71
+ 71,America/Montreal
72
+ 72,America/Edmonton
73
+ 73,America/Toronto
74
+ 74,America/Halifax
75
+ 75,America/Winnipeg
76
+ 76,America/Regina
77
+ 77,America/Atikokan
78
+ 78,America/St_Johns
79
+ 79,America/Moncton
80
+ 80,America/Dawson_Creek
81
+ 81,America/Iqaluit
82
+ 82,America/Creston
83
+ 83,America/Yellowknife
84
+ 84,America/Cambridge_Bay
85
+ 85,America/Glace_Bay
86
+ 86,America/Whitehorse
87
+ 87,America/Goose_Bay
88
+ 88,America/Inuvik
89
+ 89,America/Pangnirtung
90
+ 90,America/Rankin_Inlet
91
+ 91,America/Blanc-Sablon
92
+ 92,America/Swift_Current
93
+ 93,America/Thunder_Bay
94
+ 94,Indian/Cocos
95
+ 95,Africa/Lubumbashi
96
+ 96,Africa/Kinshasa
97
+ 97,Africa/Bangui
98
+ 98,Africa/Brazzaville
99
+ 99,Europe/Zurich
100
+ 100,Africa/Abidjan
101
+ 101,Pacific/Rarotonga
102
+ 102,America/Santiago
103
+ 103,Pacific/Easter
104
+ 104,Africa/Douala
105
+ 105,Asia/Chongqing
106
+ 106,Asia/Urumqi
107
+ 107,Asia/Kashgar
108
+ 108,Asia/Shanghai
109
+ 109,Asia/Harbin
110
+ 110,America/Bogota
111
+ 111,America/Costa_Rica
112
+ 112,America/Havana
113
+ 113,Atlantic/Cape_Verde
114
+ 114,America/Curacao
115
+ 115,Indian/Christmas
116
+ 116,Asia/Nicosia
117
+ 117,Europe/Prague
118
+ 118,Europe/Berlin
119
+ 119,Africa/Djibouti
120
+ 120,Europe/Copenhagen
121
+ 121,America/Dominica
122
+ 122,America/Santo_Domingo
123
+ 123,Africa/Algiers
124
+ 124,America/Guayaquil
125
+ 125,Pacific/Galapagos
126
+ 126,Europe/Tallinn
127
+ 127,Africa/Cairo
128
+ 128,Africa/El_Aaiun
129
+ 129,Africa/Asmara
130
+ 130,Europe/Madrid
131
+ 131,Atlantic/Canary
132
+ 132,Europe/Lisbon
133
+ 133,Africa/Ceuta
134
+ 134,Africa/Addis_Ababa
135
+ 135,Europe/Helsinki
136
+ 136,Pacific/Fiji
137
+ 137,Atlantic/Stanley
138
+ 138,Pacific/Chuuk
139
+ 139,Pacific/Kosrae
140
+ 140,Pacific/Pohnpei
141
+ 141,Atlantic/Faroe
142
+ 142,Europe/Paris
143
+ 143,Africa/Libreville
144
+ 144,Europe/London
145
+ 145,Europe/Guernsey
146
+ 146,America/Grenada
147
+ 147,Asia/Tbilisi
148
+ 148,America/Cayenne
149
+ 149,Africa/Accra
150
+ 150,Europe/Gibraltar
151
+ 151,America/Godthab
152
+ 152,Africa/Banjul
153
+ 153,Africa/Conakry
154
+ 154,America/Guadeloupe
155
+ 155,Africa/Malabo
156
+ 156,Europe/Athens
157
+ 157,Atlantic/South_Georgia
158
+ 158,America/Guatemala
159
+ 159,Pacific/Guam
160
+ 160,Africa/Bissau
161
+ 161,America/Guyana
162
+ 162,Asia/Hong_Kong
163
+ 163,America/Tegucigalpa
164
+ 164,Europe/Zagreb
165
+ 165,America/Port-au-Prince
166
+ 166,Europe/Budapest
167
+ 167,Asia/Jakarta
168
+ 168,Asia/Makassar
169
+ 169,Asia/Jayapura
170
+ 170,Asia/Pontianak
171
+ 171,Asia/Dili
172
+ 172,Europe/Dublin
173
+ 173,Asia/Jerusalem
174
+ 174,Europe/Isle_of_Man
175
+ 175,Asia/Kolkata
176
+ 176,Asia/Baghdad
177
+ 177,Asia/Tehran
178
+ 178,Atlantic/Reykjavik
179
+ 179,Europe/Rome
180
+ 180,Europe/Jersey
181
+ 181,America/Jamaica
182
+ 182,Asia/Amman
183
+ 183,Asia/Tokyo
184
+ 184,Africa/Nairobi
185
+ 185,Asia/Bishkek
186
+ 186,Asia/Phnom_Penh
187
+ 187,Pacific/Tarawa
188
+ 188,Pacific/Kiritimati
189
+ 189,Indian/Comoro
190
+ 190,America/St_Kitts
191
+ 191,Asia/Pyongyang
192
+ 192,Asia/Seoul
193
+ 193,Asia/Kuwait
194
+ 194,America/Cayman
195
+ 195,Asia/Oral
196
+ 196,Asia/Aqtau
197
+ 197,Asia/Aqtobe
198
+ 198,Asia/Almaty
199
+ 199,Asia/Qyzylorda
200
+ 200,Asia/Vientiane
201
+ 201,Asia/Beirut
202
+ 202,America/St_Lucia
203
+ 203,Europe/Vaduz
204
+ 204,Asia/Colombo
205
+ 205,Africa/Monrovia
206
+ 206,Africa/Maseru
207
+ 207,Europe/Vilnius
208
+ 208,Europe/Luxembourg
209
+ 209,Europe/Riga
210
+ 210,Africa/Tripoli
211
+ 211,Africa/Casablanca
212
+ 212,Europe/Monaco
213
+ 213,Europe/Chisinau
214
+ 214,Europe/Podgorica
215
+ 215,America/Marigot
216
+ 216,Indian/Antananarivo
217
+ 217,Pacific/Majuro
218
+ 218,Pacific/Kwajalein
219
+ 219,Europe/Skopje
220
+ 220,Africa/Bamako
221
+ 221,Asia/Rangoon
222
+ 222,Asia/Hovd
223
+ 223,Asia/Ulaanbaatar
224
+ 224,Asia/Choibalsan
225
+ 225,Asia/Macau
226
+ 226,Pacific/Saipan
227
+ 227,America/Martinique
228
+ 228,Africa/Nouakchott
229
+ 229,America/Montserrat
230
+ 230,Europe/Malta
231
+ 231,Indian/Mauritius
232
+ 232,Indian/Maldives
233
+ 233,Africa/Blantyre
234
+ 234,America/Monterrey
235
+ 235,America/Mexico_City
236
+ 236,America/Merida
237
+ 237,America/Cancun
238
+ 238,America/Matamoros
239
+ 239,America/Hermosillo
240
+ 240,America/Chihuahua
241
+ 241,America/Mazatlan
242
+ 242,America/Santa_Isabel
243
+ 243,America/Tijuana
244
+ 244,America/Bahia_Banderas
245
+ 245,America/Ojinaga
246
+ 246,Asia/Kuala_Lumpur
247
+ 247,Asia/Kuching
248
+ 248,Africa/Maputo
249
+ 249,Africa/Windhoek
250
+ 250,Pacific/Noumea
251
+ 251,Africa/Niamey
252
+ 252,Pacific/Norfolk
253
+ 253,Africa/Lagos
254
+ 254,America/Managua
255
+ 255,Europe/Amsterdam
256
+ 256,Europe/Oslo
257
+ 257,Asia/Kathmandu
258
+ 258,Pacific/Nauru
259
+ 259,Pacific/Niue
260
+ 260,Pacific/Auckland
261
+ 261,Pacific/Chatham
262
+ 262,Asia/Muscat
263
+ 263,America/Panama
264
+ 264,America/Lima
265
+ 265,Pacific/Marquesas
266
+ 266,Pacific/Gambier
267
+ 267,Pacific/Tahiti
268
+ 268,Pacific/Port_Moresby
269
+ 269,Asia/Manila
270
+ 270,Asia/Karachi
271
+ 271,Europe/Warsaw
272
+ 272,America/Miquelon
273
+ 273,Pacific/Pitcairn
274
+ 274,America/Puerto_Rico
275
+ 275,Asia/Gaza
276
+ 276,Asia/Hebron
277
+ 277,Atlantic/Madeira
278
+ 278,Atlantic/Azores
279
+ 279,Pacific/Palau
280
+ 280,America/Asuncion
281
+ 281,Asia/Qatar
282
+ 282,Indian/Reunion
283
+ 283,Europe/Bucharest
284
+ 284,Europe/Belgrade
285
+ 285,Europe/Moscow
286
+ 286,Asia/Yekaterinburg
287
+ 287,Europe/Volgograd
288
+ 288,Europe/Samara
289
+ 289,Europe/Kaliningrad
290
+ 290,Asia/Novokuznetsk
291
+ 291,Asia/Novosibirsk
292
+ 292,Asia/Krasnoyarsk
293
+ 293,Asia/Omsk
294
+ 294,Asia/Irkutsk
295
+ 295,Asia/Yakutsk
296
+ 296,Asia/Vladivostok
297
+ 297,Asia/Kamchatka
298
+ 298,Asia/Magadan
299
+ 299,Asia/Sakhalin
300
+ 300,Asia/Anadyr
301
+ 301,Africa/Kigali
302
+ 302,Asia/Riyadh
303
+ 303,Pacific/Guadalcanal
304
+ 304,Indian/Mahe
305
+ 305,Africa/Khartoum
306
+ 306,Europe/Stockholm
307
+ 307,Asia/Singapore
308
+ 308,Atlantic/St_Helena
309
+ 309,Europe/Ljubljana
310
+ 310,Arctic/Longyearbyen
311
+ 311,Europe/Bratislava
312
+ 312,Africa/Freetown
313
+ 313,Europe/San_Marino
314
+ 314,Africa/Dakar
315
+ 315,Africa/Mogadishu
316
+ 316,America/Paramaribo
317
+ 317,Africa/Juba
318
+ 318,Africa/Sao_Tome
319
+ 319,America/El_Salvador
320
+ 320,America/Lower_Princes
321
+ 321,Asia/Damascus
322
+ 322,Africa/Mbabane
323
+ 323,America/Grand_Turk
324
+ 324,Africa/Ndjamena
325
+ 325,Indian/Kerguelen
326
+ 326,Africa/Lome
327
+ 327,Asia/Bangkok
328
+ 328,Asia/Dushanbe
329
+ 329,Pacific/Fakaofo
330
+ 330,Asia/Ashgabat
331
+ 331,Africa/Tunis
332
+ 332,Pacific/Tongatapu
333
+ 333,Europe/Istanbul
334
+ 334,America/Port_of_Spain
335
+ 335,Pacific/Funafuti
336
+ 336,Asia/Taipei
337
+ 337,Africa/Dar_es_Salaam
338
+ 338,Europe/Simferopol
339
+ 339,Europe/Kiev
340
+ 340,Europe/Zaporozhye
341
+ 341,Europe/Uzhgorod
342
+ 342,Africa/Kampala
343
+ 343,America/Chicago
344
+ 344,America/New_York
345
+ 345,America/Indiana/Indianapolis
346
+ 346,America/Indiana/Vincennes
347
+ 347,America/Indiana/Tell_City
348
+ 348,America/Kentucky/Louisville
349
+ 349,America/Indiana/Marengo
350
+ 350,America/Indiana/Petersburg
351
+ 351,America/Indiana/Vevay
352
+ 352,America/Kentucky/Monticello
353
+ 353,America/Detroit
354
+ 354,America/Indiana/Knox
355
+ 355,America/Indiana/Winamac
356
+ 356,America/Menominee
357
+ 357,America/Phoenix
358
+ 358,America/Los_Angeles
359
+ 359,America/Denver
360
+ 360,America/Shiprock
361
+ 361,America/Juneau
362
+ 362,America/Sitka
363
+ 363,America/Metlakatla
364
+ 364,America/Boise
365
+ 365,America/North_Dakota/Beulah
366
+ 366,America/North_Dakota/Center
367
+ 367,America/North_Dakota/New_Salem
368
+ 368,Pacific/Honolulu
369
+ 369,America/Anchorage
370
+ 370,America/Adak
371
+ 371,America/Nome
372
+ 372,America/Montevideo
373
+ 373,Asia/Samarkand
374
+ 374,Asia/Tashkent
375
+ 375,Europe/Vatican
376
+ 376,America/St_Vincent
377
+ 377,America/Caracas
378
+ 378,America/Tortola
379
+ 379,America/St_Thomas
380
+ 380,Asia/Ho_Chi_Minh
381
+ 381,Pacific/Efate
382
+ 382,Pacific/Wallis
383
+ 383,Pacific/Apia
384
+ 384,Asia/Aden
385
+ 385,Indian/Mayotte
386
+ 386,Africa/Johannesburg
387
+ 387,Africa/Lusaka
388
+ 388,Africa/Harare
@@ -0,0 +1,16 @@
1
+ require "csv"
2
+ require "kdtree"
3
+ require "andand"
4
+
5
+ require "require_all"
6
+ require_rel "./nearest_time_zone"
7
+
8
+ module NearestTimeZone
9
+
10
+ def self.to(latitude, longitude)
11
+ City.nearest(latitude, longitude).andand.time_zone.name
12
+ end
13
+ end
14
+
15
+ # load the kdtree so that everything is fast
16
+ NearestTimeZone::City.kdtree
@@ -0,0 +1,66 @@
1
+ module NearestTimeZone
2
+ class City
3
+
4
+ attr_accessor :id, :latitude, :longitude, :time_zone_id
5
+
6
+ def initialize(id, latitude, longitude, time_zone_id)
7
+ self.id, self.latitude, self.longitude, self.time_zone_id = id, latitude, longitude, time_zone_id
8
+ end
9
+
10
+ def self.kdtree
11
+ @kdtree ||= build_kdtree
12
+ end
13
+
14
+ def id=(value)
15
+ @id = value.to_i
16
+ end
17
+
18
+ def latitude=(value)
19
+ @latitude = value.to_f
20
+ end
21
+
22
+ def longitude=(value)
23
+ @longitude = value.to_f
24
+ end
25
+
26
+ def self.all
27
+ @all ||= load_all
28
+ end
29
+
30
+ def self.find(id)
31
+ all[id.to_i]
32
+ end
33
+
34
+ def self.nearest(latitude, longitude)
35
+ all[kdtree.nearest(latitude, longitude)]
36
+ end
37
+
38
+ def time_zone
39
+ TimeZone.find(time_zone_id)
40
+ end
41
+
42
+ private
43
+
44
+ def self.load_all
45
+ begin
46
+ Marshal.load(File.read(File.expand_path("../../../data/cities.dump", __FILE__)))
47
+ rescue
48
+ cities = CSV.open(File.expand_path("../../../data/cities.txt", __FILE__))
49
+ Hash[
50
+ cities.collect do |city|
51
+ [city[0].to_i, NearestTimeZone::City.new(*(0..3).collect { |n| city[n] })]
52
+ end
53
+ ]
54
+ end
55
+ end
56
+
57
+ def self.build_kdtree
58
+ begin
59
+ File.open(File.expand_path("../../../data/kdtree.dump", __FILE__)) { |f| Kdtree.new(f) }
60
+ rescue
61
+ Kdtree.new all.collect { |id, city| [city.latitude, city.longitude, city.id] }
62
+ end
63
+ end
64
+
65
+ end
66
+ end