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
我基本上是通过时区获取每个国家/地区的时间,并存储在我的 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