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:
parent
f2c6db41ba
commit
07ffe7a621
3 changed files with 39 additions and 10 deletions
|
@ -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.
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue