Rails ActiveSupport:: TimeWithZone as_json формат даты

Я создаю API в рельсах, где некоторые ответы включают дату. В моей базе данных поля устанавливаются как поля даты и времени, а затем рельсы превращаются в объекты ActiveSupport::TimeWithZone. Когда я отвечаю на запрос с датой, я ожидаю получить что-то вроде

2013-07-23T01:18:32Z 

Но вместо этого я получаю

2013-07-23T01:18:32.000Z

Почему в конце есть дополнительный .000? Как сейчас это нарушает код на клиенте, который я пишу. Очевидно, я мог бы исправить клиента, изменив формат, который он ожидает, но я хотел бы знать, почему рельсы делают это в первую очередь, поскольку документация предлагает это не должен иметь .000.

Ответ 2

Если вы хотите вернуться в формат без миллисекунд, вы можете добавить инициализатор со следующим кодом:

    class ActiveSupport::TimeWithZone
    #Changing the as_json method to remove the milliseconds from TimeWithZone to_json result (just like in Rails 3)
        def as_json(options = {})
            if ActiveSupport::JSON::Encoding.use_standard_json_time_format
                xmlschema
            else
                %(#{time.strftime("%Y/%m/%d %H:%M:%S")} #{formatted_offset(false)})
            end
        end
    end

Ответ 4

Для других, приезжающих сюда из Google. Существует связанный с этим вопрос с более актуальным ответом для Rails 4.1+ здесь.

Точность для кодирования времени JSON теперь настраивается. В соответствии с руководствами по обновлению Rails теперь вы можете добавить следующую строку в инициализаторе вместо замены обезьян:

ActiveSupport::JSON::Encoding.time_precision = 3

Ответ 5

это тоже может работать

# With ActiveSupport::JSON::Encoding.use_standard_json_time_format = true
Time.utc(2005,2,1,15,15,10).in_time_zone("Hawaii").to_json
# => "2005-02-01T05:15:10.000-10:00"

# With ActiveSupport::JSON::Encoding.use_standard_json_time_format = false
Time.utc(2005,2,1,15,15,10).in_time_zone("Hawaii").to_json
# => "2005/02/01 05:15:10 -1000"

http://api.rubyonrails.org/classes/ActiveSupport/TimeWithZone.html#method-i-as_json