1

J'ai une application qui utilise beaucoup de fuseaux horaires différents ... elle les place dans un contrôleur et ils changent en fonction de l'utilisateur. Toutes les heures sont stockées en UTC sans horodatage, etc.manutention des rails + postgres et des fuseaux horaires

Je crois savoir que c'est la manière normale pour Rails de gérer les fuseaux horaires. Cela fonctionne bien 99% du temps jusqu'à ce que je devrais faire quelque chose directement avec Postgres, puis le fuseau horaire devient un problème.

Par exemple, cette requête est complètement faux, sauf pour GMT, par exemple dans la zone Heure centrale, en fonction de l'heure fixée, il obtient le mauvais jour:

Events.where("EXTRACT(dow FROM start_at)", Date.today.wday) 

Là où je suis en train de trouver toutes les dates qui tombent un certain jour. J'essaie de faire quelque chose comme ça. Je n'ai pas besoin de chercher entre les fuseaux horaires (ils ne seront pas mélangés), mais j'ai besoin de spécifier le fuseau horaire si ce n'est pas UTC pour obtenir des résultats corrects.

User.events.where("EXTRACT(dow FROM start_at AT TIME ZONE ?) = ?", 'UTC', Date.today.wday) 

Mais je ne sais pas comment utiliser Time.zone pour me donner quelque chose qui fonctionnera avec TIME ZONE dans Postgres.

Time.zone.tzinfo travaille parfois ... Postgres travaillera avec « Europe/Varsovie », mais Rails retours Europe - Varsovie '

En général, je ne suis pas beaucoup de chance avec les fuseaux horaires, les pointeurs serait être apprécié.

Répondre

3

Peut-être que quelqu'un d'autre une meilleure solution globale, mais ce que vous avez besoin pour la requête particulière est

Time.zone.tzinfo.identifier 

Ou, dans votre exemple:

User.events.where("EXTRACT(dow FROM start_at AT TIME ZONE ?) = ?", Time.zone.tzinfo.identifier, Date.today.wday) 
1

Essayez d'utiliser la gemme Ruby TZInfo directement, au lieu d'utiliser Rails ActiveSupport::TimeZone. Vous pouvez également utiliser la constante MAPPING, comme indiqué dans la documentation ActiveSupport::TimeZone, qui vous ramènera d'une clé de fuseau horaire Rails à l'identifiant de fuseau horaire IANA standard utilisé par Postgres et autres.

0

Comme Matt Johnson a suggéré d'utiliser directement la gemme TZInfo. De cette façon, vous pouvez obtenir les identifiants de fuseau horaire correctement formatés dont vous avez besoin d'interroger avec PostgreSQL.

Par exemple, si vous utilisez:

TZInfo::Timezone.all_country_zone_identifiers 

Cela retourne un tableau d'identificateurs de fuseau horaire correct IANA/Olson. En d'autres termes, vous obtiendrez le bon «Europe/Varsovie» et non «Europe - Varsovie».

Questions connexes