Часовой пояс Ruby on Rails хранит различные часовые пояса для атрибутов datetime - PullRequest
0 голосов
/ 27 октября 2018

У меня есть модель «Запрос», у которой есть общие атрибуты create_at и updated_at, но есть другие атрибуты datetime: insert_at и response_deadline. Моя проблема, в частности, связана с response_deadline, который иногда хранится с правильным часовым поясом, а иногда с другим (wtf ??), а в других случаях response_deadline с тем же часовым поясом дает правильное время даты, а другое - неправильное время даты.

Мой application.rb настроен с правильным часовым поясом:

config.time_zone = 'Brasilia'

и я уже пытался изменить часовой пояс по умолчанию AR:

config.active_record.default_timezone = :utc or :local

  • Другая проблема заключается в том, что если я поставлю :local, то проблема в response_deadline будет решена, но другие атрибуты даты и времени получатся неправильными.

  • Часовой пояс и дата на сервере тоже правильные.

Иногда response_deadline хранится так:

response_deadline: "2018-11-01 02:00:00" - НЕПРАВИЛЬНО

и тому подобное:

response_deadline: "2018-11-01 03:00:00" - ПРАВИЛЬНО

И странное поведение, два явно неправильных часовых пояса:

response_deadline: "2018-11-09 02:00:00" - НЕПРАВИЛЬНО

response_deadline: "2018-10-30 02:00:00" - ПРАВИЛЬНО?

но когда я бегу по рельсам c:

2.3.0 :002 > request1.response_deadline => Thu, 08 Nov 2018 23:00:00 -03 -03:00

2.3.0 :002 > request2.response_deadline => Tue, 30 Out 2018 00:00:00 -02 -02:00

  • Данные взяты из CSV-файла (загружен), а response_deadline имеет следующий формат:

29/10/2018 23:59:59

Фрагмент контроллера:

uploaded_file = params[:file]
unsaved = []
begin
  sheet = RubyXL::Parser.parse(uploaded_file.tempfile.path)
  dados = sheet[0]

  demandas = []
  (4...(dados.sheet_data.rows.size - 1)).each do |num|
    if !dados.sheet_data.rows[num][1].nil?

      request_type = RequestType.has_request_type? dados.sheet_data.rows[num][3].value,Request.sources[:ouv]

      demanda = {
        protocol: dados.sheet_data.rows[num][2].value,
        source_cd: Request.sources[:ouv],
        request_type_id: request_type,
        created_at: dados.sheet_data.rows[num][7].value,
        inserted_at: Time.now,
        response_deadline: dados.sheet_data.rows[num][8].value,
        requester_name: dados.sheet_data.rows[num][21].value.blank? ? "Anônimo" : dados.sheet_data.rows[num][21].value,
        hide_requester_information: nil,
        all_completed_information: false
      }
      demandas << demanda
    end
  end
  count = 0
  demandas.each_with_index do |demanda, index|
    request = Request.new(demanda)
    request.requester = Requester.where(name: "eouv").take
    if request.valid? && !request.request_type_id.nil?
      if request.save
     ...

Почему ?? Я действительно хочу понять, что происходит ... = /

  • Все атрибуты имеют дату и время, включая, конечно, :response_deadline.

Окружающая среда:

  • Это происходит только в производственной среде, БД - Oracle 12c, работает на RHEL 6.

  • Ruby 2.3.0 и Rails 4.2.1

Кто-то может помочь попытаться определить, что происходит?

ps: несколько дней назад этого не происходило.

...