Ical改变了我在制作.ics文件时输入的时间

时间:2014-12-31 17:43:57

标签: ruby-on-rails icalendar datetime-format

我遇到以下问题。我正在使用icalendar gem(https://github.com/icalendar/icalendar)创建.ics日历文件。例如,我像这样写时间:

def make_ical(email)
  cal = Icalendar::Calendar.new
  cal.event do |e|
    e.dtstart = Icalendar::Values::Datetime.new('20141230T193400')
    e.dtend = Icalendar::Values::Datetime.new('20141230T213400')
    ..
  end
end

但是当它构建.ics文件时,它显示的时间与我输入的时间不同。我怀疑它将它转换为某种时区。我怎么能阻止它这样做呢?或者也许有一种方法可以改变初始时间,所以如果它必须转换,它会正确转换它。请帮忙。

calendar.ics档案:

BEGIN:VCALENDAR
VERSION:2.0
PRODID:icalendar-ruby
CALSCALE:GREGORIAN
BEGIN:VEVENT
DTSTAMP:20141231T173138Z
UID:...
DTSTART:20141011T081000
DTEND:20141012T081000
CLASS:PRIVATE
DESCRIPTION:Blah blah blah
SUMMARY:Secrets of Alchemy
BEGIN:VALARM
ACTION:EMAIL
TRIGGER:-P1D
DESCRIPTION:Event reminder
SUMMARY:Alarm notification
ATTENDEE:
ATTENDEE:
END:VALARM
END:VEVENT
END:VCALENDAR

不要注意结束时间,但在任何一个中,日期时间的时间部分都会发生变化。我想以某种方式显示正确的时间。

2 个答案:

答案 0 :(得分:1)

添加Gemfile: -

gem 'tzinfo'
gem 'tzinfo-data'

然后进行更改: -

require 'icalendar/tzinfo'
require 'tzinfo'

cal = Icalendar::Calendar.new

event_start = DateTime.new 2014, 12, 30, 19, 34, 00
event_end = DateTime.new 2014, 12, 30, 21, 34, 00

tzid = "America/Chicago"
tz = TZInfo::Timezone.get tzid
timezone = tz.ical_timezone event_start
cal.add_timezone timezone

cal.event do |e|
  e.dtstart = Icalendar::Values::DateTime.new event_start, 'tzid' => tzid
  e.dtend   = Icalendar::Values::DateTime.new event_end, 'tzid' => tzid
end

将此ics作为附件发送至电子邮件: -

attachments["schedule.ics"] = {:mime_type => 'text/calendar',
  :content => cal.to_ical}

注意: -

event_startevent_end应与tzid处于同一时区,然后它会自动将正确的时间转换为此ics文件打开的时区。

答案 1 :(得分:0)

application.rb我取消注释了行config.time_zone = 'My Time Zone'。 现在它有效。

参考本指南:http://www.elabs.se/blog/36-working-with-time-zones-in-ruby-on-rails