Time.zone在API上起作用,但对工人不起作用

时间:2019-04-05 01:12:06

标签: ruby timezone grape grape-api

我正在使用Grape框架构建API,并且希望将整个应用的默认时区设置为UTC,以便在我调用Time.zone.now时得到正确的时间

我的config/application.rb如下:

$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'api'))
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'app'))
$LOAD_PATH.unshift(File.dirname(__FILE__))

require 'bundler/setup'

Bundler.require :default, ENV['RACK_ENV']

Time.zone = 'UTC'

require_rel '../app'
require_rel '../api'
require_rel '../lib'
require_rel 'initializers'

如果我通过bundle exec rackup -p 3000bin/console启动并致电Time.zone.now,我将得到适当的时间:Fri, 05 Apr 2019 00:47:23 UTC +00:00

尽管,当我使用Sidekiq工作程序或Rack本身之外的其他东西(bundle exec sidekiq -r ./config/application.rb)并尝试调用p Time.zone时,会返回nil,并且Time.current返回时间我的时区为2019-04-04 21:48:57 -0300 ,即使我需要包含application.rb语句的Time.zone = 'UTC'

我还如何在全球范围内为员工设置UTC时区?

编辑#1-工作人员代码

这是一个简单的工作程序:它仅打印Time.nowTime.zone.now

module Cron
  class Date
    include Sidekiq::Worker
    JOB_NAME = 'date_job'

    def perform(start_date = 1.day.ago, end_date = Time.current)
      p [Time.now, Time.current]
    end
  end
end

1 个答案:

答案 0 :(得分:0)

您只需引入ApplicationWorker并让所有其他工作程序都从该类继承。在这个新的父类中,您可以执行所有工人共同拥有的所有事情。

当你有两个这样的工人

class FooWorker
  include Sidekiq::Worker
  def perform
    # do something
  end
end

class BarWorker
  include Sidekiq::Worker
  def perform
    # do something else
  end
end

然后您可以像这样使用继承:

class ApplicationWorker
  include Sidekiq::Worker
  Time.zone = 'UTC'
end

class FooWorker < ApplicationWorker
  def perform
    # do something
  end
end

class BarWorker < ApplicationWorker
  def perform
    # do something else
  end
end