2010-09-29 4 views
3

Je mis le fuseau horaire local dans Rails avec cette fonction JavaScript dans ma mise en page:Comment puis-je convertir un temps pour les utilisateurs fuseau horaire dans Rails

<script type="text/javascript" charset="utf-8"> 
    <% unless session[:timezone_offset] %> 
     $.ajax({ 
       url: '/main/timezone', 
       type: 'GET', 
       data: { offset: (new Date()).getTimezoneOffset() } 
     }); 
    <% end %> 
</script> 

où cela est la fonction de réception:

# GET /main/timezone              AJAX 
    #---------------------------------------------------------------------------- 
    def timezone 
    # 
    # (new Date()).getTimezoneOffset() in JavaScript returns (UTC - localtime) in 
    # minutes, while ActiveSupport::TimeZone expects (localtime - UTC) in seconds. 
    # 
    if params[:offset] 
     session[:timezone_offset] = params[:offset].to_i * -60 
     ActiveSupport::TimeZone[session[:timezone_offset]] 
    end 
    render :nothing => true 
    end 

Et puis j'ai le décalage dans ma session, donc je faire quelque chose comme cela pour montrer un temps:

<%= (@product.created_at + session[:timezone_offset]).strftime("%m/%d/%Y %I:%M%p") + " #{ActiveSupport::TimeZone[session[:timezone_offset]]}" %> 

Est-tout de cela vraiment nécessaire dans Rails 3? Je pense que les deux premiers blocs de code peuvent être, mais le troisième semble un peu excessif ...

Répondre

1

Vous pouvez définir le fuseau horaire actuel et il sera mémorisé pour toutes les opérations. Cela peut être fait dans un before_filter d'un contrôleur très haut, comme AppController. Par exemple

class ApplicationController < ActionController::Base 
    before_filter :set_zone_from_session 

    private 

    def set_zone_from_session 
    # set TZ only if stored in session. If not set then the default from config is to be used 
    # (it should be set to UTC) 
    Time.zone = ActiveSupport::TimeZone[session[:timezone_offset]] if session[:timezone_offset] 
    end 

end 

Probablement il ne semble pas mieux sur la première vue - mais il influencera tous les points de vue donc pas besoin de toutes les conversions là-bas.

+0

Seul le problème avec ceci est alors il enregistre dans ce fuseau horaire ainsi maintenant ma base de données aura le temps économisé dans différents fuseaux horaires. Peut-être que ce n'est pas mauvais si ça garde une trace du fuseau horaire ... Qu'en penses-tu? Est-ce que c'est comme ça que ça se fait normalement? Merci! – Tony

+0

Il ne devrait pas enregistrer avec les fuseaux horaires - dans des circonstances normales. Par exemple, les migrations pour Postgres créent des colonnes de temps sans informations de zone. Idem pour Sqlite. Donc, il ne devrait y avoir aucune information sur le fuseau horaire stocké. J'ai une idée géniale pour faire une liste d'exemples simples et travailler avec tzones serait l'un d'entre eux. Mais pas maintenant car je dois travailler pour vivre :-) –

+0

Quand je le relis j'ai l'impression que je n'étais pas assez clair - les temps sont toujours sauvegardés en UTC quels que soient les paramètres de Time.zone. –

Questions connexes