ruby-sun-times 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. data/lib/sun_times.rb +31 -10
  2. data/test/calculate_test.rb +27 -6
  3. metadata +2 -2
@@ -30,13 +30,14 @@ module SunTimes
30
30
  module VERSION #:nodoc:
31
31
  MAJOR = 0
32
32
  MINOR = 1
33
- TINY = 1
34
-
33
+ TINY = 2
34
+
35
35
  STRING = [MAJOR, MINOR, TINY].join('.')
36
36
  end
37
-
37
+
38
38
  DEFAULT_ZENITH = 90.83333
39
39
  KNOWN_EVENTS = [:rise, :set]
40
+ DEGREES_PER_HOUR = 360.0 / 24.0
40
41
 
41
42
  # Helper method: calculates sunrise, with the same parameters as calculate
42
43
  def SunTimes.rise(date, latitude, longitude, options = {})
@@ -65,7 +66,7 @@ module SunTimes
65
66
  zenith = options.delete(:zenith) || DEFAULT_ZENITH
66
67
 
67
68
  # lngHour
68
- longitude_hour = longitude / 15.0
69
+ longitude_hour = longitude / DEGREES_PER_HOUR
69
70
 
70
71
  # t
71
72
  base_time = event == :rise ? 6.0 : 18.0
@@ -85,21 +86,21 @@ module SunTimes
85
86
  tan_right_ascension = 0.91764 * Math.tan(degrees_to_radians(sun_true_longitude))
86
87
  sun_right_ascension = radians_to_degrees(Math.atan(tan_right_ascension))
87
88
  sun_right_ascension = coerce_degrees(sun_right_ascension)
88
-
89
+
89
90
  # right ascension value needs to be in the same quadrant as L
90
91
  sun_true_longitude_quadrant = (sun_true_longitude / 90.0).floor * 90.0
91
92
  sun_right_ascension_quadrant = (sun_right_ascension / 90.0).floor * 90.0
92
93
  sun_right_ascension += (sun_true_longitude_quadrant - sun_right_ascension_quadrant)
93
94
 
94
95
  # RA = RA / 15
95
- sun_right_ascension_hours = sun_right_ascension / 15.0
96
+ sun_right_ascension_hours = sun_right_ascension / DEGREES_PER_HOUR
96
97
 
97
98
  sin_declination = 0.39782 * Math.sin(degrees_to_radians(sun_true_longitude))
98
99
  cos_declination = Math.cos(Math.asin(sin_declination))
99
100
 
100
101
  cos_local_hour_angle =
101
102
  (Math.cos(degrees_to_radians(zenith)) - (sin_declination * Math.sin(degrees_to_radians(latitude)))) /
102
- (cos_declination * Math.cos(degrees_to_radians(latitude)))
103
+ (cos_declination * Math.cos(degrees_to_radians(latitude)))
103
104
 
104
105
  # the sun never rises on this location (on the specified date)
105
106
  return nil if cos_local_hour_angle > 1
@@ -112,10 +113,10 @@ module SunTimes
112
113
  360 - radians_to_degrees(Math.acos(cos_local_hour_angle))
113
114
  else
114
115
  radians_to_degrees(Math.acos(cos_local_hour_angle))
115
- end
116
+ end
116
117
 
117
118
  # H = H / 15
118
- suns_local_hour_hours = suns_local_hour / 15.0
119
+ suns_local_hour_hours = suns_local_hour / DEGREES_PER_HOUR
119
120
 
120
121
  # T = H + RA - (0.06571 * t) - 6.622
121
122
  local_mean_time = suns_local_hour_hours + sun_right_ascension_hours - (0.06571 * approximate_time) - 6.622
@@ -125,6 +126,26 @@ module SunTimes
125
126
  gmt_hours -= 24.0 if gmt_hours > 24
126
127
  gmt_hours += 24.0 if gmt_hours < 0
127
128
 
129
+ case
130
+ when date.respond_to?( :offset )
131
+ offset_hours = date.offset * 24
132
+ when date.respond_to?( :gmt_offset )
133
+ offset_hours = date.gmt_offset / 3600
134
+ else
135
+ offset_hours = nil
136
+ end
137
+
138
+ if ! offset_hours.nil?
139
+ if gmt_hours + offset_hours < 0
140
+ next_day = Date.new(date.year, date.month, date.day + 1)
141
+ return calculate(event, next_day, latitude, longitude, options = {})
142
+ end
143
+ if gmt_hours + offset_hours > 24
144
+ previous_day = Date.new(date.year, date.month, date.day + 1)
145
+ return calculate(event, previous_day, latitude, longitude, options = {})
146
+ end
147
+ end
148
+
128
149
  hour = gmt_hours.floor
129
150
  hour_remainder = (gmt_hours.to_f - hour.to_f) * 60.0
130
151
  minute = hour_remainder.floor
@@ -138,7 +159,7 @@ module SunTimes
138
159
  def SunTimes.degrees_to_radians(d)
139
160
  d.to_f / 360.0 * 2.0 * Math::PI
140
161
  end
141
-
162
+
142
163
  def SunTimes.radians_to_degrees(r)
143
164
  r.to_f * 360.0 / (2.0 * Math::PI)
144
165
  end
@@ -2,27 +2,28 @@
2
2
  $:.unshift(File.dirname(__FILE__) + '/../lib')
3
3
  require 'test/unit'
4
4
  require 'sun_times'
5
+ require 'date'
5
6
 
6
7
  class SunTimesTest < Test::Unit::TestCase
7
8
 
8
9
  def test_rise_20100308_pontassieve
9
10
  rise = SunTimes.calculate(:rise, Date.new(2010, 3, 8), 43.779, 11.432)
10
- assert_equal(rise.to_i, 1268026793)
11
+ assert_equal(Time.gm(2010, 3, 8, 5, 39, 53), rise)
11
12
  end
12
13
 
13
14
  def test_set_20100308_pontassieve
14
- rise = SunTimes.calculate(:set, Date.new(2010, 3, 8), 43.779, 11.432)
15
- assert_equal(rise.to_i, 1268068276)
15
+ set = SunTimes.calculate(:set, Date.new(2010, 3, 8), 43.779, 11.432)
16
+ assert_equal(Time.gm(2010, 3, 8, 17, 11, 16), set)
16
17
  end
17
18
 
18
19
  def test_rise_helper
19
20
  rise = SunTimes.rise(Date.new(2010, 3, 8), 43.779, 11.432)
20
- assert_equal(rise.to_i, 1268026793)
21
+ assert_equal(Time.gm(2010, 3, 8, 5, 39, 53), rise)
21
22
  end
22
23
 
23
24
  def test_set_helper
24
- rise = SunTimes.set(Date.new(2010, 3, 8), 43.779, 11.432)
25
- assert_equal(rise.to_i, 1268068276)
25
+ set = SunTimes.set(Date.new(2010, 3, 8), 43.779, 11.432)
26
+ assert_equal(Time.gm(2010, 3, 8, 17, 11, 16), set)
26
27
  end
27
28
 
28
29
  def test_midnight_sun_on_20100621_north_cape
@@ -36,4 +37,24 @@ class SunTimesTest < Test::Unit::TestCase
36
37
  assert_raise(RuntimeError) { SunTimes.calculate(:foo, Date.new(2010, 3, 8), 43.779, 11.432) }
37
38
  end
38
39
 
40
+ def test_time
41
+ datetime = Time.gm(2010, 6, 13, 0, 0, 0)
42
+ set = SunTimes.calculate(:set, datetime, 43.779, 11.432)
43
+ assert_equal(Time.gm(2010, 6, 13, 18, 56, 55), set)
44
+ end
45
+
46
+ def test_datetime
47
+ datetime = DateTime.new(2010, 6, 13, 0, 0, 0)
48
+ set = SunTimes.calculate(:set, datetime, 43.779, 11.432)
49
+ assert_equal(Time.gm(2010, 6, 13, 18, 56, 55), set)
50
+ end
51
+
52
+ def test_respects_timezone_if_supplied
53
+ pst = DateTime.new(2011, 12, 13, 0, 0, 0, Rational(-8, 24))
54
+ set = SunTimes.calculate(:set, pst, 45.52, -122.681944)
55
+ result_datetime = DateTime.new(set.year, set.month, set.day, set.hour, set.min, set.sec, 0)
56
+ assert(pst < result_datetime)
57
+ assert(pst + 1 > result_datetime)
58
+ end
59
+
39
60
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-sun-times
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joe Yates
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-03-09 00:00:00 +01:00
12
+ date: 2011-12-20 00:00:00 +00:00
13
13
  default_executable:
14
14
  dependencies: []
15
15