diff --git a/lib/validates_timeliness/conversion.rb b/lib/validates_timeliness/conversion.rb index b40ed55..5d107a5 100644 --- a/lib/validates_timeliness/conversion.rb +++ b/lib/validates_timeliness/conversion.rb @@ -4,7 +4,7 @@ module ValidatesTimeliness def type_cast_value(value, type) return nil if value.nil? - value.in_time_zone if value.acts_like?(:time) && @timezone_aware + value = value.in_time_zone if value.acts_like?(:time) && @timezone_aware value = case type when :time dummy_time(value) @@ -14,7 +14,7 @@ module ValidatesTimeliness value.to_time end if options[:ignore_usec] && value.is_a?(Time) - ValidatesTimeliness::Parser.make_time(Array(value).reverse[4..9]) + ValidatesTimeliness::Parser.make_time(Array(value).reverse[4..9], @timezone_aware) else value end @@ -22,6 +22,7 @@ module ValidatesTimeliness def dummy_time(value) time = if value.acts_like?(:time) + value = value.in_time_zone if @timezone_aware [value.hour, value.min, value.sec] else [0,0,0] diff --git a/spec/validates_timeliness/conversion_spec.rb b/spec/validates_timeliness/conversion_spec.rb index e12f11b..5938fd7 100644 --- a/spec/validates_timeliness/conversion_spec.rb +++ b/spec/validates_timeliness/conversion_spec.rb @@ -55,6 +55,14 @@ describe ValidatesTimeliness::Conversion do it "should return as Time with same component values" do type_cast_value(DateTime.civil_from_format(:utc, 2010, 1, 1, 12, 34, 56), :datetime).should == Time.utc(2010, 1, 1, 12, 34, 56) end + + it "should return same Time in correct zone if timezone aware" do + @timezone_aware = true + value = Time.utc(2010, 1, 1, 12, 34, 56) + result = type_cast_value(value, :datetime) + result.should == Time.zone.local(2010, 1, 1, 23, 34, 56) + result.zone.should == 'EST' + end end describe "ignore_usec option" do @@ -64,6 +72,14 @@ describe ValidatesTimeliness::Conversion do value = Time.utc(2010, 1, 1, 12, 34, 56, 10000) type_cast_value(value, :datetime).should == Time.utc(2010, 1, 1, 12, 34, 56) end + + it "should ignore usec and return time in correct zone if timezone aware" do + @timezone_aware = true + value = Time.utc(2010, 1, 1, 12, 34, 56, 10000) + result = type_cast_value(value, :datetime) + result.should == Time.zone.local(2010, 1, 1, 23, 34, 56) + result.zone.should == 'EST' + end end end @@ -76,6 +92,11 @@ describe ValidatesTimeliness::Conversion do dummy_time(Time.utc(2000, 1, 1, 12, 34, 56)).should == Time.utc(2000, 1, 1, 12, 34, 56) end + it 'should return time component values shifted to current zone if timezone aware' do + @timezone_aware = true + dummy_time(Time.utc(2000, 1, 1, 12, 34, 56)).should == Time.zone.local(2000, 1, 1, 23, 34, 56) + end + it 'should return base dummy time value for Date value' do dummy_time(Date.new(2010, 11, 22)).should == Time.utc(2000, 1, 1, 0, 0, 0) end