2013-07-23 3 views
12

Sto producendo un'API in rails, dove alcune delle risposte includono una data. Nel mio database, i campi sono impostati come campi data/ora, che rotaie diventano quindi oggetti ActiveSupport::TimeWithZone. Quando ho risposto a una richiesta con un datetime in, mi aspetto di ottenere qualcosa di simileRails ActiveSupport :: TimeWithZone as_json data format issue

2013-07-23T01:18:32Z 

Ma invece, mi sto

2013-07-23T01:18:32.000Z 

Perché c'è l'ulteriore .000 alla fine? Come ora, questo sta infrangendo il codice sul client che sto scrivendo. Ovviamente potrei sistemare il client cambiando il formato che mi aspetto, ma mi piacerebbe sapere perché la rota lo sta facendo in primo luogo, poiché lo documentation suggerisce che non dovrebbe avere lo .000 lì.

risposta

7

Se si desidera ripristinare il formato senza millisecon ds, è possibile aggiungere un inizializzatore con il seguente codice:

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

Questo ha funzionato per me :) – Kirk

0

Questo potrebbe funzionare così

# 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

Per gli altri che vengono qui da Google. C'è una domanda correlata con una risposta più aggiornata per Rails 4.1+ here.

La precisione per la codifica del tempo JSON ora è configurabile. Secondo il Rails upgrade guides è ora possibile aggiungere la seguente riga in un inizializzatore invece di scimmia-patching:

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

Semplice e molto precisamente. Per impostazione predefinita in Rails 4.1+ time_precision è impostato su 3. E nelle versioni precedenti DOVE QUESTA OPZIONE NON ESISTE utilizza 0 per la precisione temporale predefinita. – kuhn

+0

Ed è possibile impostare 'time_precision = 6' per rendere questo vero:' t = Time.current; t == Time.zone.parse (t.as_json) '. Altrimenti 't.usec' sarà diverso dopo la serializzazione/deserializzazione. Testato con rotaie 5.1 –