2

私は基本的にタイムゾーンを介してすべての国の時間を取得し、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


[定数.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 .
4

2 に答える 2

0

あなたのエラーが「無効な識別子」であることを考えると、どの識別子が無効であるかを判断するために、この簡略化されたバージョンのコードを実行しました。

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

そして、「国際日付変更線西」の「無効な識別子」と表示されます。

プログラマーとして、エラー メッセージの読み方を学ばなければなりません。

解決策は、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

于 2016-01-06T05:27:13.900 に答える