timezone 1.3.4 → 1.3.9

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