Ruby’s Time has a bug: when try to serialize an timezoned time, then unserialize it back, the result will use the server local time, instead of use the original time zone.
>> utc = Time.now.utc => Fri Aug 29 09:07:37 UTC 2008 >> marshaled = Marshal.dump utc => "\004\bu:\tTime\r\251\037\e\200\344\254T\036" >> Marshal.load marshaled => Fri Aug 29 11:07:37 +0200 2008

This bug doesn’t affects Ruby 1.9, but we still don’t use that version for production purpose. If you use 1.8.x with Rails 2.1.0, your cached timestamps (including ActiveRecord objects), are probably wrong.
>> comment = Comment.first => #<Comment id: 865423346, post_id: 1, text: "Nice post.", created_at: "2008-08-29 09:27:48", updated_at: "2008-08-29 09:27:48"> >> Rails.cache.write('comment', comment) => true >> Rails.cache.read('comment') => #<Comment id: 865423346, post_id: 1, text: "Nice post.", created_at: "2008-08-29 09:27:48", updated_at: "2008-08-29 09:27:48"> >> comment.update_attributes :text => "Nice post!" => true >> Rails.cache.write('comment', comment) => true >> Rails.cache.read('comment') => #<Comment id: 865423346, post_id: 1, text: "Nice post!", created_at: "2008-08-29 09:27:48", updated_at: "2008-08-29 11:28:42">

Look at the last updated_at attribute, it uses local time instead of UTC time zone.
The first time everything goes right, because #updated_at wasn’t invoked and casted to a Time instance. It’s a string, and the marshaling is ok.
But, when I update the object, ActiveRecord changes the value of that timestamp, but before, it cast it to a Time, and everything goes wrong.

I submitted a patch for this bug, it was committed, and will be available in the upcoming Rails 2.2 it’s available in Rails 2.1.1. You are strongly encouraged to update your Rails version.

UPDATE 2008-09-08: This patch was already included in the Rails maintenance release 2.1.1.