提交 07ffe7a6 编写于 作者: D denisovlev

Fix `ActiveSupport::TimeZone#strptime` cannot parse timestamps (%Q, %s)

上级 f2c6db41
* Fix `ActiveSupport::TimeZone#strptime`.
Support for timestamps in format of seconds (%s) and milliseconds (%Q).
Fixes #26840.
*Lev Denisov*
* Fix `DateAndTime::Calculations#copy_time_to`. Copy `nsec` instead of `usec`.
Jumping forward or backward between weeks now preserves nanosecond digits.
......
......@@ -450,17 +450,21 @@ def parts_to_time(parts, now)
raise ArgumentError, "invalid date" if parts.nil?
return if parts.empty?
time = Time.new(
parts.fetch(:year, now.year),
parts.fetch(:mon, now.month),
parts.fetch(:mday, parts[:year] || parts[:mon] ? 1 : now.day),
parts.fetch(:hour, 0),
parts.fetch(:min, 0),
parts.fetch(:sec, 0) + parts.fetch(:sec_fraction, 0),
parts.fetch(:offset, 0)
)
if parts[:offset]
if parts[:seconds]
time = Time.at(parts[:seconds])
else
time = Time.new(
parts.fetch(:year, now.year),
parts.fetch(:mon, now.month),
parts.fetch(:mday, parts[:year] || parts[:mon] ? 1 : now.day),
parts.fetch(:hour, 0),
parts.fetch(:min, 0),
parts.fetch(:sec, 0) + parts.fetch(:sec_fraction, 0),
parts.fetch(:offset, 0)
)
end
if parts[:offset] || parts[:seconds]
TimeWithZone.new(time.utc, self)
else
TimeWithZone.new(nil, self, time)
......
......@@ -395,6 +395,24 @@ def test_strptime_with_malformed_string
end
end
def test_strptime_with_timestamp_seconds
with_env_tz "US/Eastern" do
zone = ActiveSupport::TimeZone["Eastern Time (US & Canada)"]
time_str = "1470272280"
time = zone.strptime(time_str, "%s")
assert_equal Time.at(1470272280), time
end
end
def test_strptime_with_timestamp_milliseconds
with_env_tz "US/Eastern" do
zone = ActiveSupport::TimeZone["Eastern Time (US & Canada)"]
time_str = "1470272280000"
time = zone.strptime(time_str, "%Q")
assert_equal Time.at(1470272280), time
end
end
def test_utc_offset_lazy_loaded_from_tzinfo_when_not_passed_in_to_initialize
tzinfo = TZInfo::Timezone.get("America/New_York")
zone = ActiveSupport::TimeZone.create(tzinfo.name, nil, tzinfo)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册