Skip to content

Commit c5d519f

Browse files
authored
Merge pull request rails#50240 from joshuay03/preserve-timezone-in-active-job-time-with-zone-serializer
[Fix rails#50230] Preserve serialized timezone when deserializing with `ActiveJob::Serializers::TimeWithZoneSerializer`
2 parents 67fb441 + 18098cc commit c5d519f

File tree

3 files changed

+38
-2
lines changed

3 files changed

+38
-2
lines changed

activejob/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
* Preserve the serialized timezone when deserializing `ActiveSupport::TimeWithZone` arguments.
2+
3+
*Joshua Young*
4+
15
* Remove deprecated `:exponentially_longer` value for the `:wait` in `retry_on`.
26

37
*Rafael Mendonça França*

activejob/lib/active_job/serializers/time_with_zone_serializer.rb

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,18 @@
22

33
module ActiveJob
44
module Serializers
5-
class TimeWithZoneSerializer < TimeObjectSerializer # :nodoc:
5+
class TimeWithZoneSerializer < ObjectSerializer # :nodoc:
6+
NANO_PRECISION = 9
7+
8+
def serialize(time_with_zone)
9+
super(
10+
"value" => time_with_zone.iso8601(NANO_PRECISION),
11+
"time_zone" => time_with_zone.time_zone.tzinfo.name
12+
)
13+
end
14+
615
def deserialize(hash)
7-
Time.iso8601(hash["value"]).in_time_zone
16+
Time.iso8601(hash["value"]).in_time_zone(hash["time_zone"] || Time.zone)
817
end
918

1019
private
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# frozen_string_literal: true
2+
3+
require "helper"
4+
5+
class TimeWithZoneSerializerTest < ActiveSupport::TestCase
6+
test "#deserialize preserves serialized time zone" do
7+
time_zone_before = Time.zone
8+
9+
Time.zone = "America/Los_Angeles"
10+
time_with_zone = Time.parse("08:00").in_time_zone
11+
12+
assert_equal "America/Los_Angeles", time_with_zone.time_zone.tzinfo.name
13+
14+
serialized = ActiveJob::Serializers::TimeWithZoneSerializer.serialize(time_with_zone)
15+
Time.zone = "Europe/London"
16+
deserialized = ActiveJob::Serializers::TimeWithZoneSerializer.deserialize(serialized)
17+
18+
assert_equal "America/Los_Angeles", deserialized.time_zone.tzinfo.name
19+
assert_equal time_with_zone, deserialized
20+
ensure
21+
Time.zone = time_zone_before
22+
end
23+
end

0 commit comments

Comments
 (0)