【问题标题】:Rails rufus scheduler intercepted an errorRails rufus 调度程序拦截了一个错误
【发布时间】:2016-01-06 04:54:37
【问题描述】:

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

【问题讨论】:

    标签: ruby-on-rails rufus-scheduler tzinfo


    【解决方案1】:

    您正尝试将 ActiveSupport::TimeZone 的时区标识符与 TZInfo 一起使用。但是,TZInfo 只能理解来自IANA Time Zone Database 的标识符。您看到的“无效标识符”错误表明它已经传递了它无法识别的东西。

    在幕后,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
    

    【讨论】:

      【解决方案2】:

      鉴于您的错误是“无效标识符”,我运行了您的代码的简化版本以确定哪个标识符无效:

      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

      【讨论】:

      • 对不起,我无法理解您的意思,请您详细说明
      • OH 我理解,但例如这是时区“国际日期变更线西”=>“太平洋/中途”我需要从这部分获取“国际日期变更线西仅不是来自太平洋的这部分/Midway 先生,您知道我该怎么做吗?
      • 已更新,“Etc/GMT+12”应该没问题。
      • 如果你仔细阅读我的所有回答,你就会明白我所说的“Etc/GMT+12”是什么意思。
      • 我明白你的意思,但我只需要国际日期变更线西,你说 tzinfo 不接受这个..所以任何想法如何做到这一点任何其他宝石或其他东西
      猜你喜欢
      • 2021-04-29
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      • 1970-01-01
      • 2012-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多