diff options
| -rw-r--r-- | activesupport/CHANGELOG.md | 5 | ||||
| -rw-r--r-- | activesupport/lib/active_support/json/decoding.rb | 11 | ||||
| -rw-r--r-- | activesupport/test/json/decoding_test.rb | 16 | 
3 files changed, 25 insertions, 7 deletions
| diff --git a/activesupport/CHANGELOG.md b/activesupport/CHANGELOG.md index b71a26aba2..01ff1a858d 100644 --- a/activesupport/CHANGELOG.md +++ b/activesupport/CHANGELOG.md @@ -1,3 +1,8 @@ +*   Fix parsing JSON time in `YYYY-MM-DD hh:mm:ss` (without `Z`). +    Before such time was considered in UTC timezone, now, to comply with standard, it uses local timezone. + +    *Grzegorz Witek* +  *   Fixed `ActiveSupport::Logger.broadcast` so that calls to `#silence` now      properly delegate to all loggers. Silencing now properly suppresses logging      to both the log and the console. diff --git a/activesupport/lib/active_support/json/decoding.rb b/activesupport/lib/active_support/json/decoding.rb index 2932954f03..64e4b0e7a9 100644 --- a/activesupport/lib/active_support/json/decoding.rb +++ b/activesupport/lib/active_support/json/decoding.rb @@ -8,7 +8,8 @@ module ActiveSupport    module JSON      # matches YAML-formatted dates -    DATE_REGEX = /^(?:\d{4}-\d{2}-\d{2}|\d{4}-\d{1,2}-\d{1,2}[T \t]+\d{1,2}:\d{2}:\d{2}(\.[0-9]*)?(([ \t]*)Z|[-+]\d{2}?(:\d{2})?))$/ +    DATE_REGEX = /^\d{4}-\d{2}-\d{2}$/ +    DATETIME_REGEX = /^(?:\d{4}-\d{2}-\d{2}|\d{4}-\d{1,2}-\d{1,2}[T \t]+\d{1,2}:\d{2}:\d{2}(\.[0-9]*)?(([ \t]*)Z|[-+]\d{2}?(:\d{2})?)?)$/      class << self        # Parses a JSON string (JavaScript Object Notation) into a hash. @@ -48,7 +49,13 @@ module ActiveSupport            nil          when DATE_REGEX            begin -            DateTime.parse(data) +            Date.parse(data) +          rescue ArgumentError +            data +          end +        when DATETIME_REGEX +          begin +            Time.zone.parse(data)            rescue ArgumentError              data            end diff --git a/activesupport/test/json/decoding_test.rb b/activesupport/test/json/decoding_test.rb index f2fc456f4b..887ef1681d 100644 --- a/activesupport/test/json/decoding_test.rb +++ b/activesupport/test/json/decoding_test.rb @@ -1,8 +1,11 @@  require 'abstract_unit'  require 'active_support/json'  require 'active_support/time' +require 'time_zone_test_helpers'  class TestJSONDecoding < ActiveSupport::TestCase +  include TimeZoneTestHelpers +    class Foo      def self.json_create(object)        "Foo" @@ -24,10 +27,11 @@ class TestJSONDecoding < ActiveSupport::TestCase      %(["2007-01-01 01:12:34 Z"])                 => [Time.utc(2007, 1, 1, 1, 12, 34)],      %(["2007-01-01 01:12:34 Z", "2007-01-01 01:12:35 Z"]) => [Time.utc(2007, 1, 1, 1, 12, 34), Time.utc(2007, 1, 1, 1, 12, 35)],      # no time zone -    %({"a": "2007-01-01 01:12:34"})              => {'a' => "2007-01-01 01:12:34"}, +    %({"a": "2007-01-01 01:12:34"})              => {'a' => Time.new(2007, 1, 1, 1, 12, 34, "-05:00")},      # invalid date      %({"a": "1089-10-40"})                       => {'a' => "1089-10-40"},      # xmlschema date notation +    %({"a": "2009-08-10T19:01:02"})              => {'a' => Time.new(2009, 8, 10, 19, 1, 2, "-04:00")},      %({"a": "2009-08-10T19:01:02Z"})             => {'a' => Time.utc(2009, 8, 10, 19, 1, 2)},      %({"a": "2009-08-10T19:01:02+02:00"})        => {'a' => Time.utc(2009, 8, 10, 17, 1, 2)},      %({"a": "2009-08-10T19:01:02-05:00"})        => {'a' => Time.utc(2009, 8, 11, 00, 1, 2)}, @@ -72,10 +76,12 @@ class TestJSONDecoding < ActiveSupport::TestCase    TESTS.each_with_index do |(json, expected), index|      test "json decodes #{index}" do -      with_parse_json_times(true) do -        silence_warnings do -          assert_equal expected, ActiveSupport::JSON.decode(json), "JSON decoding \ -          failed for #{json}" +      with_tz_default 'Eastern Time (US & Canada)' do +        with_parse_json_times(true) do +          silence_warnings do +            assert_equal expected, ActiveSupport::JSON.decode(json), "JSON decoding \ +            failed for #{json}" +          end          end        end      end | 
