Rails rufus scheduler 拦截到一个错误

Rails rufus scheduler intercepted an error

我基本上是通过时区获取每个国家/地区的时间,并存储在我的 constant.rb 文件中。但它会引发错误。我正在使用 tzinfo gem 来获取时间。我不知道不知道如何解决这个错误


[my_task_scheduler.rb]

require 'rufus/scheduler'  
require "rubygems"
require "net/https"
require "uri"
require "json"
require 'tzinfo'


s = Rufus::Scheduler.new
s.every '1m' do 

    Tzone.each do |zone|    
        time = TZInfo::Timezone.get(zone)
         puts time.now.strftime("%I:%M %P")

    end 
end


[constant.rb]

Ctime = ["05:00"]

Tzone = [ "International Date Line West",
"Midway Island" ,
"American Samoa" ,
"Hawaii" ,
"Alaska" ,
"Pacific Time (US & Canada)" ,
"Tijuana" ]


我的错误是

{ 70091014224280 rufus-scheduler intercepted an error:
  70091014224280   job:
  70091014224280     Rufus::Scheduler::EveryJob "1m" {}
  70091014224280   error:
  70091014224280     70091014224280
  70091014224280     TZInfo::InvalidTimezoneIdentifier
  70091014224280     Invalid identifier
  70091014224280       /home/techbirds/.rvm/gems/ruby-2.2.1/gems/tzinfo-1.2.2/lib/tzinfo/zoneinfo_data_source.rb:208:in `load_timezone_info'
  70091014224280       /home/techbirds/.rvm/gems/ruby-2.2.1/gems/tzinfo-1.2.2/lib/tzinfo/timezone.rb:92:in `get'
  70091014224280       /home/techbirds/shivam/config/initializers/my_tasks_scheduler.rb:14:in `block (2 levels) in <top (required)>'
  70091014224280       /home/techbirds/shivam/config/initializers/my_tasks_scheduler.rb:13:in `each'
  70091014224280       /home/techbirds/shivam/config/initializers/my_tasks_scheduler.rb:13:in `block in <top (required)>'
  70091014224280       /home/techbirds/.rvm/gems/ruby-2.2.1/gems/rufus-scheduler-3.1.10/lib/rufus/scheduler/jobs.rb:234:in `call'
  70091014224280       /home/techbirds/.rvm/gems/ruby-2.2.1/gems/rufus-scheduler-3.1.10/lib/rufus/scheduler/jobs.rb:234:in `do_call'
  70091014224280       /home/techbirds/.rvm/gems/ruby-2.2.1/gems/rufus-scheduler-3.1.10/lib/rufus/scheduler/jobs.rb:258:in `do_trigger'
  70091014224280       /home/techbirds/.rvm/gems/ruby-2.2.1/gems/rufus-scheduler-3.1.10/lib/rufus/scheduler/jobs.rb:300:in `block (3 levels) in start_work_thread'
  70091014224280       /home/techbirds/.rvm/gems/ruby-2.2.1/gems/rufus-scheduler-3.1.10/lib/rufus/scheduler/jobs.rb:303:in `call'
  70091014224280       /home/techbirds/.rvm/gems/ruby-2.2.1/gems/rufus-scheduler-3.1.10/lib/rufus/scheduler/jobs.rb:303:in `block (2 levels) in start_work_thread'
  70091014224280       /home/techbirds/.rvm/gems/ruby-2.2.1/gems/rufus-scheduler-3.1.10/lib/rufus/scheduler/jobs.rb:289:in `loop'
  70091014224280       /home/techbirds/.rvm/gems/ruby-2.2.1/gems/rufus-scheduler-3.1.10/lib/rufus/scheduler/jobs.rb:289:in `block in start_work_thread'
  70091014224280   tz:
  70091014224280     ENV['TZ']: 
  70091014224280     Time.now: 2016-01-06 10:29:47 +0530
  70091014224280   scheduler:
  70091014224280     object_id: 46315140
  70091014224280     opts:
  70091014224280       {}
  70091014224280       frequency: 0.3
  70091014224280       scheduler_lock: #<Rufus::Scheduler::NullLock:0x00000004872158>
  70091014224280       trigger_lock: #<Rufus::Scheduler::NullLock:0x00000004872108>
  70091014224280     uptime: 60.072723042 (1m72)
  70091014224280     down?: false
  70091014224280     threads: 2
  70091014224280       thread: #<Thread:0x00000004872090>
  70091014224280       thread_key: rufus_scheduler_46315140
  70091014224280       work_threads: 1
  70091014224280         active: 1
  70091014224280         vacant: 0
  70091014224280         max_work_threads: 28
  70091014224280       mutexes: {}
  70091014224280     jobs: 1
  70091014224280       at_jobs: 0
  70091014224280       in_jobs: 0
  70091014224280       every_jobs: 1
  70091014224280       interval_jobs: 0
  70091014224280       cron_jobs: 0
  70091014224280     running_jobs: 1
  70091014224280     work_queue: 0
} 70091014224280 .

鉴于你的错误是 "Invalid identifier",我 运行 这个简化版本的代码来确定哪个标识符无效:

require 'tzinfo'

zones = [
  "International Date Line West",
  "Midway Island" ,
  "American Samoa" ,
  "Hawaii" ,
  "Alaska" ,
  "Pacific Time (US & Canada)" ,
  "Tijuana" ]

zones.each do |zone|
  p zone
  p TZInfo::Timezone.get(zone)
end

"International Date Line West""Invalid identifier"。

作为一名程序员,你必须学会​​阅读错误信息。

解决方案是使用 tzinfo 已知的时区名称 gem。

更新

require 'tzinfo'

p TZInfo::Timezone.get("International Date Line West")

结果

~/.gem/ruby/2.1.3/gems/tzinfo-1.2.2/lib/tzinfo/zoneinfo_data_source.rb:208:
  in `load_timezone_info': Invalid identifier (TZInfo::InvalidTimezoneIdentifier)
  from ~/.gem/ruby/2.1.3/gems/tzinfo-1.2.2/lib/tzinfo/timezone.rb:92:
  in `get'
  from t3.rb:4:in `<main>'

发生的事情只是 "tzinfo" gem 不知道任何名为 "International Date Line West" 的时区,它会引发您在尝试获取时看到的错误。

更新

这似乎有效:

require 'tzinfo'

p TZInfo::Timezone.get("Etc/GMT+12")

希望对您有所帮助。

IIRC,这是 tzinfo 应该理解的区域列表:https://github.com/jmettraux/rufus-scheduler/blob/be17a0bda680d06e5f435de3c644fee17c403965/lib/rufus/scheduler/zones.rb#L28

您正在尝试使用 ActiveSupport::TimeZone with TZInfo. However, TZInfo only understands identifiers from the IANA Time Zone Database 的时区标识符。您看到的 'invalid identifier' 错误表明它传递了它无法识别的内容。

在幕后,ActiveSupport::TimeZone 使用 TZInfo 执行转换。您可以在 ActiveSupport::TimeZone::MAPPING.

中看到从 ActiveSupport::TimeZone 标识符到 IANA 时区数据库标识符的映射

您可以切换到使用映射中的等效 IANA 时区数据库标识符:

require 'tzinfo'

Tzone = [
  "Pacific/Midway",      # International Date Line West
  "Pacific/Midway",      # Midway Island
  "Pacific/Pago_Pago",   # American Samoa
  "Pacific/Honolulu",    # Hawaii
  "America/Juneau",      # Alaska
  "America/Los_Angeles", # Pacific Time (US & Canada)
  "America/Tijuana"]     # Tijuana

Tzone.each do |zone|
  time = TZInfo::Timezone.get(zone)
  puts time.now.strftime("%I:%M %P")
end

您也可以继续使用现有的时区标识符并改用 ActiveSupport 来执行计算:

require 'active_support/all'

Tzone = [
  "International Date Line West",
  "Midway Island",
  "American Samoa",
  "Hawaii",
  "Alaska",
  "Pacific Time (US & Canada)",
  "Tijuana"]

Tzone.each do |zone|
  Time.use_zone(zone) do
    puts Time.zone.now.strftime("%I:%M %P")
  end
end