Par défaut, Rails convertit chaque date en UTC avant de stocker la valeur dans la base de données. Cela signifie que, quel que soit le fuseau horaire du serveur, vous aurez toujours des dates UTC dans votre base de données.
Pour convertir les dates dans le fuseau horaire de votre utilisateur, vous avez essentiellement deux possibilités :
- approche côté serveur
- approche client
Approche côté serveur
Si votre site permet l'enregistrement, vous pouvez enregistrer le fuseau horaire de l'utilisateur comme préférence de l'utilisateur. Dans la table des utilisateurs, enregistrez le fuseau horaire de l'utilisateur. Créez ensuite une aide personnalisée que vous pourrez utiliser pour formater n'importe quelle date/heure dans le fuseau horaire approprié à l'aide de l'attribut in_time_zone
méthode.
> t = Time.current
# => Mon, 23 Dec 2013 18:25:55 UTC +00:00
> t.zone
# => "UTC"
> t.in_time_zone("CET")
# => Mon, 23 Dec 2013 19:25:55 CET +01:00
Votre aide peut ressembler à
def format_time(time, timezone)
time.in_time_zone(timezone)
end
Normalement, j'aime aussi sortir un format standard, en utilisant la fonction I18n.l
aide
def format_time(time, timezone)
I18n.l time.to_time.in_time_zone(timezone), format: :long
end
Approche côté client
Si votre site n'a pas d'enregistrement ou si vous ne voulez pas demander à vos utilisateurs leur fuseau horaire ou si vous voulez simplement utiliser le fuseau horaire du système de l'utilisateur, alors vous pouvez utiliser JavaScript.
Je vous suggère de créer une aide personnalisée qui s'imprimera à chaque fois de manière appropriée afin que vous puissiez créer une fonction JavaScript générique pour convertir les valeurs.
def format_time(time, timezone)
time = time.to_time
content_tag(:span, I18n.l(time, format: :long), data: { timezone: timezone, time: time.iso8601 })
end
Maintenant, créez une fonction JavaScript qui est exécutée lors du chargement du DOM et qui sélectionnera toutes les balises HTML avec le code suivant data-time
attribut. Bouclez-les et mettez à jour la valeur à l'intérieur de l'attribut span
avec l'heure correcte dans le fuseau horaire donné.
Un exemple simple de jQuery serait
$(function() {
$("span[data-time]").each(function() {
// get the value from data-time and format according to data-timezone
// write the content back into the span tag
});
});
Je ne vais pas publier le code complet ici, car il existe de nombreux formateurs de temps JavaScript disponibles avec une simple recherche. Voici quelques solutions possibles
1 votes
Ver api.rubyonrails.org/classes/ActiveSupport/
0 votes
Je donnerais bien une réponse régulière avec des détails, mais je suis à court de temps. Le lien ci-dessus devrait cependant vous aider.
1 votes
@Ben : Je vois ce que vous avez fait là ;)