2012-09-07 15 views
13

puedo configurar la zona horaria de nuestro sitio en Heroku a hora estándar del Pacífico (PST) usando:Rieles: ¿Cómo conseguir la zona horaria del usuario actual cuando se utilizan Heroku

heroku config:add TZ=America/Los_Angeles 

tiempos para los usuarios son ahora siempre en PST --si están o no en la zona horaria PST.

Cuál es la mejor manera de conseguir zona horaria real del usuario (es decir, la zona horaria del lugar en que se encuentren físicamente)?

supongo que esto se puede resolver utilizando los carriles (o Javascript?), En contraposición a Heroku.

+0

He estado buscando por la web, y parece probable que voy a tener que hacer algo en el lado del cliente con JS y pasar de nuevo al servidor . Por favor avise. –

Respuesta

20

Hay dos maneras de hacer esto.

  • De hecho, puede utilizar javascript para obtener su hora/zona horaria actual. Existe la posibilidad de que el tiempo el equipo del usuario no está configurado correctamente, en cuyo caso la zona vez que se muestra no será correcta.

    Como está utilizando Rails, una forma recomendada es obtener javascript ya incluido como una gema, como detect_timezone_rails. Esto hace que sea fácil de instalar (porque está todo incluido automáticamente en la canalización de activos.

  • Puede utilizar la dirección IP para inferir su país y zona horaria. El peligro en este caso es que un usuario pueda estar utilizando una Además, aunque la dirección IP generalmente tiene una resolución a nivel de ciudad, puede ser más o menos precisa, lo que en algunos casos puede dar una zona horaria incorrecta.

    Usando la dirección IP, puede obtener su ciudad aproximada y latitud/longitud. Hay muchas gemas que pueden hacer esto en Ruby Toolbox, por ejemplo, geocoder. Con la latitud/longitud, puede obtener la zona horaria usando una gema como timezone.

También puede usar una de las opciones anteriores y permitir al usuario cambiar manualmente su zona horaria en su sitio web (ya sea almacenando esta configuración en una base de datos si está registrada o como una cookie en su navegador). Esto es útil en caso de que tenga la zona horaria equivocada.

11

Hay un par de maneras que usted puede hacer esto en función de cómo se configura la aplicación. Ninguno de los cuales es exclusivo del entorno de Heroku.

Si su aplicación permite que los usuarios se registren, es muy probable que tenga un modelo de usuario y es posible que esté utilizando la gema Devise para autenticación/registro. Añadir un campo a su base de datos (: time_zone) y almacenar la zona horaria de los usuarios en este campo cuando se inscriban.

>> rails generate migration add_time_zone_to_users time_zone:string 
>> rake db:migrate 

Carriles le da una forma time_zone_select mano de ayuda que le da una lista de selección con todas las zonas de tiempo en ella que puede mostrar a su usuario. Agréguelo al formulario de registro de usuario y permita que el usuario configure su zona horaria cuando se registre. http://apidock.com/rails/ActionView/Helpers/FormOptionsHelper/time_zone_select

En su Controlador de aplicaciones, puede hacer algo como esto;

before_filter :set_time_zone 

def set_time_zone 
    #current user is a devise method see https://github.com/plataformatec/devise 
    Time.zone = current_user.time_zone if current_user 
end 

A continuación, cuando se muestra una fecha en su llamada aplicación .in_time_zone en el instante de tiempo que muestra la hora en el huso horario usuarios.

<%= Time.now.in_time_zone %> or <%= @your_model.created_at.in_time_zone %> 

Si no tiene autenticación de usuario, puede recurrir a javascript. Para ello se puede utilizar el Javascript nativo getTimezoneOffset() en el objeto de fecha, o incluso utilizar mejor la siguiente jsTimezoneDetect plugin:

http://www.pageloom.com/automatic-timezone-detection-with-javascript

Por último se puede utilizar un híbrido de ambos y en primer lugar detectar su huso horario usando javascript y luego almacene este valor en una sesión/cookie de rieles y luego use un filtro_de_fuera para establecer el Time.zone como se indicó anteriormente pero basado en el valor de time_zone de la sesión previamente calculado en javascript.

5

O puede utilizar este impresionante joya https://github.com/kbaum/browser-timezone-rails

+0

Aparentemente este enfoque es defectuoso ya que depende de jstimezone bajo el capó. http://stackoverflow.com/questions/30756405/cant-set-timezone-using-abbreviation/30758246#30758246 – Evolve

Cuestiones relacionadas