2013-07-23 4 views
12

Produkuję API w szynach, gdzie niektóre z odpowiedzi zawierają datę. W mojej bazie danych pola są ustawiane jako pola datetime, które następnie stają się obiektami ActiveSupport::TimeWithZone. Kiedy odpowiedzi na wniosek z datetime w oczekuję, żeby coś podobnegoRails ActiveSupport :: TimeWithZone as_json format daty wydania

2013-07-23T01:18:32Z 

Ale zamiast tego dostaję

2013-07-23T01:18:32.000Z 

Dlaczego istnieje dodatkowy .000 w końcu? W tej chwili łamie to kod na kliencie, który piszę. Oczywiście mogłem naprawić klienta, zmieniając format, jakiego się spodziewałem, ale chciałbym wiedzieć, dlaczego rails robi to w pierwszej kolejności, jako że documentation sugeruje, że nie powinien tam być .000.

Odpowiedz

7

Jeśli chcesz powrócić do formatu bez millisecon DS można dodawać inicjator z następującego kodu:

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

ten pracował dla mnie :) – Kirk

0

to może działać jak dobrze

# 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

Dla innych najbliższych tutaj z Google. Istnieje powiązane pytanie z bardziej aktualną odpowiedzią dla Rails 4.1+ here.

Precyzyjność kodowania czasu JSON jest teraz konfigurowalna. Według Rails upgrade guides można teraz dodać następującą linię do inicjowania zamiast małpa-łatanie:

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

prosty i bardzo dokładnie. Domyślnie w Railsach 4.1+ precyzja_czasu jest ustawiona na 3. A w poprzednich wersjach, GDZIE TEN OPCJA NIE ZNAJDUJE SIĘ, używa 0 dla domyślnej precyzji czasu. – kuhn

+0

I możesz ustawić 'time_precision = 6', aby ustawić true:' t = Time.current; t == Time.zone.parse (t.as_json) '. W przeciwnym razie 't.usec' będzie inne po serializacji/deserializacji. Testowane z szynami 5.1 –