1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

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

This commit is contained in:
denisovlev 2016-10-20 15:44:22 +03:00
parent f2c6db41ba
commit 07ffe7a621
3 changed files with 39 additions and 10 deletions

View file

@ -1,3 +1,10 @@
* 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`. * Fix `DateAndTime::Calculations#copy_time_to`. Copy `nsec` instead of `usec`.
Jumping forward or backward between weeks now preserves nanosecond digits. Jumping forward or backward between weeks now preserves nanosecond digits.

View file

@ -450,6 +450,9 @@ module ActiveSupport
raise ArgumentError, "invalid date" if parts.nil? raise ArgumentError, "invalid date" if parts.nil?
return if parts.empty? return if parts.empty?
if parts[:seconds]
time = Time.at(parts[:seconds])
else
time = Time.new( time = Time.new(
parts.fetch(:year, now.year), parts.fetch(:year, now.year),
parts.fetch(:mon, now.month), parts.fetch(:mon, now.month),
@ -459,8 +462,9 @@ module ActiveSupport
parts.fetch(:sec, 0) + parts.fetch(:sec_fraction, 0), parts.fetch(:sec, 0) + parts.fetch(:sec_fraction, 0),
parts.fetch(:offset, 0) parts.fetch(:offset, 0)
) )
end
if parts[:offset] if parts[:offset] || parts[:seconds]
TimeWithZone.new(time.utc, self) TimeWithZone.new(time.utc, self)
else else
TimeWithZone.new(nil, self, time) TimeWithZone.new(nil, self, time)

View file

@ -395,6 +395,24 @@ class TimeZoneTest < ActiveSupport::TestCase
end end
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 def test_utc_offset_lazy_loaded_from_tzinfo_when_not_passed_in_to_initialize
tzinfo = TZInfo::Timezone.get("America/New_York") tzinfo = TZInfo::Timezone.get("America/New_York")
zone = ActiveSupport::TimeZone.create(tzinfo.name, nil, tzinfo) zone = ActiveSupport::TimeZone.create(tzinfo.name, nil, tzinfo)