Time.zone适用于API,但不适用于工作人员

问题描述 投票:0回答:1

我正在使用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
ruby timezone grape grape-api
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.