首页 > 解决方案 > ActiveSupport TimeZone 不返回所有区域

问题描述

我有这样的问题。并非所有区域都返回:

ActiveSupport::TimeZone.all.sort_by {|t| t.name}.map { |tz|
  #symbol = tz.tzinfo.identifier.gsub(/[^_a-zA-Z0-9]/, '_').squeeze('_').upcase!
  
  tz.to_s #> (GMT+00:00) Edinburgh for example
}

我需要使用.to_s来获取 UTC (GMT+00:00)。有了以上London内容,缺少了,我假设其他人。这个效果很好:

ActiveSupport::TimeZone::MAPPING.sort_by {|k,v| k}.map { |k,v|
  #symbol = k.gsub(/[^_a-zA-Z0-9]/, '_').squeeze('_').upcase!
  
  k #> London London is included with this method
}

我不能使用这种方法,因为我不知道如何(GMT+00:00)进入(GMT+00:00) London

错误又回来了吗?如何获得第一个示例的所有区域显示?

编辑。

我正在使用GraphQL-ruby。我创建了一个枚举来返回时区列表:

# Taken from: https://gist.github.com/pedrocarmona/f41d25e631c1144045971c319f1c9e17
class Types::TimeZoneEnumType < Types::BaseEnum
  ActiveSupport::TimeZone.all.sort_by {|t| t.name}.map { |tz|
    symbol = tz.tzinfo.identifier.gsub(/[^_a-zA-Z0-9]/, '_').squeeze('_').upcase
    value("TZ_#{symbol}", tz.to_s)
  }
end

然后在里面query_type.rb

[..]

field :time_zones, Types::TimeZoneEnumType, null: false

[..]

接下来,在 graphiql 中,我进行查询:

query timeZones{
  __type(name: "TimeZoneEnum") {
    enumValues {
      name
      description
    }
  }
}

它返回类似的东西,除了伦敦:

[
  [..]

  {
    "name": "TZ_AMERICA_LA_PAZ",
    "description": "(GMT-04:00) La Paz"
  },
  {
    "name": "TZ_AMERICA_LIMA",
    "description": "(GMT-05:00) Lima"
  },
  {
    "name": "TZ_EUROPE_LISBON",
    "description": "(GMT+00:00) Lisbon"
  },
  {
    "name": "TZ_EUROPE_LJUBLJANA",
    "description": "(GMT+01:00) Ljubljana"
  },
  {
    "name": "TZ_EUROPE_MADRID",
    "description": "(GMT+01:00) Madrid"
  },
  
  [..]
]

Ljubljana我应该看到“伦敦”但它不在那里之后。

标签: ruby-on-railsrubygraphql-ruby

解决方案


如果我跑

ActiveSupport::TimeZone.all.sort_by {|t| t.name}.map { |tz| 
  [ tz.tzinfo.identifier.gsub(/[^_a-zA-Z0-9]/, '_').squeeze('_').upcase, tz.to_s ] 
}.sort

结果包括条目["EUROPE_LONDON", "(GMT+00:00) Edinburgh"], ["EUROPE_LONDON", "(GMT+00:00) London"],即EUROPE_LONDON重复。

我不知道 GraphQL 库是如何运行的,但我假设它正在对数据进行重复数据删除并返回单个条目EUROPE_LONDON(枚举通常是唯一的)。莫斯科是一样的——它有莫斯科和圣彼得堡的值——所以你可以通过查看结果来测试EUROPE_MOSCOW


推荐阅读