timezone 1.3.4 → 1.3.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -0
  3. data/CHANGES.markdown +23 -0
  4. data/CONTRIBUTING.markdown +10 -6
  5. data/Rakefile +3 -1
  6. data/benchmark.rb +16 -29
  7. data/data/Africa/Algiers +2 -2
  8. data/data/Africa/Casablanca +12 -10
  9. data/data/Africa/El_Aaiun +12 -10
  10. data/data/America/Campo_Grande +1 -40
  11. data/data/America/Cuiaba +1 -40
  12. data/data/America/Dawson +2 -38
  13. data/data/America/Detroit +5 -1
  14. data/data/America/Edmonton +1 -5
  15. data/data/America/Indiana/Tell_City +9 -12
  16. data/data/America/Kentucky/Louisville +4 -4
  17. data/data/America/Louisville +4 -4
  18. data/data/America/Nuuk +120 -0
  19. data/data/America/Sao_Paulo +1 -40
  20. data/data/America/Vancouver +2 -2
  21. data/data/America/Whitehorse +2 -38
  22. data/data/Antarctica/Casey +6 -1
  23. data/data/Antarctica/Macquarie +56 -1
  24. data/data/Asia/Chongqing +3 -1
  25. data/data/Asia/Chungking +3 -1
  26. data/data/Asia/Gaza +40 -40
  27. data/data/Asia/Harbin +3 -1
  28. data/data/Asia/Hebron +40 -40
  29. data/data/Asia/Hong_Kong +19 -19
  30. data/data/Asia/Istanbul +22 -36
  31. data/data/Asia/Seoul +9 -1
  32. data/data/Asia/Shanghai +3 -1
  33. data/data/Brazil/East +1 -40
  34. data/data/Canada/Mountain +1 -5
  35. data/data/Canada/Pacific +2 -2
  36. data/data/Canada/Yukon +2 -38
  37. data/data/Europe/Brussels +2 -2
  38. data/data/Europe/Budapest +24 -24
  39. data/data/Europe/Istanbul +22 -36
  40. data/data/Europe/Kaliningrad +6 -5
  41. data/data/Europe/Monaco +3 -3
  42. data/data/Europe/Paris +3 -3
  43. data/data/Europe/Rome +2 -2
  44. data/data/Europe/San_Marino +2 -2
  45. data/data/Europe/Vatican +2 -2
  46. data/data/Europe/Vienna +2 -2
  47. data/data/Hongkong +19 -19
  48. data/data/PRC +3 -1
  49. data/data/Pacific/Fiji +32 -32
  50. data/data/Pacific/Norfolk +42 -3
  51. data/data/ROK +9 -1
  52. data/data/Turkey +22 -36
  53. data/data/US/Michigan +5 -1
  54. data/lib/timezone/loader.rb +6 -3
  55. data/lib/timezone/parser.rb +28 -14
  56. data/lib/timezone/version.rb +1 -1
  57. data/lib/timezone/zone.rb +17 -16
  58. data/timezone.gemspec +0 -2
  59. metadata +8 -8
  60. data/data/US/Pacific-New +0 -189
@@ -1,6 +1,6 @@
1
- -2486680173:LMT:0:1772
2
- 630721211:PMT:0:561
3
- 166144161:WET:0:0
1
+ -2448318573:LMT:0:1772
2
+ 593914811:PMT:0:561
3
+ 164588961:WET:0:0
4
4
  9417600:WEST:1:3600
5
5
  15033600:WET:0:0
6
6
  17020800:WEST:1:3600
@@ -1,6 +1,6 @@
1
- -2486678902:LMT:0:561
2
- 630720000:PMT:0:561
3
- 166144101:WET:0:0
1
+ -2486592562:LMT:0:561
2
+ 630633600:PMT:0:561
3
+ 166144161:WET:0:0
4
4
  9417600:WEST:1:3600
5
5
  15033600:WET:0:0
6
6
  17020800:WEST:1:3600
@@ -1,5 +1,5 @@
1
- -3259097397:LMT:0:2996
2
- 855532196:RMT:0:2996
1
+ -3252098997:LMT:0:2996
2
+ 848533796:RMT:0:2996
3
3
  712800000:CET:0:3600
4
4
  10278000:CEST:1:7200
5
5
  15728400:CET:0:3600
@@ -1,5 +1,5 @@
1
- -3259097397:LMT:0:2996
2
- 855532196:RMT:0:2996
1
+ -3252098997:LMT:0:2996
2
+ 848533796:RMT:0:2996
3
3
  712800000:CET:0:3600
4
4
  10278000:CEST:1:7200
5
5
  15728400:CET:0:3600
@@ -1,5 +1,5 @@
1
- -3259097397:LMT:0:2996
2
- 855532196:RMT:0:2996
1
+ -3252098997:LMT:0:2996
2
+ 848533796:RMT:0:2996
3
3
  712800000:CET:0:3600
4
4
  10278000:CEST:1:7200
5
5
  15728400:CET:0:3600
@@ -16,8 +16,8 @@
16
16
  15724800:CET:0:3600
17
17
  864000:CEST:1:7200
18
18
  31708800:CET:0:3600
19
- 15120000:CEST:1:7200
20
- 15724800:CET:0:3600
19
+ 15206400:CEST:1:7200
20
+ 15638400:CET:0:3600
21
21
  15724800:CEST:1:7200
22
22
  16934400:CET:0:3600
23
23
  14515200:CEST:1:7200
@@ -1,23 +1,23 @@
1
1
  -2056690801:LMT:0:27402
2
- 1155781800:HKT:0:28800
3
- 9329400:HKST:1:32400
4
- 7331400:HKT:0:30600
5
- 117588600:JST:0:32400
6
- 18678600:HKT:0:28800
7
- 19436400:HKST:1:32400
8
- 11494800:HKT:0:28800
9
- 22546800:HKST:1:32400
10
- 10717200:HKT:0:28800
11
- 15721200:HKST:1:32400
12
- 13309200:HKT:0:28800
13
- 18140400:HKST:1:32400
14
- 13309200:HKT:0:28800
15
- 18140400:HKST:1:32400
16
- 13309200:HKT:0:28800
17
- 18140400:HKST:1:32400
18
- 13914000:HKT:0:28800
19
- 18140400:HKST:1:32400
20
- 13309200:HKT:0:28800
2
+ 1155780000:HKT:0:28800
3
+ 9331200:HKST:1:32400
4
+ 7331400:HKWT:1:30600
5
+ 123039000:JST:0:32400
6
+ 13302000:HKT:0:28800
7
+ 19366200:HKST:1:32400
8
+ 11491200:HKT:0:28800
9
+ 19958400:HKST:1:32400
10
+ 13305600:HKT:0:28800
11
+ 15724800:HKST:1:32400
12
+ 13305600:HKT:0:28800
13
+ 18144000:HKST:1:32400
14
+ 13305600:HKT:0:28800
15
+ 18144000:HKST:1:32400
16
+ 13305600:HKT:0:28800
17
+ 18144000:HKST:1:32400
18
+ 13910400:HKT:0:28800
19
+ 18144000:HKST:1:32400
20
+ 13305600:HKT:0:28800
21
21
  18140400:HKST:1:32400
22
22
  12099600:HKT:0:28800
23
23
  19350000:HKST:1:32400
data/data/PRC CHANGED
@@ -1,5 +1,7 @@
1
1
  -2177481944:LMT:0:29143
2
- 1243814743:CST:0:28800
2
+ 576806743:CST:0:28800
3
+ 14770800:CDT:1:32400
4
+ 652237200:CST:0:28800
3
5
  11574000:CDT:1:32400
4
6
  13222800:CST:0:28800
5
7
  20041200:CDT:1:32400
@@ -23,43 +23,43 @@
23
23
  6048000:+13:1:46800
24
24
  25401600:+12:0:43200
25
25
  6048000:+13:1:46800
26
- 25401600:+12:0:43200
27
- 6652800:+13:1:46800
28
- 24796800:+12:0:43200
29
- 6652800:+13:1:46800
30
- 25401600:+12:0:43200
31
- 6048000:+13:1:46800
32
- 25401600:+12:0:43200
33
- 6048000:+13:1:46800
34
- 25401600:+12:0:43200
35
- 6048000:+13:1:46800
36
- 25401600:+12:0:43200
37
- 6652800:+13:1:46800
38
- 24796800:+12:0:43200
39
- 6652800:+13:1:46800
40
- 24796800:+12:0:43200
41
- 6652800:+13:1:46800
42
- 25401600:+12:0:43200
43
- 6048000:+13:1:46800
44
- 25401600:+12:0:43200
45
- 6048000:+13:1:46800
46
- 25401600:+12:0:43200
26
+ 26006400:+12:0:43200
27
+ 5443200:+13:1:46800
28
+ 29635200:+12:0:43200
29
+ 2419200:+13:1:46800
30
+ 26006400:+12:0:43200
31
+ 5443200:+13:1:46800
32
+ 26006400:+12:0:43200
33
+ 5443200:+13:1:46800
34
+ 26006400:+12:0:43200
35
+ 5443200:+13:1:46800
36
+ 26006400:+12:0:43200
37
+ 5443200:+13:1:46800
38
+ 26006400:+12:0:43200
47
39
  6048000:+13:1:46800
48
40
  25401600:+12:0:43200
49
- 6652800:+13:1:46800
50
- 24796800:+12:0:43200
51
- 6652800:+13:1:46800
52
- 25401600:+12:0:43200
53
41
  6048000:+13:1:46800
54
- 25401600:+12:0:43200
42
+ 26006400:+12:0:43200
43
+ 5443200:+13:1:46800
44
+ 26006400:+12:0:43200
45
+ 5443200:+13:1:46800
46
+ 26006400:+12:0:43200
47
+ 5443200:+13:1:46800
48
+ 26006400:+12:0:43200
49
+ 5443200:+13:1:46800
50
+ 26006400:+12:0:43200
55
51
  6048000:+13:1:46800
56
- 25401600:+12:0:43200
52
+ 26006400:+12:0:43200
53
+ 5443200:+13:1:46800
54
+ 26006400:+12:0:43200
55
+ 5443200:+13:1:46800
56
+ 26006400:+12:0:43200
57
+ 5443200:+13:1:46800
58
+ 26006400:+12:0:43200
59
+ 5443200:+13:1:46800
60
+ 26006400:+12:0:43200
57
61
  6048000:+13:1:46800
58
62
  25401600:+12:0:43200
59
63
  6048000:+13:1:46800
60
- 25401600:+12:0:43200
61
- 6652800:+13:1:46800
62
- 24796800:+12:0:43200
63
- 6652800:+13:1:46800
64
- 25401600:+12:0:43200
64
+ 26006400:+12:0:43200
65
65
  1:+13:1:46800
@@ -1,6 +1,45 @@
1
1
  -2177493113:LMT:0:40312
2
2
  1577836792:+1112:0:40320
3
3
  751686120:+1130:0:41400
4
- 10882800:+1230:1:45000
5
- 1280970000:+1130:0:41400
6
- 1:+11:0:39600
4
+ 10886400:+1230:1:45000
5
+ 1280966400:+1130:0:41400
6
+ 126405000:+11:0:39600
7
+ 15724800:+12:1:43200
8
+ 15724800:+11:0:39600
9
+ 15724800:+12:1:43200
10
+ 15724800:+11:0:39600
11
+ 15724800:+12:1:43200
12
+ 15724800:+11:0:39600
13
+ 15724800:+12:1:43200
14
+ 15724800:+11:0:39600
15
+ 16329600:+12:1:43200
16
+ 15724800:+11:0:39600
17
+ 15724800:+12:1:43200
18
+ 15724800:+11:0:39600
19
+ 15724800:+12:1:43200
20
+ 15724800:+11:0:39600
21
+ 15724800:+12:1:43200
22
+ 15724800:+11:0:39600
23
+ 15724800:+12:1:43200
24
+ 15724800:+11:0:39600
25
+ 15724800:+12:1:43200
26
+ 16329600:+11:0:39600
27
+ 15724800:+12:1:43200
28
+ 15724800:+11:0:39600
29
+ 15724800:+12:1:43200
30
+ 15724800:+11:0:39600
31
+ 15724800:+12:1:43200
32
+ 15724800:+11:0:39600
33
+ 15724800:+12:1:43200
34
+ 15724800:+11:0:39600
35
+ 15724800:+12:1:43200
36
+ 15724800:+11:0:39600
37
+ 15724800:+12:1:43200
38
+ 16329600:+11:0:39600
39
+ 15724800:+12:1:43200
40
+ 15724800:+11:0:39600
41
+ 15724800:+12:1:43200
42
+ 15724800:+11:0:39600
43
+ 15724800:+12:1:43200
44
+ 15724800:+11:0:39600
45
+ 1:+12:1:43200
data/data/ROK CHANGED
@@ -1,7 +1,15 @@
1
1
  -1948782473:LMT:0:30472
2
2
  118367872:KST:0:30600
3
3
  1063063800:JST:0:32400
4
- 269222400:KST:0:32400
4
+ 86140800:KST:0:32400
5
+ 8982000:KDT:1:36000
6
+ 17456400:KST:0:32400
7
+ 13906800:KDT:1:36000
8
+ 17456400:KST:0:32400
9
+ 13993200:KDT:1:36000
10
+ 20566800:KST:0:32400
11
+ 10882800:KDT:1:36000
12
+ 79837200:KST:0:32400
5
13
  35425800:KST:0:30600
6
14
  10969200:KDT:1:34200
7
15
  21949200:KST:0:30600
@@ -12,14 +12,12 @@
12
12
  12178800:EEST:1:10800
13
13
  18320400:EET:0:7200
14
14
  13215600:EEST:1:10800
15
- 465354000:EET:0:7200
15
+ 465440400:EET:0:7200
16
16
  8377200:EEST:1:10800
17
- 4928400:EET:0:7200
17
+ 4842000:EET:0:7200
18
18
  25398000:EEST:1:10800
19
19
  16592400:EET:0:7200
20
- 18486000:EEST:1:10800
21
- 76294800:EET:0:7200
22
- 16326000:EEST:1:10800
20
+ 111106800:EEST:1:10800
23
21
  20394000:EET:0:7200
24
22
  10537200:EEST:1:10800
25
23
  17370000:EET:0:7200
@@ -28,44 +26,32 @@
28
26
  14511600:EEST:1:10800
29
27
  16333200:EET:0:7200
30
28
  15116400:EEST:1:10800
31
- 17197200:EET:0:7200
32
- 14857200:EEST:1:10800
33
29
  16938000:EET:0:7200
34
- 14598000:EEST:1:10800
35
- 339814800:EET:0:7200
36
- 7340400:EEST:1:10800
37
- 50547600:EET:0:7200
30
+ 15116400:EEST:1:10800
31
+ 16938000:EET:0:7200
32
+ 14511600:EEST:1:10800
33
+ 339901200:EET:0:7200
34
+ 40777200:EEST:1:10800
35
+ 17110800:EET:0:7200
38
36
  12006000:EEST:1:10800
39
- 176259600:EET:0:7200
40
- 13302000:EEST:1:10800
41
- 18147600:EET:0:7200
42
- 13302000:EEST:1:10800
43
- 18752400:EET:0:7200
44
- 13302000:EEST:1:10800
45
- 20570400:EET:0:7200
46
- 13309200:EEST:1:10800
47
- 12700800:EET:0:7200
48
- 18756000:EEST:1:10800
49
- 12686400:EET:0:7200
50
- 18140400:EEST:1:10800
51
- 18925200:EET:0:7200
52
- 13129200:EEST:1:10800
37
+ 273636000:EET:0:7200
38
+ 13305600:EEST:1:10800
39
+ 12704400:EET:0:7200
40
+ 18745200:EEST:1:10800
41
+ 12013200:EET:0:7200
42
+ 19436400:EEST:1:10800
43
+ 12099600:EET:0:7200
44
+ 19350000:EEST:1:10800
53
45
  13309200:EET:0:7200
54
46
  16930800:EEST:1:10800
55
47
  14518800:EET:0:7200
56
- 16930800:EEST:1:10800
57
- 31532400:+04:1:14400
58
- 15048000:+03:0:10800
59
- 16401600:+04:1:14400
60
- 14443200:+03:0:10800
61
- 17006400:+04:1:14400
62
- 14443200:+03:0:10800
63
- 17006400:+04:1:14400
64
- 25318800:+03:0:10800
48
+ 7592400:EEST:1:10800
49
+ 160538400:+03:0:10800
65
50
  5439600:+04:1:14400
66
- 48906000:+03:0:10800
51
+ 34218000:+03:0:10800
52
+ 14688000:EET:0:7200
67
53
  13910400:EEST:1:10800
68
- 15818400:EET:0:7200
54
+ 15811200:EET:0:7200
69
55
  15724800:EEST:1:10800
70
56
  15724800:EET:0:7200
71
57
  15724800:EEST:1:10800
@@ -5,7 +5,11 @@
5
5
  3999600:EPT:1:-14400
6
6
  81046800:EST:0:-18000
7
7
  13302000:EDT:1:-14400
8
- 775962000:EST:0:-18000
8
+ 590540460:EST:0:-18000
9
+ 11840340:EDT:1:-14400
10
+ 15728400:EST:0:-18000
11
+ 15721200:EDT:1:-14400
12
+ 142131600:EST:0:-18000
9
13
  15721200:EDT:1:-14400
10
14
  6051600:EST:0:-18000
11
15
  25398000:EDT:1:-14400
@@ -8,12 +8,15 @@ module Timezone # rubocop:disable Style/Documentation
8
8
  ZONE_FILE_PATH = File.expand_path(File.dirname(__FILE__) + '/../../data')
9
9
  SOURCE_BIT = 0
10
10
 
11
+ @rules = {} # cache of loaded rules
12
+
11
13
  class << self
12
14
  def load(name)
13
- raise ::Timezone::Error::InvalidZone unless valid?(name)
15
+ @rules.fetch(name) do
16
+ raise ::Timezone::Error::InvalidZone unless valid?(name)
14
17
 
15
- @rules ||= {}
16
- @rules[name] ||= parse_zone_data(get_zone_data(name))
18
+ @rules[name] = parse_zone_data(get_zone_data(name))
19
+ end
17
20
  end
18
21
 
19
22
  def names
@@ -11,28 +11,42 @@ module Timezone
11
11
 
12
12
  LINE = /\s*(.+)\s*=\s*(.+)\s*isdst=(\d+)\s*gmtoff=([\+\-]*\d+)/
13
13
 
14
- ZONEINFO_DIR = '/usr/share/zoneinfo'.freeze
14
+ # Bookkeeping files that we do not want to parse.
15
+ IGNORE = ['leapseconds', 'posixrules', 'tzdata.zi'].freeze
15
16
 
16
- attr_reader :zoneinfo
17
-
18
- def initialize(zoneinfo = ZONEINFO_DIR)
19
- @zoneinfo = zoneinfo
17
+ def initialize(root)
18
+ @config = Config.new(root)
20
19
  end
21
20
 
22
21
  def perform
23
22
  FileUtils.rm_rf('data')
24
23
 
25
- Dir["#{zoneinfo}/posix/**/*"].each do |file|
24
+ Dir["#{@config.zoneinfo}/**/*"].each do |file|
26
25
  next if File.directory?(file)
26
+ next if file.end_with?('.tab')
27
+ next if IGNORE.include?(File.basename(file))
27
28
  parse(file)
28
29
  end
29
30
  end
30
31
 
32
+ # Represents a timezone database config.
33
+ class Config
34
+ def initialize(root)
35
+ @root = root
36
+ @zoneinfo = File.join(@root, 'usr/share/zoneinfo')
37
+ @zdump = File.join(@root, 'usr/bin/zdump')
38
+ end
39
+
40
+ attr_reader :root, :zoneinfo, :zdump
41
+ end
42
+
43
+ private_constant :Config
44
+
31
45
  # Represents a single timezone data file line for a reference timezone.
32
46
  class RefLine
33
- def initialize(zone)
47
+ def initialize(config, file)
34
48
  first =
35
- `zdump -i posix/#{zone}`
49
+ `#{config.zdump} -i #{file}`
36
50
  .split("\n")
37
51
  .reject(&:empty?)
38
52
  .reject { |line| line.start_with?('TZ=') }
@@ -85,15 +99,15 @@ module Timezone
85
99
  private
86
100
 
87
101
  def parse(file)
88
- zone = file.gsub("#{zoneinfo}/posix/", '')
102
+ zone = file.gsub("#{@config.zoneinfo}/", '')
89
103
  print "Parsing #{zone}... "
90
- data = zdump(zone)
104
+ data = zdump(file)
91
105
 
92
106
  last = 0
93
107
  result = []
94
108
 
95
109
  data.split("\n").each do |line|
96
- match = line.gsub('posix/' + zone + ' ', '').match(LINE)
110
+ match = line.gsub(/^#{file}\s+/, '').match(LINE)
97
111
  next if match.nil?
98
112
 
99
113
  line = Line.new(match)
@@ -112,14 +126,14 @@ module Timezone
112
126
  result << line
113
127
  end
114
128
 
115
- result << RefLine.new(zone) if result.empty?
129
+ result << RefLine.new(@config, file) if result.empty?
116
130
 
117
131
  write(zone, result)
118
132
  puts 'DONE'
119
133
  end
120
134
 
121
- def zdump(zone)
122
- `zdump -v -c #{MIN_YEAR},#{MAX_YEAR} posix/#{zone}`
135
+ def zdump(file)
136
+ `#{@config.zdump} -v -c #{MIN_YEAR},#{MAX_YEAR} #{file}`
123
137
  end
124
138
 
125
139
  def write(zone, data)