根据国家名称转换时区 rails 4

Posted

技术标签:

【中文标题】根据国家名称转换时区 rails 4【英文标题】:convert timezone according to country name rails 4 【发布时间】:2015-11-10 05:37:02 【问题描述】:

在我的 rails 4.0 应用程序中,我有“on the go Journeys”模块,用户可以在其中保存他的旅程,同时从世界任何地方签入或签出。现在,假设我的朋友在伦敦的一家酒店登记入住,他的入住时间根据伦敦时区是上午 8:00,同时根据印度时区,印度的时间是上午 10:00。现在,假设我在上午 10:00 从印度登录我的应用程序,那么我应该收到消息说“你的朋友刚刚在伦敦登记入住,上午 10:00 的酒店 xyz”,即时区应该根据印度时区。 目前我可以借助 IP 地址获取用户的国名,然后我想根据该国名转换时区。我该怎么做?

我已使用此链接获取国家/地区名称 Getting a user country name from originating IP address with Ruby on Rails

【问题讨论】:

【参考方案1】:

您需要国家代码才能与 TZInfo 库中的 Country 类一起使用,默认情况下应该在 rails 中可用,我想知道您将如何处理具有多个时区的国家/地区,例如俄罗斯、美国、加拿大。无论如何,对于一个小国来说:

2.2.1 :001 > c = TZInfo::Country.get('MD')
 => #<TZInfo::Country: MD> 
2.2.1 :002 > c.zone_identifiers
 => ["Europe/Chisinau"] 
2.2.1 :003 > c.zones
 => [#<TZInfo::TimezoneProxy: Europe/Chisinau>] 
2.2.1 :004 > c = TZInfo::Country.get('US')

对于更大的:

2.2.1 :004 > c = TZInfo::Country.get('US')
 => #<TZInfo::Country: US> 
2.2.1 :005 > c.zone_identifiers
 => ["America/New_York", "America/Detroit", "America/Kentucky/Louisville", "America/Kentucky/Monticello", "America/Indiana/Indianapolis", "America/Indiana/Vincennes", "America/Indiana/Winamac", "America/Indiana/Marengo", "America/Indiana/Petersburg", "America/Indiana/Vevay", "America/Chicago", "America/Indiana/Tell_City", "America/Indiana/Knox", "America/Menominee", "America/North_Dakota/Center", "America/North_Dakota/New_Salem", "America/North_Dakota/Beulah", "America/Denver", "America/Boise", "America/Phoenix", "America/Los_Angeles", "America/Metlakatla", "America/Anchorage", "America/Juneau", "America/Sitka", "America/Yakutat", "America/Nome", "America/Adak", "Pacific/Honolulu"] 
2.2.1 :006 > c.zones
 => [#<TZInfo::TimezoneProxy: America/New_York>, #<TZInfo::TimezoneProxy: America/Detroit>, #<TZInfo::TimezoneProxy: America/Kentucky/Louisville>, #<TZInfo::TimezoneProxy: America/Kentucky/Monticello>, #<TZInfo::TimezoneProxy: America/Indiana/Indianapolis>, #<TZInfo::TimezoneProxy: America/Indiana/Vincennes>, #<TZInfo::TimezoneProxy: America/Indiana/Winamac>, #<TZInfo::TimezoneProxy: America/Indiana/Marengo>, #<TZInfo::TimezoneProxy: America/Indiana/Petersburg>, #<TZInfo::TimezoneProxy: America/Indiana/Vevay>, #<TZInfo::TimezoneProxy: America/Chicago>, #<TZInfo::TimezoneProxy: America/Indiana/Tell_City>, #<TZInfo::TimezoneProxy: America/Indiana/Knox>, #<TZInfo::TimezoneProxy: America/Menominee>, #<TZInfo::TimezoneProxy: America/North_Dakota/Center>, #<TZInfo::TimezoneProxy: America/North_Dakota/New_Salem>, #<TZInfo::TimezoneProxy: America/North_Dakota/Beulah>, #<TZInfo::TimezoneProxy: America/Denver>, #<TZInfo::TimezoneProxy: America/Boise>, #<TZInfo::TimezoneProxy: America/Phoenix>, #<TZInfo::TimezoneProxy: America/Los_Angeles>, #<TZInfo::TimezoneProxy: America/Metlakatla>, #<TZInfo::TimezoneProxy: America/Anchorage>, #<TZInfo::TimezoneProxy: America/Juneau>, #<TZInfo::TimezoneProxy: America/Sitka>, #<TZInfo::TimezoneProxy: America/Yakutat>, #<TZInfo::TimezoneProxy: America/Nome>, #<TZInfo::TimezoneProxy: America/Adak>, #<TZInfo::TimezoneProxy: Pacific/Honolulu>] 

【讨论】:

对于有多个时区的国家,我会简单地使用 c.zone_identifiers.first 那么,看起来这就是您要找的东西。 ;)

以上是关于根据国家名称转换时区 rails 4的主要内容,如果未能解决你的问题,请参考以下文章

在转换为UTC 0时区之前,Rails在哪里获得时区?

来自时间戳和国家/地区的 pyspark 时区转换

如何根据 bigquery 中的时区列将 UTC 时间转换为本地时区?

使用 joda time 将一个时区转换为另一个时区

Rails 和 Postgres:迁移到 change_colomn 时出现错误“无法强制转换为没有时区的时间戳”

如何将表单(国家/城市)中的字符串时区转换为 datetime.tzinfo