Skip to content
Browse files

Merge pull request #7352 from aripollak/microsecond-timestamp

Fix occasional microsecond conversion inaccuracy
Conflicts:
	activerecord/CHANGELOG.md
  • Loading branch information...
1 parent 25f6549 commit d6dbd7fbbcb38c7d34a0928bde2bfc7ce21618f0 @rafaelfranca rafaelfranca committed Aug 17, 2012
View
6 activerecord/CHANGELOG.md
@@ -1,5 +1,11 @@
## Rails 3.2.9 (unreleased)
+* Fix Column.microseconds and Column.fast_string_to_date to avoid converting
+ timestamp seconds to a float, since it occasionally results in inaccuracies
+ with microsecond-precision times. Fixes #7352.
+
+ *Ari Pollak*
+
* Fix `increment!`, `decrement!`, `toggle!` that was skipping callbacks.
Fixes #7306.
View
4 activerecord/lib/active_record/connection_adapters/column.rb
@@ -180,7 +180,7 @@ def value_to_decimal(value)
# '0.123456' -> 123456
# '1.123456' -> 123456
def microseconds(time)
- ((time[:sec_fraction].to_f % 1) * 1_000_000).to_i
+ time[:sec_fraction] ? (time[:sec_fraction] * 1_000_000).to_i : 0
end
def new_date(year, mon, mday)
@@ -205,7 +205,7 @@ def fast_string_to_date(string)
# Doesn't handle time zones.
def fast_string_to_time(string)
if string =~ Format::ISO_DATETIME
- microsec = ($7.to_f * 1_000_000).to_i
+ microsec = ($7.to_r * 1_000_000).to_i
new_time $1.to_i, $2.to_i, $3.to_i, $4.to_i, $5.to_i, $6.to_i, microsec
end
end
View
1 activerecord/test/cases/base_test.rb
@@ -205,6 +205,7 @@ def test_preserving_time_objects
assert_equal 11, Topic.find(1).written_on.sec
assert_equal 223300, Topic.find(1).written_on.usec
assert_equal 9900, Topic.find(2).written_on.usec
+ assert_equal 129346, Topic.find(3).written_on.usec
end
end
View
2 activerecord/test/fixtures/topics.yml
@@ -25,7 +25,7 @@ third:
id: 3
title: The Third Topic of the day
author_name: Carl
- written_on: 2005-07-15t15:28:00.0099+01:00
+ written_on: 2012-08-12t20:24:22.129346+00:00
content: I'm a troll
approved: true
replies_count: 1

0 comments on commit d6dbd7f

Please sign in to comment.
Something went wrong with that request. Please try again.