В моем приложении rails я пытаюсь преобразовать время в целое число, а затем преобразовать его обратно.Однако, когда я делаю это, он переключает часовые пояса и облажает меня.
Вот мой график запуска и остановки:
[8] pry(#<Campaign>)> random_schedule[0]
=> 2018-10-05 21:10:00 -0600
[9] pry(#<Campaign>)> random_schedule[1]
=> 2018-10-05 21:20:00 -0600
Теперь, что я пытаюсь сделатьвыбрать случайное время между этими временами.Я делаю это следующим образом:
start = random_schedule[0].to_i
stop = random_schedule[1].to_i
selected_time = rand(start..stop)
selected_schedule = Time.at(selected_time)
Тем не менее, это превращается в следующее:
[1] pry(#<Campaign>)> selected_schedule
=> 2018-10-05 22:16:17 -0500
, и теперь теперь он стоит в очереди на час раньше времени,хотя это должно произойти всего за несколько минут.
Что я здесь не так делаю?.zone
из selected_schedule
, random_schedule[0]
и random_schedule[1]
все отображаются как CDT
, но один -0500, а другой 0600, так что что-то явно не так.
РЕДАКТИРОВАТЬ
Итак, вот гораздо более глубокий вопрос, который я вижу.Если я загляну в модель, то увижу, что созданное / обновленное время использует CDT, а другие поля используют CST.Как это возможно?
=> #<campaign_schedule:0x00007fa8de3ea4e8
id: 8,
campaign_id: 8,
start_date: Fri, 05 Oct 2018,
start_time: Sat, 01 Jan 2000 22:05:00 CST -06:00,
stop_date: Fri, 05 Oct 2018,
stop_time: Sat, 01 Jan 2000 22:10:00 CST -06:00,
created_at: Fri, 05 Oct 2018 21:49:46 CDT -05:00,
updated_at: Fri, 05 Oct 2018 21:49:46 CDT -05:00>
Моя форма выглядит следующим образом:
<%= campaign_schedule.date_field :start_date, as: :date, value: campaign_schedule.object.try(:strftime,"%m/%d/%Y"), class: 'form-control' %>
, и когда она сохраняется, она сохраняется как CST, что на час отбрасывает вещи для меня.
Итак, в новой форме у меня есть это в контроллере, который строит кампанию:
# app/controllers/campaigns_controller.rb
# GET /campaigns/new
def new
@campaign = Campaign.new
@campaign.build_campaign_schedule.campaign_schedule_hours.build
end
и в форме кампании, вот как это выглядит:
<%= form_with(model: @campaign, local: true, html: {role: "form", id: "campaign_form"}) do |form| %>
<div class="modal-body">
<div class="tabs-container">
<ul class="nav nav-tabs">
<li class="active"><a data-toggle="tab" href="#basics"><i class="fas fa-cogs"></i> Basics</a></li>
<li class=""><a data-toggle="tab" href="#schedule"><i class="fas fa-calendar-alt"></i> Schedule</a></li>
</ul>
<div class="tab-content">
<div id="basics" class="tab-pane active">
<div class="panel-body">
<%= form.fields_for :campaign_schedule do |campaign_schedule| %>
<div class="form-group row">
<div class="col-sm-5">
<%= label_tag "What day and time should the campaign start?" %>
</div>
<div class="col-sm-3">
<%= campaign_schedule.date_field :start_date, as: :date, value: Time.now.strftime("%m/%d/%Y"), class: 'form-control' %>
</div>
<div class="col-sm-3">
<%= campaign_schedule.time_field :start_time, as: :time, value: Time.now.strftime( "%I:%M %p"), class: "form-control" %>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<% end %>
и при сохранении это действие сохранения в контроллере:
# POST /campaigns
# POST /campaigns.json
def create
@campaign = Campaign.new(campaign_params)
respond_to do |format|
if @campaign.save
review_campaign_schedule
format.html { redirect_back fallback_location: campaigns_path, notice: 'Campaign was successfully created.' }
format.json { render :show, status: :created, location: @campaign }
else
format.html { render :new }
format.json { render json: @campaign.errors, status: :unprocessable_entity }
end
end
end
Однако, когда я возвращаюсь и вызываю этот Campaign.start_date, это CST, а не CDT.Даже когда я делаю это прямо с консоли rails, он использует CST, а не CDT.Это что-то со строителем?Проверьте это:
[8] pry(#<CampaignsController>)> @campaign = Campaign.new
=> #<Campaign:0x00007fa8ef5bbab8 id: nil, name: nil, completed_date: nil, status: "Scheduled", created_at: nil, updated_at: nil>
[9] pry(#<CampaignsController>)> @campaign.build_campaign_schedule.campaign_schedule_hours.build
=> #<CampaignscheduleHour:0x00007fa8e6377be8 id: nil, campaign_schedule_id: nil, day: nil, start_hours: nil, stop_hours: nil, created_at: nil, updated_at: nil>
[11] pry(#<CampaignsController>)> @campaign.campaign_schedule
=> #<Campaignschedule:0x00007fa8ef5b07d0 id: nil, campaign_id: nil, start_date: nil, start_time: nil, stop_date: nil, stop_time: nil, created_at: nil, updated_at: nil>
[12] pry(#<CampaignsController>)> @campaign.campaign_schedule.start_time = "22:30"
=> "22:30"
[13] pry(#<CampaignsController>)> @campaign.campaign_schedule.start_time
=> Sat, 01 Jan 2000 22:30:00 CST -06:00