Ruby将时间转换为整数,然后返回。持续增加一个小时

时间:2018-10-06 02:11:57

标签: ruby-on-rails date time

在我的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

因此,尽管它应该在几分钟之内发生,但现在它会继续提前一个小时进行排队。

我在这里做错了什么? .zoneselected_schedulerandom_schedule[0]的{​​{1}}均显示为random_schedule[1],但一个为-0500,另一个为0600,因此显然有些问题。

编辑

所以这是我所看到的更深层次的问题。如果查看模型,可以看到创建/更新的时间使用CDT,而其他字段使用CST。这怎么可能?

CDT

我的表单如下:

=> #<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>

保存时,它另存为CST,对我来说要花一个小时的时间。

因此,在新表格上,我将其放置在控制器中,该控制器用于构建广告系列:

<%= campaign_schedule.date_field :start_date, as: :date, value: campaign_schedule.object.try(:strftime,"%m/%d/%Y"), class: 'form-control' %>

和广告系列表单上的内容如下:

  # 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 %>

但是,当我回叫该Campaign.start_date时,它是CST,而不是CDT。即使我直接从Rails控制台执行操作,也使用的是CST,而不是CDT。建造者有事吗?检查一下:

  # 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

1 个答案:

答案 0 :(得分:0)

似乎您从random_schedule开始的初始时间未考虑夏令时偏移量(DST)。您可以使用random_schedule[0].dst?

对其进行测试

当前CDT时区的正确偏移量是-0500,DST已启用:

https://www.timeanddate.com/time/zones/cdt

因此,当使用Time.at(selected_time)命令将时间转换回原来的时间时,它将转换为规范形式。