Rails 8 – New ActiveSupport Timezone Defaults



This content originally appeared on DEV Community and was authored by Georgy Yuriev

Rails 8 introduces a new default value for

ActiveSupport.to_time_preserves_timezone
# config/initializers/new_framework_defaults_8_0.rb
#
# Specifies whether `to_time` methods preserve the UTC offset of their receivers or preserve the timezone.
# If set to `:zone`, `to_time` methods will use the timezone of their receivers.
# If set to `:offset`, `to_time` methods will use the UTC offset.
# If `false`, `to_time` methods will convert to the local system UTC offset instead.
#
# Rails.application.config.active_support.to_time_preserves_timezone = :zone

It was not clear to me what this changes for my application or where problems might hide. So I figured it out.

require 'active_support/all'
Time.zone = 'America/New_York'

In the United States, daylight saving time begins on the second Sunday in March and ends on the first Sunday in November, with the time change occurring at 2:00 a.m. local time. I chose the borderline case – November 1st.

ActiveSupport.to_time_preserves_timezone = :offset

t = Time.zone.parse('1/Nov/2025 12:30:00').to_time
=> 2025-11-01 12:30:00 -0400

t.zone
=> nil

t + 1.day
=> 2025-11-02 12:30:00 -0400

Notice the lack of time zone information in the result object. The transition from daylight saving time was not completed.

ActiveSupport.to_time_preserves_timezone = :zone

t = Time.zone.parse('1/Nov/2025 12:30:00').to_time
=> 2025-11-01 12:30:00 -0400

t.zone
=> #<ActiveSupport::TimeZone:0x000000011c9aff20 @name="America/New_York", @tzinfo=#<TZInfo::DataTimezone: America/New_York>, @utc_offset=nil>

t + 1.day
=> 2025-11-02 12:30:00 -0500

But with the new Rails default (:zone), the to_time method returns an object with timezone information, which helps to correctly make calculations taking the daylight saving time transition into account.


This content originally appeared on DEV Community and was authored by Georgy Yuriev