2013-07-23 3 views
12

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

2013-07-23T01:18:32Z 

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

2013-07-23T01:18:32.000Z 

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

ответ

6

я была такая же проблема в последнее время.

, и я нашел журнал фиксации. https://github.com/rails/rails/pull/9128

+0

Хорошей находки :) Всегда раздражает, когда вещи переодеться и ломать вещи – PaReeOhNos

7

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

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 
+0

Это работало для меня :) – Kirk

0

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

# 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

4

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

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

ActiveSupport::JSON::Encoding.time_precision = 3 
+0

Простых и очень точно. По умолчанию в Rails 4.1+ значение time_precision равно 3. И в предыдущих версиях ГДЕ, КОГДА ЭТО ОПЦИЯ НЕ СУЩЕСТВУЕТ, он использует 0 для точности по умолчанию по времени. – kuhn

+0

И вы можете установить 'time_precision = 6', чтобы сделать это правдой:' t = Time.current; t == Time.zone.parse (t.as_json) '. В противном случае 't.usec' будет отличаться после сериализации/десериализации. Протестировано рельсами 5.1 –