2010-05-30 14 views
24

Estoy implementando una aplicación Facebook y usando AJAX/JSON.fechas de los rieles con json

Sin embargo, las estructuras JSON que se devuelven tienen este formato 2010-05-30T06:14:00Z.

llamo Game.all.to_json en la acción del controlador.

¿Cómo puedo convertirlos a un formato de fecha normal?

¿Es más fácil hacerlo desde el lado del servidor o del lado del cliente utilizando fbjs? Hay muchos errores con fbjs.

Así que preferiría usar una solución del Server side usando (Active Records). Como convertir los datos antes de enviar las estructuras JSON.

+0

Eso funciona: http://stackoverflow.com/questions/5370061/format-date-time-in-find-operation-in-rails-3/7479550#7479550 – hipertracker

Respuesta

47

La forma en que agregué mi propio formato personalizado al JSON que estaba devolviendo fue agregar un parche de mono a la clase ActiveSupport TimeWithZone.

añadir un archivo en la carpeta config/inicializadores con el siguiente contenido:

class ActiveSupport::TimeWithZone 
    def as_json(options = {}) 
     strftime('%Y-%m-%d %H:%M:%S') 
    end 
end 
+0

Esto funciona muy bien para mí, pero ahora estoy ' Estoy intentando hacer algo similar para un objeto Date (devuelto usando date_select). He intentado reemplazar ActiveSupport :: TimeWithZone con ActiveSupport :: Date, pero no hay alegría. Cualquier ayuda sería apreciada. Gracias. – Snips

+3

Puede ser útil agregar% z para la zona horaria. – tbeseda

+0

@Geekygecko He votado a favor su respuesta. Usé este enfoque y funciona muy bien para un campo de fecha y hora asociado con un modelo, no para el campo de fecha y hora de otra tabla en una consulta AREL con combinaciones. – GeorgeW

1

Definitivamente más fácil de hacer por el lado del servidor. Puede hacer un gsubgegex para ponerlo en el formato que desee, o un time.strftime, y luego generar su json con esa cadena.

7

Con zona horaria de trabajo en todos los navegadores y IE7 +:

class ActiveSupport::TimeWithZone 
    def as_json(options = {}) 
    strftime('%Y/%m/%d %H:%M:%S %z') 
    end 
end 
1
Time.parse <datetime> 

simples.

2

Si usted quiere hacer esto con javascript del lado del cliente, puede analizar fechas individuales con algo como esto:

prettyDate = function(dateString) { 
    var day, formatted, jsDate, month; 

    jsDate = new Date(dateString); 
    day = jsDate.getMonth() + 1 < 10 ? "0" + (jsDate.getMonth() + 1) : "" + (jsDate.getMonth() + 1); 
    month = jsDate.getDate() < 10 ? "0" + (jsDate.getDate()) : "" + (jsDate.getDate()); 

    formatted = "" + day + "/" + month + "/" + (jsDate.getFullYear()); 
    return formatted; 
}; 

que necesitará algo de código adicional si su necesidad de dar formato a tiempo, por supuesto.

2

Puede reemplazar el método as_json en su modelo como:

class Game 
    def as_json(options = {}) 
    super.merge(time: time.strftime('%d.%m.%Y %H:%M:%S')) 
    end 
end 
0

Carriles tiene ahora el método .as_json en el objeto DateTime. La vida se hizo más fácil.

Cuestiones relacionadas