2016-01-06 3 views
2

Je cherchais essentiellement chaque pays à travers le fuseau horaire et stockais dans mon fichier constant.rb. Mais il lance une erreur. J'utilise tzinfo gem pour aller chercher le temps .Je ne sais pas comment résoudre cette erreurRails rufus scheduler a intercepté une erreur


[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" ] 


mon erreur est

{ 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 . 
+1

Alors rufus-scheduler a intercepté une erreur. Souhaitez-vous être assez aimable pour inclure le message d'erreur réel et complet afin que vous puissiez obtenir de l'aide? – jmettraux

+0

oui monsieur je suis y compris l'erreur –

+0

J'ai inclus l'erreur pouvez-vous s'il vous plaît dire où je fais mal –

Répondre

0

Vous essayez d'utiliser des identificateurs de fuseau horaire pour ActiveSupport::TimeZone avec tzinfo. Cependant, TZInfo ne comprend que les identifiants du IANA Time Zone Database. L'erreur 'identifiant invalide' que vous voyez indique qu'il a été passé quelque chose qu'il ne reconnaît pas.

En coulisses, ActiveSupport::TimeZone utilise TZInfo pour effectuer des conversions. Vous pouvez voir le mappage des identificateurs ActiveSupport::TimeZone vers les identificateurs de la base de données de fuseau horaire IANA au ActiveSupport::TimeZone::MAPPING.

Vous pouvez passer à l'aide des identifiants équivalents de base de données Time Zone IANA de la cartographie:

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 

Vous pouvez également continuer à utiliser vos identifiants de fuseau horaire existants et utiliser ActiveSupport pour effectuer au lieu vos calculs:

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 
0

Étant donné votre erreur est un "identifiant non valide", j'ai couru cette version simplifiée de votre code pour déterminer quel identifiant est invalide:

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 

Et il est écrit "Identifiant invalide" pour "International Date Line West".

En tant que programmeur, vous devez apprendre à lire les messages d'erreur.

La solution consisterait à utiliser un nom de fuseau horaire connu par la gemme tzinfo.

MISE À JOUR

require 'tzinfo' 

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

résultats dans

~/.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>' 

Ce qui se passe est tout simplement que le bijou "tzinfo" ne connaît pas de temps zone nommée "International Date Line West", et soulève l'erreur que vous voyez lorsque vous essayez de l'obtenir.

MISE À JOUR

Cela semble fonctionner:

require 'tzinfo' 

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

Hope it helps.

IIRC, voici une liste des zones tzinfo doivent comprendre: https://github.com/jmettraux/rufus-scheduler/blob/be17a0bda680d06e5f435de3c644fee17c403965/lib/rufus/scheduler/zones.rb#L28

+0

Désolé je ne suis pas capable de comprendre ce que vous essayez de dire pouvez-vous s'il vous plaît élaborer –

+0

Elaboré. Veuillez lire attentivement, il n'y a rien de spécial. – jmettraux

+0

OH que je comprends mais par exemple c'est le fuseau horaire "International Date Line West" => "Pacific/Midway" je dois chercher de cette partie "International Date Line West seulement pas de cette partie Pacific/Midway Avez-vous une idée? comment puis-je faire cela? –