Skip to content

Commit

Permalink
Ensure that the cut-off time is in the same timezone as the extended …
Browse files Browse the repository at this point in the history
…object

If we don't match the UTC offset, and the system timezone is not UTC, you end up
with the following scenario:

= Scenario 1 (correct)
Time.now               # 2014-08-15 15:30:00 +0100
Time.now.cut_off_time  # 2014-08-15 16:00:00 +0100
Time.now.despatch_day  # Fri, 15 Aug 2014

= Scenario 2 (incorrect)
Time.zone.now               # Fri, 15 Aug 2014 15:30:00 BST +01:00
Time.zone.now.cut_off_time  # Fri, 15 Aug 2014 16:00:00 BST +01:00
Time.zone.now.despatch_day  # Mon, 18 Aug 2014

The incorrect result in Scenario 2 is due to the fact that the
ActiveSupport::TimeWithZone class wraps a UTC time object and maintains the
timezone data separately. When DateExtension.despatch_day is called in Scenario
2, the context is:

self          # 2014-08-15 15:30:00 UTC
cut_off_time  # 2014-08-15 16:00:00 +0100

This comparison is incorrect due to the mismatch in timezones and produces the
wrong result. The fix is to construct the cut_off_time based on the timezone
of #self.
  • Loading branch information
giddie committed Aug 18, 2014
1 parent afdec63 commit 84f3432
Showing 1 changed file with 2 additions and 1 deletion.
3 changes: 2 additions & 1 deletion lib/nextday/date_extension.rb
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,8 @@ def delivery_day
def cut_off_time
hour, minute = Config.cut_off_hour, Config.cut_off_minute

Time.new(year, month, day, hour, minute)
utc_offset = self.utc_offset unless not self.respond_to?(:utc_offset)
Time.new(year, month, day, hour, minute, 0, utc_offset)
end

##
Expand Down

0 comments on commit 84f3432

Please sign in to comment.