使用Google Calendar API处理Rails应用程序中的时区

时间:2018-08-02 14:26:11

标签: ruby-on-rails google-calendar-api

我正在构建一个应用程序,用户可以在该应用程序中在表单上输入数据,包括日期和时间,然后根据该信息在事件中填充Google日历。我似乎无法弄清楚如何处理时区,也不确定问题出在Ruby / Rails还是Google Calendar API,这两者的文档都...不是很好。

如果我在表单上输入10:00 AM,则会在6:00 AM创建Google日历邀请。我现在是UTC的-0400,这说明了这一点。理想情况下,我希望用户根本不必担心时区,但是如果我必须让用户从下拉菜单中选择时区,那不是世界末日。

这是我的表单(只要我有办法让用户输入时间和日期,就可以自由地对其进行任何修改):

Import nidaqmx
task=nidaqmx.Task()
task.ao_channels.add_ao_voltage_chan("Dev1/ao0")
task.write([5.0])
print task.read()

还有我的控制器:

<%= date_field(:calendar, "start_date", min: Date.today, :value => Time.now.strftime('%Y-%m-%d'), :class=>'form-control') %>


<input type="time" id="calendar_start_time" name="calendar[start_time]" min="9:00" max="18:00"  value="10:00" step="900" />

    <%= select("calendar", "time_zone", @timezones, {:class=>'form-control'}) %>

如您所见,我已经尝试在几个地方对时区进行硬编码以进行测试,但是它们似乎都不会对创建的事件产生任何影响-它们始终会偏移4个小时。我正在使用Rails 5.2

1 个答案:

答案 0 :(得分:2)

必须使用TimeZone设置DateTime:

lesson_hash.each do |days_from_start, lesson_name|
  lesson_datetime = ActiveSupport::TimeZone["America/New_York"].parse("#{start_date} #{start_time}").advance(:days => days_from_start)
  new_event(calendar_id, lesson_datetime, lesson_name, time_zone)
end

时间需要正确格式化。试试这个:

event = Google::Apis::CalendarV3::Event.new(
  start: Google::Apis::CalendarV3::EventDateTime.new(date_time: lesson_datetime.to_datetime.rfc3339),
  end: Google::Apis::CalendarV3::EventDateTime.new(date_time: lesson_datetime.advance(:hours => 1).to_datetime.rfc3339),
  summary: lesson_name
)
service.insert_event(calendar_id, event)