nearest_time_zone_jruby 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +18 -0
- data/.rspec +2 -0
- data/Gemfile +4 -0
- data/Guardfile +6 -0
- data/LICENSE.txt +22 -0
- data/README.md +44 -0
- data/Rakefile +19 -0
- data/data/cities.txt +134119 -0
- data/data/time_zones.txt +388 -0
- data/lib/nearest_time_zone.rb +16 -0
- data/lib/nearest_time_zone/city.rb +69 -0
- data/lib/nearest_time_zone/time_zone.rb +38 -0
- data/lib/nearest_time_zone/version.rb +3 -0
- data/nearest_time_zone.gemspec +34 -0
- data/spec/city_spec.rb +46 -0
- data/spec/nearest_time_zone_spec.rb +13 -0
- data/spec/spec_helper.rb +11 -0
- data/spec/time_zone_spec.rb +20 -0
- metadata +223 -0
data/data/time_zones.txt
ADDED
@@ -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 "geokdtree"
|
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,69 @@
|
|
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
|
+
result = kdtree.nearest([latitude, longitude])
|
36
|
+
all[result.data] if result
|
37
|
+
end
|
38
|
+
|
39
|
+
def time_zone
|
40
|
+
TimeZone.find(time_zone_id)
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def self.load_all
|
46
|
+
begin
|
47
|
+
Marshal.load(File.read(File.expand_path("../../../data/cities.dump", __FILE__)))
|
48
|
+
rescue
|
49
|
+
cities = CSV.open(File.expand_path("../../../data/cities.txt", __FILE__))
|
50
|
+
Hash[
|
51
|
+
cities.collect do |city|
|
52
|
+
[city[0].to_i, NearestTimeZone::City.new(*(0..3).collect { |n| city[n] })]
|
53
|
+
end
|
54
|
+
]
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.build_kdtree
|
59
|
+
begin
|
60
|
+
Marshal.load(File.read(File.expand_path("../../../data/cities.dump", __FILE__)))
|
61
|
+
rescue
|
62
|
+
Geokdtree::Tree.new(2).tap do |tree|
|
63
|
+
all.each { |_, city| tree.insert [city.latitude, city.longitude], city.id }
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
end
|